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

Actionscript 3 AS3.0:从第二类访问已创建实例的属性,actionscript-3,class,object,methods,instances,Actionscript 3,Class,Object,Methods,Instances,我正在制作一个小游戏 在我的document类中,我使用以下代码创建类字符和级别的实例: //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); 我还创建了一个控制器类来处理用户输入。(例如

我正在制作一个小游戏

在我的document类中,我使用以下代码创建类
字符
级别
的实例:

//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);
我还创建了一个控制器类来处理用户输入。(例如,检查玩家是否能够向右移动。)

我还为键盘事件等创建事件监听器

当按下一个键时,我想通过在控制器类中调用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));
    }
}
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;
        }
    }
}
...
// 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"
}
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));
    }
}
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;
        }
    }
}
...
// 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"
}
但是当我测试这个时,我得到以下错误:
第81 1120行:访问未定义的属性级别。

当我尝试时:
trace(Object(parent).level.checkTile(30))我获取:
1120:访问未定义的属性父项。


如何从一个类访问方法,从另一个类访问实例

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

function foo():void
{
    var k:MyCustomClass = new MyCustomClass();
    var j:MyOtherClass  = new MyOtherClass();
}
这两个例子j和k彼此不了解

但是,在这种特殊情况下,因为您显然在处理父结构,所以可以获取父结构的属性。这是可能的,因为您在公共作用域中有一个变量的路径

请尝试以下方法:

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

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

我认为您必须这样做:

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));
    }
}
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;
        }
    }
}
...
// 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"
}

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

我尝试过,但没有成功,我得到了错误:1120:访问未定义的属性父对象。这将不起作用,因为您可能认为
Controller
是添加到stage的DisplayObject,而事实并非如此。