Более эффективный способ, чтобы написать этот класс в ActionScript 3?


Я писал один из своих первых классов в ActionScript 3 и я хочу, чтобы кто-то разбирается в AS3, на помогите мне настроить мой класс. Я уверен, что есть вещи, которые могут действительно помочь эффективно и я люблю узнать о "объектно-ориентированное программирование", поэтому, пожалуйста, посмотрите и дайте мне знать, что вы думаете.

Общая информация о проекте: этот проект-это карточная игра, которая считывает всю информацию с карты XML-файл, чтобы клиент мог легко добавить, изменить или удалить информацию о карте. Пользователь будет перетаскивать карты активности одного из шести стопок и поместите его на верхнюю часть карты событий. Шесть стопок будет иметь открытую карту, так что пользователь может видеть информацию и соответствовать лучшей карты на карту события. т. е. если событие карты: "крушение горит авто с человеком внутри"; действие карт может читать "тянуть жертва", "потушить огонь" и т. д.

Когда пользователь сбрасывает карты активности на карты случае он проходит через КПП, чтобы определить, является ли это было хорошее падение, и назначает соответственно очков.

После падения, далее пользователь нажимает кнопку "Следующий >>", на палубе вновь тасует, и процесс начинается снова, пока определенное количество баллов набрали в общей сложности.

Надеюсь, что имеет смысл и вы можете получить какое-то представление о том, как он работает. Я могу более подробно, если это необходимо.

/* Document Class (CardGame.as) */
package library
{
    import flash.display.*;
    import flash.events.*;
    import flash.net.*;

    public class CardGame extends Sprite
    {
        // Variables
        private var _xml:XML;
        private var _loader:URLLoader;
        private var _cardArray:Array;
        private var _activity:ActivityCard;
        private var _event:EventCard;
        private var _randomCardArray:Array;

        // Contructor
        public function CardGame():void
        {
            _loader = new URLLoader();             
            _loader.addEventListener(Event.COMPLETE,buildArray);             
            _loader.load(new URLRequest("library/card.xml"));
            start_btn.addEventListener(MouseEvent.CLICK,buildDeck);
            restart_btn.addEventListener(MouseEvent.CLICK,removeDeck);
        }

        // Methods
        public function buildArray(e:Event):Array
        {
            _cardArray = new Array();  
            _xml = new XML(_loader.data);
            for(var i=0;i<_xml.card.length();i++)
            {
                if(_xml.card.face[i]== "activity") {
                    _cardArray.push({id:_xml.card.id[i],face:_xml.card.face[i],category:_xml.card.category[i],point:_xml.card.point[i],value:_xml.card.value[i]});
                } else if(_xml.card.face[i] == "event") {
                    _cardArray.push({id:_xml.card.id[i],face:_xml.card.face[i],category:_xml.card.category[i],point:_xml.card.point[i],value:_xml.card.value[i]});
                } else {
                    trace("no card found");
                }
            }
            return _cardArray;
        }
        private function randomizeArray():Array
        {
            //trace(buildArray(null));
            _randomCardArray = new Array();
            do {
            var cardItem = int(Math.random()*_cardArray.length);
                _randomCardArray.push(_cardArray[cardItem]);
                _cardArray.splice(cardItem,1);
            } while (_cardArray.length > 0);
            return _randomCardArray;
        }
        public function buildDeck(e:Event):void
        {
            var _finalCardArray = randomizeArray();
            for(var i=0;i<_finalCardArray.length;i++) {
                if(_finalCardArray[i].face == "activity") {
                    _activity                = new ActivityCard();
                    _activity.x              = 200;
                    _activity.y              = 150;
                    _activity.buttonMode     = true;
                    _activity.mouseChildren  = false;
                    _activity.name           = "card"+i;
                    _activity.id_txt.text    = _finalCardArray[i].id;
                    _activity.value_txt.text = _finalCardArray[i].value;

                    _activity.addEventListener(MouseEvent.MOUSE_DOWN,dragStart);
                    _activity.addEventListener(MouseEvent.MOUSE_UP,dragStop);

                    addChild(_activity);
                } else if(_finalCardArray[i].face == "event") {
                    _event                = new EventCard();
                    _event.x              = stage.stageWidth/2;
                    _event.y              = 550;
                    _event.mouseChildren  = false;
                    _event.name           = "card"+i;
                    _event.id_txt.text    = _finalCardArray[i].id;
                    _event.value_txt.text = _finalCardArray[i].value;
                    addChild(_event);
                } else {
                    trace("no cards");
                }
            }
        }
        public function dragStart(e:Event):void
        {
            _activity = e.target as ActivityCard;     
            _activity.parent.setChildIndex(_activity, numChildren - 1);     
            _activity.startDrag(false);
        }
        public function dragStop(e:Event):void
        {
            this.stopDrag();
        }
        private function removeDeck(e:Event):void
        {
            if(_cardArray.length == 0) {
                for(var i=0;i<106;i++) {
                    removeChild(getChildByName("card"+i));
                }
                buildArray(null);
                buildDeck(null);
            }
        }
    }


431
3
задан 15 сентября 2011 в 11:09 Источник Поделиться
Комментарии
1 ответ

Есть несколько областей, которые можно улучшить, но я думаю, нам нужно больше контекста, как это изложено. Мои комментарии и вопросы ниже:

1 - в ActionScript, так как вы можете изменить содержимое коллекции внутри цикла запрос длина коллекции на каждой итерации невелики. Так:

for(var i=0;i<_xml.card.length();i++)

действительно должны быть

var xmlLength:int = _xml.card.length();
for(var i=0;i<xmlLength;i++)




2 - чтобы помочь с ясностью вы хотите использовать строго типизированные объекты, где это возможно. Например, когда вы храните каждое событие или мероприятие в _cardArray рассмотреть класс, который просто содержит данные для этих объектов. Это помогает улучшить производительность во время выполнения, а также других разработчиков понимание не только содержимое массива, но и тип данных каждого свойства объекта. Например:

_cardArray.push({id:_xml.card.id[i],face:_xml.card.face[i],category:_xml.card.category[i],point:_xml.card.point[i],value:_xml.card.value[i]});

может быть

_cardArray.push(new ActivityVO(_xml.card.id[i], _xml.card.face[i], _xml.card.category[i], _xml.card.point[i], _xml.card.value[i]));

где ActivityVO есть(я просто предполагая, что тип этих свойств):

public class ActivityVO {

public var id:int;
public var face:String;
public var category:String;
public var point:int;
public var value:int;

public function ActivityVO(_id:int, _face:String, _category:String, _point:int, _value:int){
id = _id;
face = _face;
category = _category;
point = _point;
value = _value;
}
}




3 - Как buildArray работать прямо сейчас? Я вижу, что он выполняется onComplete погрузчика, но он возвращает массив. Если buildArray вызывается что-то еще(я вижу его общественной), то все эта логика будет выполнен в два раза.
Где это вам вернули? Если это класс документа, что вызов этого метода?
randomizeArray, кажется, страдает от той же проблемы. Я не уверен, где вы возвращаете этот массив.




4 - думать о новом классе, который управляет колоду карт. Методы как randomizeArray и buildDeck может быть в этом классе и уменьшить беспорядок вашего текущего класса.




5 - метод removeDeck не так. Вы всегда должны стараться избегать циклов с жестко нарушая значений (106). Вероятно, лучший способ пойти о целом цикле будет поддерживать массив все карты на стол, а затем, когда приходит время, чтобы удалить их, все они могут быть очищены с помощью цикла по массиву.

Эти замечания не в каком-либо определенном порядке, я ставлю их вместе, как я прочитал ваш код. Дайте мне знать если вы имеете любые вопросы.

3
ответ дан 16 сентября 2011 в 02:09 Источник Поделиться