Actionscript 3 拖放-限制目标中单一使用的重复MCs?

Actionscript 3 拖放-限制目标中单一使用的重复MCs?,actionscript-3,actionscript,flash-cs5.5,Actionscript 3,Actionscript,Flash Cs5.5,我一直在使用AS3制作一个Flash拖放场景。场景分为4个“区域”,每个区域有5个目标。我已经使用数组来允许mc在它们各自的区域中丢弃,而不需要任何特定的顺序。所有这些都能正常工作 我的问题是,有两个“拼图”块(MC)在屏幕上的视觉显示方式上彼此相同。我已经设置了阵列,以允许在区域1或区域2中丢弃这两个阵列。然而,我想对它进行设置,这样如果“相同的片段1”被放入区域1,那么“相同的片段2”也不能被放入相同的区域 有没有关于如何进行此操作的建议?在每个区域设置一个标志,告诉您是否已将一件物品连接到

我一直在使用AS3制作一个Flash拖放场景。场景分为4个“区域”,每个区域有5个目标。我已经使用数组来允许mc在它们各自的区域中丢弃,而不需要任何特定的顺序。所有这些都能正常工作

我的问题是,有两个“拼图”块(MC)在屏幕上的视觉显示方式上彼此相同。我已经设置了阵列,以允许在区域1或区域2中丢弃这两个阵列。然而,我想对它进行设置,这样如果“相同的片段1”被放入区域1,那么“相同的片段2”也不能被放入相同的区域


有没有关于如何进行此操作的建议?

在每个区域设置一个标志,告诉您是否已将一件物品连接到它

如果您的区域是MovieClips,您可以简单地向其添加变量,并在工件附着时设置
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;
   }
}
private mZoneTaken:Array=newarray();

对于(var i:int=0;i个人而言,我会在每个单独区域内拥有一个对象的数组/向量(向量的速度要快得多。尽管使用它们可能会非常困难)。您会随时更新此内容。如果删除一个,您可以使用
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
    }
}
如果你看到很多对象,这里显然有一些限制。但是如果你知道,肯定只有两个,我认为这是最好的选择。如果还有更多,你需要创建某种控制结构,允许你对照其他对象检查一个对象。我可以详细说明并给出一个sampl如果需要的话,这就是我在这里所说的。它有点复杂,但不难实现

编辑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
        }
    }
}
var-puzzmap:Array=newarray();
var piece1:Piece=new Piece();//这是我们将要检查的拼图块
变量piece2:Piece=新的Piece();
变量piece3:Piece=新件();
变量piece1Objs:Array=[piece2,piece3];
var piece2Objs:Array=[piece1,piece3];
push({piece:piece1,others:piece1Objs});
push({piece:piece2,others:puzzle2Objs);
私有函数stopDragHandler(e:MouseEvent=null):void{
var space:space=space;//这是对象被放入的空间(我不知道如何识别它们,所以这是伪代码)
var valid:Boolean=true;//我们将检查是否有错误的删除,因为这是最简单的
if(event.target.dropTarget!=null&&MovieClip(event.target.dropTarget.parent).allowed.indexOf(event.target)>-1){
for(变量i:Number=0;i
是的,总共将有4个拼图块(2对副本)。一个示例将是理想的。我还想知道如何将该函数添加到现有的if语句中,用于stopDrag:“if(event.target.dropTarget!=null&&MovieClip(event.target.dropTarget.parent)。allowed.indexOf(event.target)>-1){etc…@habib_101我刚刚编辑了我的答案以包含代码。它比我认为您需要的要高级一点(我以前发布的代码或Dave Hart提供的代码可以很好地工作),但它应该做需要做的事情。我强烈建议为片段和空间使用不同的类,以便您可以将其中的一些嵌套在其中。理想情况下,piece1Objs对象和space.currentObjects将是类中的对象/数组。同样,这对您来说太过分了。但是,如果您试图扩展项目,这可能有用我刚刚尝试了代码,在这些行上出现了错误1046“找不到类型…”:var piece1:Piece=new Piece();//这是我们将要检查的拼图块var piece2:Piece=new Piece();var piece3:Piece=new Piece();该代码不完整。其中有一点伪代码,因为我面前没有适合它的项目。Piece是一个虚构的类名。正如我在前面的评论中所建议的,我强烈建议在此处使用自定义类,以便您可以向它们添加自己的属性。这是日志方面的指南我的区域是movieclips。但是,你能解释一下,在目标上设置一个布尔值将如何保持来自同一区域的重复片段吗?即使重复片段看起来相同,它们有不同的实例名称。这个想法是,当任何片段连接到你的区域时,布尔值设置为t是的。无论何时-任何-其他部分,无论是否相同,尝试连接自身,布尔值都会阻止它。该解决方案覆盖的范围比您要求的范围更广,但它的优点是只需很少的时间即可实现。但这就是问题所在。考虑到每个区域都有5个应该丢弃的拼图部分,我不希望设置一个布尔值,以便在区域中只能放置一个拼图块。除非我在您的解决方案中遗漏了什么?在重新阅读您的解释后,我想我看到了混淆的地方。我的代码已经涵盖了您的解决方案。一旦一个movieclip被放置到目标movieclip上,就不能在同一目标上放置其他剪辑。Becau因为我不想让用户把拼图按特定的顺序排列,所以我为tar设置了数组