Глубина проблемы с несколькими экземплярами фрагмента ролика - PullRequest
0 голосов
/ 14 сентября 2011

Я создаю пользовательскую карточную игру в формате XML и собираюсь создать колоду и сделать ее перетаскиваемой, чтобы пользователь мог перетаскивать их поверх другой карты.

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

Другая проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь щелкает по click_btn (названному только для тестирования), чтобы собрать колоду, для ее создания требуется время, может ли это быть ускорено?

Затем, когда пользователь нажимает первую карту, чтобы перетащить ее, наступает еще одно долгое ожидание?

Класс документа (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:Activity;
    /*
    *   constructor
    */
    public function CardGame():void
    {
        _loader = new URLLoader();             
        _loader.addEventListene(Event.COMPLETE,buildArray);             
        _loader.load(new URLRequest("library/card.xml"));
        click_btn.addEventListener(MouseEvent.CLICK,buildDeck);
    }
    /*
    *   metohods
    */
    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;
    }
    public function buildDeck(e:Event):void
    {
        for(var i=0;i<cardArray.length;i++)
        {
            if(cardArray[i].face == "activity")
            {
                activity = new Activity();
                activity.x = 200;
                activity.y = 150;
                activity.id = i;
                activity.name = "b"+i;
                activity.buttonMode = true;
                stage.addChild(activity);
                activity.addEventListener(MouseEvent.MOUSE_DOWN,dragStart);
                activity.addEventListener(MouseEvent.MOUSE_UP,dragStop);
            }
        }
    }
    public function dragStart(e:Event):void
    {
        activity.parent.setChildIndex(activity, numChildren - 1);
        activity.startDrag();
    }
    public function dragStop(e:Event):void
    {
        this.stopDrag();
    }
}
}

card.xml

<?xml version="1.0" encoding="iso-8859-1"?>
<cardgame>
    <card> 
            <id>1</id>   
            <face>activity</face>
       <catagory>Task</catagory>
            <point>2</point>     
            <value>Change the rule.</value>
    </card>
    <card> 
            <id>21</id>   
            <face>event</face>
       <catagory>Injury</catagory>
            <point>-2</point>     
            <value>Injury due to animal/snake/insect bite-count 3.</value>
    </card>
</cardgame>

Файл xml на самом деле содержит 64 записи карточек действий и 41 карточку событий, но я сократил его, чтобы упростить.

1 Ответ

0 голосов
/ 14 сентября 2011

Вы никогда не устанавливаете переменную активность на правильную цель. Простое решение - установить его в методе dragStart. Это гарантирует, что вы всегда перетащите правильную карту.

activity = e.target as Activity;

public function dragStart(e:Event):void
{
    activity = e.target as Activity;
    activity.parent.setChildIndex(activity, numChildren - 1);
    activity.startDrag(false);
} 

По поводу вашего другого вопроса, я не думаю, что это займет так много времени, анализируя XML и создавая экземпляры. Возможно, некоторые из ваших методов вызывают задержку. Или, может быть, есть тяжелая графика, которую вы могли бы оптимизировать.


РЕДАКТИРОВАТЬ: Этот код делает сортировку для меня. Надеюсь, это поможет.


Main.as

package
{
    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 : Activity;
        /*
        *   constructor
        */
        public function CardGame()
        {
            _loader = new URLLoader();             
            _loader.addEventListener(Event.COMPLETE, buildArray);             
            _loader.load(new URLRequest("cards.xml"));
            //click_btn.addEventListener(MouseEvent.CLICK,buildDeck);
        }
        /*
        *   metohods
        */
        public function buildArray(e:Event) : void
        {
            _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");
                }
            }

            buildDeck(null);
        }

        public function buildDeck(e:Event):void
        {
            for(var i=0 ; i < _cardArray.length ; i++)
            {
                if(_cardArray[i].face == "activity")
                {
                    _activity = new Activity();
                    _activity.x = 200;
                    _activity.y = 150;
                    _activity.id = i;
                    _activity.name = "b"+i;
                    _activity.buttonMode = true;
                    addChild(_activity);
                    _activity.addEventListener(MouseEvent.MOUSE_DOWN,dragStart);
                    _activity.addEventListener(MouseEvent.MOUSE_UP,dragStop);
                }
            }
        }
        public function dragStart(e:Event):void
        {
            _activity = e.target as Activity;
            _activity.parent.setChildIndex(_activity, numChildren - 1);
            _activity.startDrag(false);
        }
        public function dragStop(e:Event):void
        {
            this.stopDrag();
        }
    }
}

Activity.as

package
{
    import flash.display.Sprite;

    public class Activity extends Sprite
    {

        private var _id : int;

        public function Activity()
        {
            super();

            with(graphics)
            {
                lineStyle(0, 0xFF0000, 1);
                beginFill(Math.random()*0xFFFFFF, 1.0);
                drawRect(0, 0, 80, 100);
            }
        }


        public function get id():int
        {
            return _id;
        }

        public function set id(value:int):void
        {
            _id = value;
        }

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