AS3.0: доступ к свойствам созданного экземпляра из второго класса - PullRequest
0 голосов
/ 07 июня 2011

Я создаю маленькую игру.

В своем классе документов я создаю экземпляры класса Character и Level со следующим кодом:

//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 и прочего.

Когда клавиша нажата, я хочу проверить, возможно ли перемещение, вызвав функцию 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.

Как я могу получить доступ к методам из одного класса с экземпляром из второго класса?

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Я думаю, вы должны сделать что-то вроде этого:

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

В этом случае вы должны сказать, каким игроком и каким уровнем должен управлять контроллер. Контроллер - это класс, который не знает ни одного другого класса. Переменные не являются глобальными (в вашем примере, и они не должны быть), поэтому вы не можете получить к ним доступ отовсюду.

0 голосов
/ 07 июня 2011

Классы в AS не могут получить доступ к их контексту.Это означает, что если у меня есть:

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

, то два экземпляра j и k не знают друг о друге.

Однако в данном конкретном случае вы явно имеете дело сродительская структура, можно получить свойства родителя.Это возможно, потому что у вас есть путь к переменной в общедоступной области.

Попробуйте вместо этого:

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

Также обратите внимание на объект (родительский).Родителем DisplayObject является DisplayObjectContainer, у которого нет свойства уровня.Однако, оборачивая parent в Object, вы говорите Flash: «Все в порядке, вы должны искать это свойство во время выполнения, а не при компиляции».

...