個人的には、個々のゾーン内にオブジェクトの配列/ベクター (ベクターははるかに高速ですが、使用するのは難しい場合があります) があります。これを常に最新の状態に保ちます。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
}
}
}