提供了#3#1009错误代码。 "空对象引用"

时间:2015-04-14 14:49:54

标签: actionscript-3

嗨我对as3(今年)比较新,我收到了这个错误

  

typer error#1009无法访问null对象的属性或方法   参考。在FoodObject / collisionTest()

我希望有人可以提供帮助

package {
import flash.events.MouseEvent;
import flash.events.KeyboardEvent;
import flash.events.*
    import flash.utils.*
    import flash.display.Stage;

public class GameScene1 extends Scene {

    //public variables
    //character & scenery
    public var mainChar: Character;
    public var testFood: FoodObject;




    //constructor is used to create all necessary objects for this scene and display them
    public function GameScene1(gm_: Manager) {

        //constructor

        super(gm_);
        trace("GameScene 1 constructor");


        //character
        mainChar = new Character;
        addChild(mainChar);
        mainChar.x = 200;
        mainChar.y = 200;


        testFood = new FoodObject;
        addChild(testFood)
        testFood.x = 50
        testFood.y = 200

食物对象类在这里。

package  {
import GameScene1
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;


public class FoodObject extends MovieClip {
    public var Game1:GameScene1;

    public function FoodObject() {
         //constructor code
        this.addEventListener(Event.ENTER_FRAME, collisionTest)
    }

    public function collisionTest(e:Event)
    {
        if (this.hitTestObject(Game1.mainChar))
        {
            trace("it works")
        }
    }

}

}

游戏经理在这里:     包{

import flash.display.MovieClip;


public class Manager extends MovieClip {

    //stores which scene is currently loaded
    public var curScene:Scene=null;

    public function Manager() {
        //constructor
        trace("Manager Construct")
        GoToScene("menu");
    }


    public function GoToScene(name:String)
    {
        if (curScene) //there was a scene already
        {
        curScene.OnLeaveScene(); //call its OnLeaveScene function to remove all objects
        removeChild(curScene);
        }

        if(name=="menu") curScene = new MenuScene(this);
        if(name=="select") curScene = new SelectScene(this);
        if(name=="game1") curScene = new GameScene1(this);
        if(name=="game2") curScene = new GameScene2(this);
        if(name=="game3") curScene = new GameScene3(this);
        if(name=="credit") curScene = new CreditScene(this);

        addChild(curScene);
    }


}

2 个答案:

答案 0 :(得分:2)

您的问题是您的课程问题不是分开的:

你的Scene知道CharacterFood对象,你在那里实例化这两个类,没有错。

当您尝试在Food对象中执行某些操作时,问题就开始了,这需要了解角色。问题是:Food对象对Character一无所知。

您只需将Character的引用传递给Food对象即可解决此问题。为此,请修改构造函数,如下所示:

private var character:Character;
public function FoodObject(character:Character) {
     //constructor code
    this.addEventListener(Event.ENTER_FRAME, collisionTest)
    this.character = character;
}

Scene中所述构造函数的用法更改如下:

testFood = new FoodObject(mainCharacter);

通过这种方式,Food知道角色,可以用它来做任务,例如做碰撞测试:

   public function collisionTest(e:Event)
    {
        if (this.hitTestObject(character)) // ==== this line changed
        {
            trace("it works")
        }
    }

然而,这引发了一个重要问题:为什么Food应该知道Character

果然,您想要进行碰撞测试,需要两个对象。 但是你为什么要在Food对象中做到这一点?

Food中执行碰撞检查非常麻烦,因为您必须将引用传递给Character以便在那里执行。

这样做的首选方式执行碰撞检查,其中参与检查的两个对象都已知道。 在您的情况下,这是Scene

考虑在Scene进行检查是多么容易:

testFood.hitTestObject(mainCharacter);

这很简单,因为你需要的一切都已存在。


回顾一下:

  • 碰撞检查需要了解您想要的2个对象 检查。
  • 要检查其中任何一个,您必须传递参考 另一个。 (CharacterFood,如上所示或其他方式 轮)
  • 在已经知道的某个地方进行检查要容易得多 这两个对象,因为不必传递任何引用。

原始代码失败,因为Game1中的FoodObject永远不会分配值,因此仍为null。 在null上调用方法会导致您遇到的错误。

答案 1 :(得分:0)

您忘记使用new关键字获取GameScene1类的实例。

public var Game1:GameScene1;

public function FoodObject() {
     //constructor code
     var _manager:Manager = new Manager();
     Game1 = new GameScene1(_manager)
    this.addEventListener(Event.ENTER_FRAME, collisionTest);
}

public function collisionTest(e:Event):void{
    ....
}