AS3 - 从另一个类访问对象

时间:2012-08-15 07:26:55

标签: actionscript-3 reference null typeerror

我有三个课程:主要课程,播放器课程和汽车课程。

主要创建一个汽车和一个玩家。 汽车需要追踪玩家的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。 非常感谢............

2 个答案:

答案 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。