2011-09-14 6 views
0

XMLカスタムカードゲームを作成しています。デッキを作成してドラッグ可能にして、別のカードの上にドラッグアンドドロップできるようにしています。ムービークリップの複数のインスタンスの深さの問題

デッキを構築し、ライブラリにあるムービークリップの複数のインスタンスを配置する方法を理解しましたが、カードのそれぞれをドラッグ可能にする方法を見つけられません。現在起こっているのは、デッキの上にあるカードが、そのカードの下をクリックしてもドラッグする唯一のカードだということです。私はsetChildIndex()を調査しましたが、正しく使用しているとは思いません。

もう1つの問題は、ユーザーが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件のイベントカードのエントリがありますが、私が作ってそれをダウントリミングそれは簡単です。

答えて

0

変数アクティビティを正しいターゲットに設定することはありません。簡単な修正は、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を解析し、インスタンスを作成するような長い時間を取るべきだと思ういけません。多分あなたの方法のいくつかが遅延を引き起こしています。あるいは、あなたが最適化できる重いグラフィックがあるかもしれません。


EDIT:このコードは私の分類作業を行います。それが役に立てば幸い。マティアス@


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; 
     } 

    } 
} 
+0

私が持っている唯一の問題は、カードIである:-)、ドラッグが今素晴らしい作品ドラッグは他のものの後ろに現れる。それがドラッグされたときに他のすべてのカードの上に表示される方法はありますか?ありがとう – Mike

+0

またMattias、あなたはグラフィックが重くなるのは正しいです。私は単純なボックスを作成し、その場所でそれを使用し、躊躇、優れたアイデア:-) – Mike

+0

私はあなたのコードを実行するときに、その問題は全くありません。私はあなたのコードを動作させるためにいくつかのことを変えなければならなかった。私はあなたがそれを試すことができるように私のコードを掲載します。 – Mattias

関連する問題