TypeError:错误#1009:无法访问空引用的属性或方法

时间:2013-02-13 16:06:21

标签: actionscript-3 oop class methods typeerror

我正在创造一个平台游戏。但是,在平台上创建碰撞边界后,我遇到了一个错误,使玩家在平台上跳跃而不会掉线。

我创建了一个矩形框,然后将其导出为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;
    }
}
    }

Platformer类:这是我想要设置矩形边界的类(platForm)

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;
                }
            }
        }
    }
}
 }

1 个答案:

答案 0 :(得分:0)

在没有能够运行代码的情况下确切地看到发生了什么有点困难,但错误是说BoyMove()方法中的某些东西试图引用null的属性(或方法)。看了BoyMove()方法后,我发现那里没有太多可能导致这个问题。其他两位候选人将是

MovieClip(parent)

MovieClip(this)

您正在尝试访问这两个MovieClip的属性。其中一个不能按预期初始化。我建议您通过使用MovieClip(parent)注释掉行来对该方法进行一些基本调试,看看是否仍然出现错误。然后尝试使用MovieClip(this)的行。这足以解决问题。