2013-02-13 75 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

相关问题