0

我有三个班级:Main、Player 和 Car。

主程序创建了一个 Car 和一个 Player。Car 需要追踪玩家的 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:无法访问空对象引用的属性或方法。在 Player() 在 Main/createPlayer() 在 Main()

我想知道为什么这给了我一个错误,还有什么其他的好方法可以做到这一点?

//编辑:对不起 _hero 是我的错误,它实际上是 _car。非常感谢您...........

4

2 回答 2

1

首先:这不是正确的编程方式!您不应该在任何地方都使用静态属性。其次:您的 _player 实例是在您分配new Car()给您的 _car 实例之前创建的,这就是它仍然为空的原因。尝试更改他们的线路,以便您拥有:

_car = new Car();
_player = new Player();

同样,这将解决您的问题,但您的编码方式不正确。如果您想引用您的 _car 对象,请将其传递给 Player 类的构造函数。

PS如果对您有帮助,请不要忘记将此帖子标记为答案。

编辑:

以下是一些帮助您入门的代码:

在您的 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,以便每个 Player 都有自己的 Car,则最好在 Player 中定义一个属性类,像这样:

 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(面向对象编程)的基本概念,例如封装、继承和多态。在谷歌上搜索一些可以帮助你站起来的好书。

于 2012-08-15T08:18:52.767 回答
0

我在类中看不到Main对象,Player我也看不到. 所以,是NULL。heroMainMain._hero.x

于 2012-08-15T07:29:56.627 回答