Actionscript 3 如何在阵列中生成对象而不重复?
我在舞台上添加了3个不同位置的MCActionscript 3 如何在阵列中生成对象而不重复?,actionscript-3,adobe,flashdevelop,Actionscript 3,Adobe,Flashdevelop,我在舞台上添加了3个不同位置的MCrockThrowers。它们使用工作正常的随机生成器随机繁殖。用户点击舞台上的一个按钮,rockThrowers被添加到舞台上,并按入他们自己的阵列ArockhrowerArray我希望能够检查他们在3个位置中的哪一个产生,并且不会与添加到舞台上的下一个rockThrowers重叠,如果是这样的话,然后在空的位置添加一个新的位置。我尝试过不同的策略,主要是布尔人,把他们从自己的班级叫到我的主班,但似乎没有任何效果。这是我的 掷石运动员等级: priva
rockThrowers
。它们使用工作正常的随机生成器随机繁殖。用户点击舞台上的一个按钮,rockThrowers
被添加到舞台上,并按入他们自己的阵列ArockhrowerArray
我希望能够检查他们在3个位置中的哪一个产生,并且不会与添加到舞台上的下一个rockThrowers
重叠,如果是这样的话,然后在空的位置添加一个新的位置。我尝试过不同的策略,主要是布尔人,把他们从自己的班级叫到我的主班,但似乎没有任何效果。这是我的
掷石运动员等级:
private function startPosition():void
{
// y position
this.y = (stage.stageHeight / 2) + 200;
//Start Speed
nSpeed = randomNumber(5, 8);
leftScreenSpawn = randomNumber(1, 3);
//For Left Screen
leftNeg = (stage.stageWidth / 2) - 200;
leftMiddle = (stage.stageWidth / 2) - 150;
leftPos = (stage.stageWidth / 2) - 100;
//Left Screen
if (leftScreenSpawn == 1)
{
this.x = leftNeg;
bLeftNeg = true; // Now if the left Rock thrower is destroyed then turn back to false on main engine class
}else
if (leftScreenSpawn == 2)
{
this.x = leftMiddle;
bLeftMiddle = true;
}else
if (leftScreenSpawn == 3)
{
this.x = leftPos;
bLeftPos = true;
}
//Move
startMoving();
}
现在,在我的主要课程中,当用户单击左侧屏幕Btn时,我将其设置为:
private function rockThrowerSpawn(e:MouseEvent):void
{
//Instantiate screens before hand
rockThrowerSpawnScreen.x = (stage.stageWidth / 2);
rockThrowerSpawnScreen.y = (stage.stageHeight / 2) + 200;
addChild(rockThrowerSpawnScreen);
rockThrowerSpawnScreen.left.addEventListener(MouseEvent.CLICK, chooseSpawnSideRockThrowers);
}
然后使用Spawn函数:
private function chooseSpawnSideRockThrowers(e:MouseEvent):void
{
if (e.currentTarget == rockThrowerSpawnScreen.left) // Spawn LEFT
{
//add new rock thrower
rockThrowers = new mcRockThrowers();
//Add object
addChild(rockThrowers);
//Add to Array
aRockThrowerArray.push(rockThrowers);
//trace("LEFT SPAWN");
}
//Subtract resources and update text
nResources -= 10;
updateResourceTextField();
//Remove Listeners
rockThrowerSpawnScreen.left.removeEventListener(MouseEvent.CLICK, chooseSpawnSideRockThrowers);
rockThrowerSpawnScreen.destroy();
}
我明白,单凭这一点,就会产生随机位置。我删除了所有不起作用的东西。现在,我又回到了原点。关于我如何做到这一点有什么想法吗?我们感谢所有的支持 简单。您需要一个有限的数组,该数组以随机顺序生成3个值
var L:Array =
[
(stage.stageWidth / 2) - 200,
(stage.stageWidth / 2) - 150,
(stage.stageWidth / 2) - 100,
];
function fetchPosition():Number
{
// Get a random index based on the current length of L.
var anIndex:int = Math.random() * L.length;
// Record the result.
var result:Number = L[anIndex];
// Remove the result from the list.
L.splice(anIndex, 1);
return result;
}
因此,您可以在每次应用程序运行时有效地调用fetchPosition()三次,每次运行L的内容都将以随机顺序获取,更重要的是,您不会两次获得相同的值,因为获取的值已从数据集中删除。嘿,Organi感谢您的帮助,它工作得非常完美。我在我的主类中使用该函数,并从我的RockSprower类中删除了所有的x位置生成。一个问题,如果可以的话。假设其中一个掷石者使用的位置现在被移除,并且持有该位置的掷石者被移除,我如何将最后一个位置重新添加回L阵列?如果(L.indexOf((stage.stageWidth/2)-100)=-1{L.push((stage.stageWidth/2)-100);}@NathanFitchett,我会这样做吗?你想得太多了(而且太复杂了)。移除岩石投掷者时,只需将其x坐标推回列表即可。如果它的位置不是固定的,那么,将一些存储变量originalX附加到它上并使用它。