AS3 — Как получить доступ к экземпляру объекта из отдельного класса

У меня есть класс игрового движка, который создает экземпляр моего основного персонажа и экземпляр границы игры, когда игра загружается следующим образом:

public class Engine extends MovieClip
{
     var char:Char = new Char(stage);
     stage.addChildAt(char, 1);

     var border1:Border = new Border();
     stage.addChild(border1);

    }

Я хотел бы получить доступ к переменной border1, которая была создана в классе Engine внутри моего класса Char. Возможно ли это, и если да, то как мне это сделать?

Я пытался изменить код, чтобы border1 был статичным

static var border1:Border = new Border();

Но потом я получаю

error 1012: The static attribute may be used only on definitions inside a class.

person user1547052    schedule 23.07.2012    source источник


Ответы (1)


Вы можете сделать это несколькими способами.

1.  Create the border1 and char instances in reverse order and pass the border1 to the char instance to maintain a reference.

var border1:Border = new Border();
stage.addChild(border1);

var char:Char = new Char(stage, border1);
stage.addChildAt(char, 1);

// Char consructor

public function Char(target:DisplayObjectContainter, border:Border):void {
    ...
    this._border = border;
}

// Now you have a reference to the border1 instance within your char instance.

Вы также можете сделать это, не передавая экземпляр border1 конструктору, а вместо этого просто добавить метод, устанавливающий это свойство.

public function setBorder(border:Border):void {
    this._border = border;
}

// OR

public function set border(border:Border):void {
    this._border = border;
}

Другим вариантом было бы заставить экземпляр Engine поддерживать ссылку на границу и разрешать связь через экземпляр Engine. Например,

public class Engine extends MovieClip {

    public var char:Char;
    public var border1:Border;

    public function Engine():void {
        char = new Char(stage);
        stage.addChildAt(char, 1);

        border1 = new Border();
        stage.addChild(border1);
    }

Теперь, если экземпляр char имеет ссылку на экземпляр движка, то на экземпляр границы может ссылаться myEngineInstance.border1.

Или вы можете сделать экземпляр границы статическим. Сделать его статическим позволит код внутри экземпляра Char, например:

Engine.border1.<whatever>
person sberry    schedule 23.07.2012
comment
Спасибо за ответ! Однако, когда я пытаюсь сделать экземпляр границы статическим, я получаю сообщение об ошибке 1012: The static attribute may be used only on definitions inside a class. - person user1547052; 24.07.2012
comment
Извини за это. Я попытался расширить свой ответ с помощью клавиши возврата, и он добавил комментарий, прежде чем я был готов. - person user1547052; 24.07.2012
comment
Итак, вы пытаетесь добавить это на сцену? Прочтите ошибку. Он говорит вам о проблеме. Чтобы сделать экземпляр статическим, он должен быть членом класса. - person sberry; 24.07.2012
comment
О, я вижу - теперь у меня это работает. Я объявил переменную в функции Engine(), хотя должен был объявить ее перед ней. Это вызывало проблему и путаницу, поскольку это было внутри класса, но это было внутри функции, которая была внутри класса. По-видимому, он должен быть внутри класса, но вне функции, чтобы он работал. Еще раз спасибо за помощь! - person user1547052; 24.07.2012
comment
Без проблем. Если мой ответ решил вашу проблему, вы должны отметить его как принятый, нажав на галочку рядом с ним. - person sberry; 24.07.2012