AS3.0:从第二个类访问已创建实例的属性

时间:2011-06-07 13:40:31

标签: actionscript-3 class object methods instances

我正在建造一个小游戏。

在我的文档类中,我使用以下代码创建了类CharacterLevel的实例:

//add the Level
level = new TileGrid();
level.y = 100;
level.x = 400;
addChild(player);

//add our player
player = new Character();
player.y = 150;
player.x = 400;
addChild(player);

我还创建了一个处理用户输入的控制器类。 (例如,检查玩家是否能够向右移动。)

我还为keyboardevents和stuff创建了eventlisteners。

当按下某个键时,我想通过从控制器类中调用TileGrid类的checkTile(tileNumber)函数来检查是否可以进行移动。

控制器类如下所示:

package  {
    import flash.events.KeyboardEvent;
    import flash.events.Event;

    public class Controller{

    //Constructor code
    public function Controller(){}

    //Keyboard pressed -> move character
    public function keyPressed(evt:KeyboardEvent):void
    {
        trace(level.checkTile(30));
    }
}

TileGrid类看起来像这样:

package  {
    import flash.events.KeyboardEvent;
    import flash.events.Event;

    public class TileGrid{

    //Constructor code
    public function TileGrid(){
        //Creating all the tiles and adding them to the stage.
    }

    //Check if a certain tile is walkable
    public function checkTile(tileNumberType){
        if(tileNumberType > 15){
            return false;
        }else{
           return true;
        }
    }
}

但是当我测试这个时,我得到以下错误: Line 81 1120: Access of undefined property level.

当我尝试:trace(Object(parent).level.checkTile(30));时,我得到:1120: Access of undefined property parent.

如何使用第二个类中的实例从一个类访问方法?

2 个答案:

答案 0 :(得分:2)

我认为你必须做这样的事情:

...
// somewhere in your document class (or somewhere else)
var player:Character = new Character();
var level:TileGrid = new TileGrid();
var controller:Controller = new Controller(player, level);
...

// in your Controller class

private var level:TileGrid;
private var player:Character;

public Controller(player:Character, level:TileGrid) {
    this.player = player;
    this.level = level;
}

public function keyPressed(event:KeyboardEvent):void {
    level.checkTile(30); // in this line "level" means "this.level"
}

在这种情况下,您必须说出哪个玩家以及控制器必须控制的级别。控制器是一个不了解任何其他类的类。变量不是全局变量(在您的示例中,它们不应该是),因此您无法从任何地方访问它们。

答案 1 :(得分:0)

AS中的类无法访问其上下文。这意味着,如果我有:

function foo():void
{
    var k:MyCustomClass = new MyCustomClass();
    var j:MyOtherClass  = new MyOtherClass();
}

两个实例j和k彼此不了解。

但是,在这种特殊情况下,由于您正在处理父结构,因此可以获取父项的属性。这是可能的,因为您在公共范围内有变量的路径。

请改为尝试:

trace(Object(parent).level.checkTile(30));

还要注意对象(父对象)。 DisplayObject的父级是DisplayObjectContainer,它没有级别属性。但是,通过将父包装在Object中,您告诉Flash,“没关系,您应该在运行时查找此属性,而不是在编译时。”