0

我正在构建一个小游戏。

在我的文档类上,我创建了该类的一个实例,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);

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

我还为键盘事件和其他东西创建事件监听器。

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

控制器类如下所示:

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.

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

4

2 回答 2

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"
}

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

于 2011-06-07T14:05:52.000 回答
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,它没有 level 属性。但是,通过将 parent 包装在 Object 中,您是在告诉 Flash,“没关系,您应该在运行时而不是编译时查找此属性。”

于 2011-06-07T13:50:39.100 回答