AS3 - 从另一个类访问对象

问题描述:

我有三个类:Main,Player和Car。AS3 - 从另一个类访问对象

主要创建一个汽车和一个球员。汽车需要追踪玩家的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); 

    } 
} 

}

但是这将导致一个错误: 类型错误:错误#1009:无法访问属性或空对象引用的方法。 在播放器() 在主/的createPlayer() 在main()的

我想知道这是为什么给我一个错误和什么其他好的方法来做到这一点?

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

首先:这不是一个正确的方法来编程!你不应该在任何地方使用静态属性。其次:你的_player实例是在你为_car实例指定new Car()之前创建的,这就是为什么它仍然为空。尝试更改他们的行,以便您有:

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

再次,这将解决您的问题,但您的编码是不正确的。如果你想引用你的_car对象,在Player类的构造函数中传递它。

P.S.不要忘了标记这篇文章作为答案,如果它帮助你。

编辑:

下面是一些代码,让你开始:

在您的播放器类添加私有财产,用于存储你的车对象的引用。然后添加您的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); 

如果你不需要你的车对象的引用在主类,或者不如说,如果汽车被分配到一个球员,让每个玩家将有它的自己的车,你最好在你的播放器类中定义的属性,像这样:

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对象可以从您可以访问主类是这样的:

_player = new Player(); 
trace(_player.car.x); 

我会建议您阅读OOP(面向对象编程)的基本概念,例如Encapsulation,Inheritance和Polymorphism。在谷歌搜索一些好书,这将帮助你站起来。

+0

非常感谢,它正在工作。至于静态标识符,我在一篇文章中读到它,并试图在尝试其他任何东西之前完成这项工作。如果你可以详细说明如何使用构造函数,那会很有帮助 – efa 2012-08-15 08:34:32

+0

请阅读编辑。它现在应该会帮助你。 – Gio 2012-08-15 08:57:45

我看不到Main对象Player类,也看不到一个hero对象Main。所以,Main._hero.x是NULL。