2013-02-13 62 views
0

我正在創建一個平臺遊戲。但是,在平臺上創建碰撞邊界後,我遇到了一個錯誤,以便讓玩家在平臺上跳躍而不下降。TypeError:錯誤#1009:無法訪問空引用的屬性或方法

我創建一個矩形框,我出口它作爲platForm

下面是錯誤的輸出: 誤差保持一遍又一遍重演....

TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at Boy/BoyMove() 

主類:

package 
{ 
import flash.display.*; 
import flash.text.*; 
import flash.events.*; 
import flash.utils.Timer; 
import flash.text.*; 

public class experimentingMain extends MovieClip 
{ 
    var count:Number = 0; 
    var myTimer:Timer = new Timer(10,count); 

    var classBoy:Boy; 



    //var activateGravity:gravity = new gravity(); 

    var leftKey, rightKey, spaceKey, stopAnimation:Boolean; 

    public function experimentingMain() 
    { 
     myTimer.addEventListener(TimerEvent.TIMER, scoreUp); 
     myTimer.start(); 



     classBoy = new Boy(); 
     addChild(classBoy); 

     stage.addEventListener(KeyboardEvent.KEY_DOWN, pressTheDamnKey); 
     stage.addEventListener(KeyboardEvent.KEY_UP, liftTheDamnKey); 
    } 

    public function pressTheDamnKey(event:KeyboardEvent):void 
    { 
     if (event.keyCode == 37) 
     { 
      leftKey = true; 
      stopAnimation = false; 
     } 

     if (event.keyCode == 39) 
     { 
      rightKey = true; 
      stopAnimation = false; 
     } 

     if (event.keyCode == 32) 
     { 
      spaceKey = true; 
      stopAnimation = true; 
     } 
    } 

    public function liftTheDamnKey(event:KeyboardEvent):void 
    { 
     if (event.keyCode == 37) 
     { 
      leftKey = false; 
      stopAnimation = true; 
     } 

     if (event.keyCode == 39) 
     { 
      rightKey = false; 
      stopAnimation = true; 
     } 

     if (event.keyCode == 32) 
     { 
      spaceKey = false; 
      stopAnimation = true; 
     } 
    } 

    public function scoreUp(event:TimerEvent):void 
    { 
     scoreSystem.text = String("Score : "+myTimer.currentCount); 
    } 

} 
    } 

男孩類:

package 
{ 
import flash.display.*; 
import flash.events.*; 

public class Boy extends MovieClip 
{ 
    var leftKeyDown:Boolean = false; 
    var upKeyDown:Boolean = false; 
    var rightKeyDown:Boolean = false; 
    var downKeyDown:Boolean = false; 
    //the main character's speed 
    var mainSpeed:Number = 15; 
    //whether or not the main guy is jumping 
    //var mainJumping:Boolean = false; 
    var mainJumping:Boolean = false; 
    //how quickly should the jump start off 
    var jumpSpeedLimit:int = 40; 
    //the current speed of the jump; 
    var jumpSpeed:Number = 0; 
    var gravity:Number = 10; 

    var theGround:ground = new ground(); 


    //var theCharacter:MovieClip; 

    public var currentX,currentY:int; 

    public function Boy() 
    { 
     this.x = 600; 
     this.y = 540; 

     addEventListener(Event.ENTER_FRAME, BoyMove); 
    } 

    public function BoyMove(event:Event):void 
    { 
     currentX = this.x; 
     currentY = this.y; 

     if (MovieClip(parent).leftKey) 
     { 
      currentX -= mainSpeed; 
      MovieClip(this).scaleX = 1; 
     } 

     if (MovieClip(parent).rightKey) 
     { 
      currentX += mainSpeed; 
      MovieClip(this).scaleX = -1; 
     } 


     if (MovieClip(parent).spaceKey || mainJumping) 
     { 
      mainJump(); 
     } 

     this.x = currentX; 
     this.y = currentY; 
    } 

    public function mainJump():void 
    { 
     currentY = this.y; 


     if (! mainJumping) 
     { 

      mainJumping = true; 
      jumpSpeed = jumpSpeedLimit * -1; 
      currentY += jumpSpeed; 
     } 
     else 
     { 
      if (jumpSpeed < 0) 
      { 
       jumpSpeed *= 1 - jumpSpeedLimit/250; 
       if (jumpSpeed > -jumpSpeedLimit/12) 
       { 
        jumpSpeed *= -2; 
       } 
      } 
     } 
     if (jumpSpeed > 0 && jumpSpeed <= jumpSpeedLimit) 
     { 
      jumpSpeed *= 1 + jumpSpeedLimit/120; 
     } 
     currentY += jumpSpeed; 

     if (MovieClip(this).y > 500) 
     { 
      mainJumping = false; 
      MovieClip(this).y = 500; 
     } 



     this.y = currentY; 
    } 
} 
    } 

平臺遊戲類:這是我想設置邊界爲矩形的類(平臺)

package 
{ 
import flash.events.*; 
import flash.display.MovieClip; 

public class platForm extends MovieClip 
{ 
    var level:Array = new Array(); 
    var classBoys:Boy = new Boy(); 
    var speedx:int = MovieClip(classBoys).currentX; 

    public function platForm() 
    { 

     for (var i = 0; i < numChildren; i++) 
     { 
      if (getChildAt(i) is platForm) 
      { 
       level.push(getChildAt(i).getRect(this)); 
      } 
     } 

     for (i = 0; i < level.length; i++) 
     { 
      if (MovieClip(classBoys).getRect(this).intersects(level[i])) 
      { 
       if (speedx > 0) 
       { 
        MovieClip(classBoys).x = level[i].left - MovieClip(classBoys).width/2; 
       } 
       if (speedx < 0) 
       { 
        MovieClip(classBoys).x = level[i].right - MovieClip(classBoys).width/2; 
       } 
      } 
     } 
    } 
} 
} 

回答

0

這是一個有點困難,看看到底發生了什麼,而不能運行代碼,但錯誤是說你的BoyMove()方法內的某個東西正在試圖引用一個null值的屬性(或方法)。看過BoyMove()方法後,我可以看到沒有太多可能導致此問題的情況。其他兩位候選人將

MovieClip(parent) 

MovieClip(this) 

您試圖訪問這兩個影片剪輯的性能。其中一個不能像你期望的那樣初始化。我建議你對該方法做一些基本的調試,方法是使用MovieClip(父級)註釋行並查看是否仍然出現錯誤。然後嘗試與MovieClip(this)一致。這應該足以隔離問題。

+0

罪魁禍首是MoveClip(父母)。但是,如果沒有MovieClip(父級),我角色的控件將無法使用。 – Minelava 2013-02-13 16:30:18

+0

使用MovieClip(父級)意味着您正在對類型MovieClip執行「父級」的類型轉換,對嗎?我相信,如果劇組失敗,出於某種原因,它將返回null。班級男孩的父母是什麼? – Nathan 2013-02-13 16:42:33

+0

實際上,使用'MovieClip(parent)'投射不會在投射失敗時返回null - 這將拋出不同的異常。使用'as'進行投射會返回null:'作爲MovieClip的父代'。所以也許'父母'是空的。 – 2013-02-13 16:45:29

相關問題