【问题标题】:Drag-and-Drop - Limiting duplicate MCs for single use in targets?拖放 - 限制重复的 MC 在目标中一次性使用?
【发布时间】:2012-10-12 21:16:41
【问题描述】:

我一直在使用 AS3 制作 Flash 拖放场景。场景分为 4 个“区域”,每个区域有 5 个目标。我使用数组来允许将 mc 放在各自的区域中,没有任何特定的顺序。所有这些都可以正常工作。

我的问题是,有 2 个“拼图”块 (MC) 在屏幕上的视觉显示方式方面彼此相同。我已经设置了阵列以允许将两者都放入区域 1 或区域 2。但是,我想设置它以便如果“相同的部分 1”被放入区域 1,那么“相同的部分 2” " 也不能放到同一个区域中。

对如何做这件事有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    如何在每个区域中设置一个标志,以表明是否已经附加了一块?

    如果您的区域是影片剪辑,您可以简单地向它们添加变量,并在片段附加到它时设置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,从而防止任何其他棋子附加到它上面。

    【讨论】:

    • 我的区域是电影剪辑。但是,您能解释一下在目标上设置布尔值如何将重复的部分保留在同一区域中吗?尽管重复的部分看起来相同,但它们具有不同的实例名称。
    • 这个想法是,当 -any-piece 连接到您的区域时,布尔值设置为 true。每当 -any- 其他部分,无论是否相同,试图附加自己,布尔值都会阻止它。该解决方案涵盖的范围比您所要求的范围更广,但它的优势在于只需很少的时间即可实施。
    • 但这就是问题所在。考虑到每个区域有 5 个应该被丢弃的拼图,我不想设置一个布尔值,以便只有一个拼图可以被丢弃在该区域中。除非我在您的解决方案中遗漏了什么?
    • 在重新阅读您的解释后,我想我明白了困惑在哪里。我的代码已经涵盖了您的解决方案。一旦一个影片剪辑被拖放到目标影片剪辑上,就不能将其他剪辑拖放到同一目标上。因为我不希望用户必须按特定顺序放置拼图,所以我为每个区域的目标影片剪辑设置了数组,以允许以任何特定顺序放置正确的拼图。我已经完成了所有这些工作。在我的第二条评论中继续...
    • 继续...基本上,duplicatepuzzlepiece_1_mc 可以投放到区域 1 或区域 2 中的任何目标上,因为它可以进入任一区域。对用户来说,duplicatepuzzlepiece_1_mc 看起来就像duplicatepuzzlepiece_2_mc(但用户不会知道它们是不同的实例)。我希望能够以某种方式将其限制为仅允许用户在每个区域中删除其中 1 个重复项。
    【解决方案2】:

    就个人而言,我会在每个单独的区域内有一个对象数组/向量(向量要快得多。尽管使用起来可能会很痛苦)。您随时保持更新。如果删除一个,则使用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
            }
        }
    }
    

    【讨论】:

    • 是的,总共会有 4 个拼图(2 对重复)。样品将是理想的。我也很想知道如何将该函数添加到现有的 stopDrag if 语句中:“if (event.target.dropTarget != null && MovieClip(event.target.dropTarget.parent).allowed.indexOf(event.目标) > -1){ 等等....
    • @habib_101 我刚刚编辑了答案以包含代码。它比我认为您需要的要高级一些(我之前发布的代码或 Dave Hart 提供的代码可以正常工作),但它应该可以满足需要。我强烈建议为您的 Pieces 和 Spaces 设置不同的类,以便您可以将其中的一些嵌套在其中。理想情况下,piece1Objs 对象和 space.currentObjects 将是类中的对象/数组。再说一次,这对你来说太过分了。但是,如果您要尝试扩展您的项目,这可能会很有用
    • 我刚刚尝试了代码,在这些行中收到错误 1046“找不到类型...”: var piece1:Piece = new Piece(); //这是我们要检查的拼图 var piece2:Piece = new Piece(); var piece3:Piece = new Piece();
    • 该代码不完整。里面有一点伪代码,因为我面前没有你的项目来适应它。 Piece 是一个虚构的类名。正如我在之前的评论中所建议的,我强烈建议在这里使用自定义类,这样您就可以向它们添加自己的属性。就其背后的逻辑而言,这比其他任何事情都更重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多