拖放 - 限制重复的MC以便在目标中单次使用?

时间:2012-10-12 21:16:42

标签: actionscript-3 actionscript flash-cs5.5

我一直在使用AS3处理Flash拖放场景。场景分为4个“区域”,每个区域有5个目标。我已经使用数组允许mc被删除到各自的区域,没有任何特定的顺序。所有这一切都可行。

我认为有两个“拼图”片段(MC)在视觉上在屏幕上的显示方式相同。我已经设置了阵列以允许在区域1或区域2中放下两个阵列。但是,我想设置它以便如果“相同的1块”掉入区域1,那么“相同的块2” “也不能掉进同一个区域。

有关如何进行此操作的任何建议吗?

2 个答案:

答案 0 :(得分: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,以防止任何其他碎片附着到该区域。

答案 1 :(得分:0)

就个人而言,我会在每个区域内有一个数组/向量(向量可以更快,更快。虽然它们可能是一种使用的皇家痛苦)。您始终保持此更新。如果删除一个,则使用splice(indexOf(obj),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
    }
}

如果您正在查看大量对象,那么显然存在一些局限性。但是,如果你知道,肯定会有两个,我想这将是要走的路。如果还有更多,您需要创建某种控制结构,以允许您检查对象与其他对象。如果需要的话,我可以详细说明一下我在这里谈论的内容。这有点复杂,但并不难实现。

编辑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
        }
    }
}