Actionscript 3 如何在阵列中生成对象而不重复?

Actionscript 3 如何在阵列中生成对象而不重复?,actionscript-3,adobe,flashdevelop,Actionscript 3,Adobe,Flashdevelop,我在舞台上添加了3个不同位置的MCrockThrowers。它们使用工作正常的随机生成器随机繁殖。用户点击舞台上的一个按钮,rockThrowers被添加到舞台上,并按入他们自己的阵列ArockhrowerArray我希望能够检查他们在3个位置中的哪一个产生,并且不会与添加到舞台上的下一个rockThrowers重叠,如果是这样的话,然后在空的位置添加一个新的位置。我尝试过不同的策略,主要是布尔人,把他们从自己的班级叫到我的主班,但似乎没有任何效果。这是我的 掷石运动员等级: priva

我在舞台上添加了3个不同位置的MC
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附加到它上并使用它。