0

AS3 を使用して、Flash のドラッグ アンド ドロップ シーンに取り組んできました。シーンは 4 つの「ゾーン」に分割され、各ゾーンには 5 つのターゲットがあります。配列を使用して、特定の順序なしで、mc をそれぞれのゾーンにドロップできるようにしました。これはすべて正常に機能します。

私が抱えている問題は、2 つの「パズル」ピース (MC) が、画面上での視覚的な表示方法が互いに同一であるということです。両方をゾーン 1 またはゾーン 2 にドロップできるように配列をセットアップしました。ただし、「同一のピース 1」がゾーン 1 にドロップされた場合、「同一のピース 2 」も同じゾーンにドロップできません。

これを行う方法について何か提案はありますか?

4

2 に答える 2

2

ピースがすでに取り付けられているかどうかを示すフラグをすべてのゾーンに設定するのはどうですか?

ゾーンが MovieClip の場合、それらに変数を追加するだけでmcTarget.isTaken = true、ピースがそれに接続されるタイミングを設定できます。それらが単に座標である場合、このようなグローバル配列を使用できます

private mZoneTaken:Array = new Array();

for (var i:int=0; i<4; i++)
{
   mZoneTaken[i] = new Array();
   for (var j:int = 0; j<5; j++)
   {
      mZoneTaken[i][j] = false;
   }
}

次に、ピースがゾーンにドロップされるたびに、そのフラグをtrueに設定して、それ以上のピースがゾーンに付着するのを防ぐことができます。

于 2012-10-12T23:30:05.133 に答える
0

個人的には、個々のゾーン内にオブジェクトの配列/ベクター (ベクターははるかに高速ですが、使用するのは難しい場合があります) があります。これを常に最新の状態に保ちます。splice(indexOf(obj),1)1 つを削除する場合は、配列から削除するために使用します。

あなたの問題のために、私はこれをします:

var p1:Sprite = new Sprite();
var p2:Sprite = new Sprite();
var zoneArray:Array = new Array();//there would be one for each zone, simplified it here

//this code would run whenever an object enters the zone
function zoneEnter(e:Event = null):void{
    var currentZone:Sprite; //set this equal to the zone the sprite just entered
    var currentObject:Sprite = e.currentTarget as Sprite; //this way we know which object just entered currentZone

    if ( currentObject == p1 &&  zoneArray.indexOf(p2) >= 0 ) {
        //prevent it from entering the zone
    }

    if ( currentObject == p2 &&  zoneArray.indexOf(p1) >= 0 ) {
        //prevent it from entering the zone
    }
}

多くのオブジェクトを見ている場合、ここには明らかにいくつかの制限があります。しかし、確かに、2つしかないことがわかっている場合は、これが進むべき道だと思います. それ以上ある場合は、オブジェクトを他のオブジェクトと照合できるようにする何らかの制御構造を作成する必要があります。必要に応じて、ここで話していることのサンプルを詳しく説明して提供できます。少し複雑ですが、実装するのは難しくありません。

編集 10-17-12: より高度なロジックがどのように見えるかのサンプル コードに追加されました。

var puzzleMap:Array = new Array();

var piece1:Piece = new Piece(); //this is the puzzle piece we'll be checking
var piece2:Piece = new Piece(); 
var piece3:Piece = new Piece();
var piece1Objs:Array = [piece2,piece3];
var piece2Objs:Array = [piece1,piece3];

puzzleMap.push({piece:piece1,others:piece1Objs});
puzzleMap.push({piece:piece2,others:puzzle2Objs);

private function stopDragHandler(e:MouseEvent = null):void{
    var space:Space = space; //this is the space the object was dropped into (I don't know how you identify them, so this is pseudo code)
    var valid:Boolean = true; //we'll check for a bad drop since it's easiest
    if (event.target.dropTarget != null && MovieClip(event.target.dropTarget.parent).allowed.indexOf(event.target) > -1){
        for ( var i:Number = 0; i < puzzleMap.length; i++ ) {
            var current:Object = puzzleMap[i];
            if ( current == e.currentTarget ) {
                for ( var j:Number = 0; j < current.others.length; j++ ) {
                    var checkAgainst:Piece = current.others[i] as Piece;
                    if ( space.currentObjects.indexOf(checkAgainst) < 0 ) {
                        valid = false;
                        break;
                    }
                }
            }
        }
        if ( !valid ) {
            //prevent the drop here
        }
    }
}
于 2012-10-12T23:52:47.393 に答える