我有三个课程:主要课程,播放器课程和汽车课程。
主要创建一个汽车和一个玩家。 汽车需要追踪玩家的x位置。 但是下面的代码不起作用。我已经研究过并发现将它声明为静态应该可以解决问题,尽管它不是最好的方法吗?
主:
package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
public class Main extends MovieClip
{
public static var _player:Player;
public static var _car:Car;
public function Main()
{
createPlayer();
}
public function createPlayer():void
{
_player= new Player();
_car = new Car();
_player.x = stage.stageWidth / 2;
_player.y = stage.stageHeight / 2;
stage.addChild(_player);
stage.addChild(_car);
}
}
}
汽车:
package {
import flash.display.MovieClip;
import Main;
public class Player extends MovieClip
{
public function Player()
{
trace(Main._car.x);
}
}
}
但是这会导致错误: TypeError:错误#1009:无法访问空对象引用的属性或方法。 在玩家() 在Main / createPlayer() 在Main()
我想知道为什么这会给我一个错误,有什么其他好方法可以做到这一点?
//编辑:抱歉_hero是我的错,实际上是_car。 非常感谢............
答案 0 :(得分:1)
首先:这不是一个正确的计划方式!您不应该在任何地方使用静态属性。
其次:在将new Car()
分配给_car实例之前创建了您的_player实例,这就是为什么它仍然为null。尝试更改他们的行,以便您拥有:
_car = new Car();
_player = new Player();
同样,这将解决您的问题,但您的编码不是正确的方法。如果要引用_car对象,请在Player类的构造函数中传递它。
P.S。如果有帮助,请不要忘记将此帖标记为答案。
编辑:
以下是一些可以帮助您入门的代码:
在您的Player类中添加一个私有属性,用于在Car对象上存储引用。然后为Player的构造函数添加一个参数,您将在创建新Player时传递该参数。请注意,仅当您要在Main类中存储对Car对象的引用时才使用它。
package {
import flash.display.MovieClip;
import Main;
public class Player extends MovieClip
{
private var _car:Car; // add a property to store a reference to the Car object
public function Player(car:Car) //add a parameter to your Player constructor to pass in a Car object
{
_car = car; //assign passed Car object to your property _car
trace(_car.x) //now you can use _car as you wish
}
}
}
定义Player对象时,您现在需要将Car对象传递给它的构造函数。所以这样做:
_player = new Player(_car);
如果你不需要在Main类中引用你的Car对象,或者更好地说一个Car是否被分配给一个Player,那么每个玩家都拥有它自己的Car,你最好定义一个属性在你的玩家类中,如下所示:
package {
import flash.display.MovieClip;
import Main;
public class Player extends MovieClip
{
public var car:Car; // add a property to store a reference to the Car object, note that now we made the car a public property, so that it can be accessed from outside.
public function Player() //add a parameter to your Player constructor to pass in a Car object
{
car = new Car(); // initialize your variable
trace(car.x) //now you can use car as you wish from this class
}
}
}
另请注意,我们在Player类中初始化的Car对象可以从您的Main类访问,如下所示:
_player = new Player();
trace(_player.car.x);
我建议你阅读OOP(面向对象编程)的基本概念,例如封装,继承和多态。在谷歌搜索一些可以帮助你站起来的好书。
答案 1 :(得分:0)
我在Main
课程中看不到Player
个对象,我也无法在hero
中看到Main
个对象。因此,Main._hero.x
为NULL。