Actionscript 3: область действия массива в классе документа - PullRequest
0 голосов
/ 17 декабря 2009

У меня есть следующая функция для настройки карт в игре. Я создал один массив для хранения вида карт, а другой - для хранения позиции карт.

private function setPlayerCard(cardNumber:int, cardPos:int):void{
            for (var i:int = 1; i < _CardGridInstance.numChildren+1; i++) {
                var _position:MovieClip = MovieClip(_CardGridInstance.getChildByName("Position_" + i));
                cardPositions[i] = _position;
                cardPositions[i].pos_name.text = "position" + i;
                cardPositions[i].id = ["pos"+i];
            }


            for (var j:int = 1; j < numCards+1; j++) {
                var _c:Class = getDefinitionByName("Card_" + j) as Class;
                var _cardInstance:MovieClip = new _c();
                cards[j] = _cardInstance;
            }
            cards[cardNumber].x = _CardGridInstance.x + cardPositions[cardPos].x - 1;
            cards[cardNumber].y = _CardGridInstance.y + cardPositions[cardPos].y;
            addChild(cards[cardNumber]);
        }

Поэтому, если я хочу установить номер карты «3» в положение «5», я просто пишу:

setPlayerCard(3,5);

Проблема, которую я вижу, состоит в том, что каждый раз, когда я хочу разместить карту, я каждый раз создаю два массива. Я хотел бы сделать массивы "глобальными" (то есть создать его в моем конструкторе в своем классе документа) и повторно использовать его в функции "setPlayerCard", однако при попытке сделать это я получаю ошибки.

Есть предложения?

Ответы [ 3 ]

1 голос
/ 24 сентября 2010

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

Однако я могу порекомендовать вам , а не использовать шаблон Singleton. Это не идеальный случай для синглтона. Шаблону Одиночки нет места в ООП, это процедурное программирование, свернутое как ОО, но это аргумент для других.

Это, однако, идеальный случай для переменных уровня класса. Ниже приведен простой пример. Однако есть несколько пропущенных объявлений переменных (numCards), поскольку я не знаю, где вы их создаете и устанавливаете.

package{
    import flash.display.Sprite;
    public class CardGame extends Sprite{

       private var cardPositions:Array = new Array();
       private var cards:Array = new Array();

       public function CardGame(){
           for var i:uint = 1; i <= _CardGridInstance.numChildren; i++) {
                var position:MovieClip = MovieClip(_CardGridInstance.getChildByName("Position_" + i));
                cardPositions[i] = position;
                cardPositions[i].pos_name.text = "position" + i;
                cardPositions[i].id = ["pos"+i];
            }
            for(i = 1; i <= numCards; i++) {
                var c:Class = getDefinitionByName("Card_" + i) as Class;
                var cardInstance:MovieClip = new c();
                cards[i] = cardInstance;
            }
        }

        private function setPlayerCard(cardNumber:uint, cardPos:uint):void{
            cards[cardNumber].x = _CardGridInstance.x + cardPositions[cardPos].x - 1;
            cards[cardNumber].y = _CardGridInstance.y + cardPositions[cardPos].y;
            addChild(cards[cardNumber]);
        }
    }
}

Таким образом, вы только один раз создаете и заполняете массивы и получаете к ним доступ из любого места в классе CardGame. Они не являются глобальными, но находятся в рамках метода setPlayerCard.

Вы можете получить ошибки, так как объекты не могут быть созданы при вызове конструктора класса документа, но это можно обойти.

Зачем нужно, чтобы переменная была общедоступной и статической?

Статический означает, что переменная находится в классе, а не в экземплярах класса. Таким образом, каждый экземпляр «CardGame» будет использовать одну и ту же статическую переменную. Я предполагаю, потому что это класс документов, что у вас не будет более одного его экземпляра. Так что для этого нет никаких оснований.

Единственная причина, по которой вы объявили ее общедоступной, - сделать переменную доступной извне класса через CardGame.cardPositions. Это плохая практика, так как вы не должны позволять другим объектам напрямую манипулировать внутренними данными Classes. Это нарушает инкапсуляцию. Поскольку это класс документов и вершина иерархии, вы должны передать копию данных любому объекту, который в этом нуждается, и дождаться события, чтобы получить обновленные данные. Таким образом, вы можете очистить данные перед их использованием, и вы не просто слепо доверяете другим объектам уважать ваши данные.

http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)

1 голос
/ 17 декабря 2009

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

pixelbreaker имеет хороший базовый пример Singleton AS3, из которого вы можете построить.

0 голосов
/ 17 декабря 2009

Я пытался использовать класс Singleton, но, поскольку мне приходилось ссылаться на мувиклипы, которые уже были в списке отображения, я выбрал другое решение из "Actionscript 3 Tip of the Day":

http://www.kirupa.com/forum/showthread.php?p=2110830#post2110830

package {

public class ClassName {
       public static var myArray_1:Object = new Object;
       public static var myArray_2:Object = new Object;
public function ClassName() {
       //constructor
       Whatever();
       DoStuffWithWhatever();
}

private function Whatever() {
     // put stuff into the array here

}
private function DoStuffWithWhatever():void {
    // do stuff with the array values here.
}

   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...