嗨我对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);
}
}
答案 0 :(得分:2)
您的问题是您的课程问题不是分开的:
你的Scene
知道Character
和Food
对象,你在那里实例化这两个类,没有错。
当您尝试在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);
这很简单,因为你需要的一切都已存在。
回顾一下:
Character
到Food
,如上所示或其他方式
轮)原始代码失败,因为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{
....
}