我一直在使用AS3处理Flash拖放场景。场景分为4个“区域”,每个区域有5个目标。我已经使用数组允许mc被删除到各自的区域,没有任何特定的顺序。所有这一切都可行。
我认为有两个“拼图”片段(MC)在视觉上在屏幕上的显示方式相同。我已经设置了阵列以允许在区域1或区域2中放下两个阵列。但是,我想设置它以便如果“相同的1块”掉入区域1,那么“相同的块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
}
}
}