Flash - 在特定设定点随机添加对象到场景

时间:2014-11-12 20:55:44

标签: actionscript-3 flash

我正在使用ActionScript 3.0创建一个简单的Flash游戏,并且在将障碍物产生到场景时遇到了一个问题。我的目标是在x轴上保持大约10个点(保持在相同的y轴上),当将障碍物产生到我的场景中时,它会随机选择2-4个点并在它们上产生它们。

我已经有了随机产生的障碍,但无法弄清楚如何从列表中随机设定点产生它们。如果有人可以提供帮助,我会非常感激。感谢

修改

到目前为止我的代码:

var a:Array = new Array();
for (var count=0; count< 5; count++) {
        a[count] = new asteroidOne();
        a[count].x = 100 * count + (Math.floor(Math.random() * 200));
        a[count].y = 100;
        addChild(a[count]);
}

// Asteroid obstacle spawning 2.0

player.addEventListener(Event.ENTER_FRAME, obstacleMove);
function obstacleMove(evt:Event):void {
        for (var i=0; i< 5; i++) {
                a[i].y += 5;
                if (a[i].y == 480) {
                        a[i].y = 0;    
                }
                if (player.hitTestObject(a[i])) {
                        trace("HIT");
                }
        }
}

1 个答案:

答案 0 :(得分:1)

假设您在数组中有生成点,则可以执行以下操作:

var spawnPoints:Array = [100,200,250,300,450,500,600,800]; //your list of spawn x locations
spawnPoints.sort(randomizeArray); //lets randomize the spwanPoints

function randomizeArray(a:*, b:*):int {
    return ( Math.random() < .5 ) ? 1 : -1;
}

var a:Vector.<asteroidOne> = new Vector.<asteroidOne>(); //the array for your astroids - changed to vector for possible performance and code hint improvement (basically the same as Array but every object has to be of the specified type)

for (var count:int=0; count < 5; count++) {
        a.push(new asteroidOne());
        a[count].x = spawnPoints.pop(); //pop removes the last element from the array and returns it
        a[count].y = 100;
        addChild(a[count]);
}

修改

为了解答你的评论,这是一个不错的例子:

import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;

var spawnTimer:Timer = new Timer(10000); //timer will tick every 10 seconds
spawnTimer.addEventListener(TimerEvent.TIMER, spawn, false, 0, true); //let's run the spawn function every timer tick
spawnTimer.start();

var spawnPoints:Array = [100,200,250,300,450,500,600,800]; //your list of spawn x locations
var spawnAmount:int = 5; //how many asteroids to have on the screen at once (you could increase this over time to make it more difficult)
var asteroids:Vector.<asteroidOne> = new Vector.<asteroidOne>(); //the array for your asteroids - changed to vector for possible performance and code hint improvement (basically the same as Array but every object has to be of the specified type)

spawn(); //lets call it right away (otherwise it will won't be called until the first timer tick in 10 seconds)

//calling this will spawn as many new asteroids as are needed to reach the given amount
function spawn(e:Event = null):void {
    if(asteroids.length >= spawnAmount) return; //let's not bother running any of the code below if no new asteroids are needed
    spawnPoints.sort(randomizeArray); //lets randomize the spwanPoints
    var spawnIndex:int = 0;

    var a:asteroidOne; //var to hold the asteroid every loop
    while (asteroids.length < spawnAmount) {
        a = new asteroidOne();
        a.x = spawnPoints[spawnIndex];
        spawnIndex++; //incriment the spawn index
        if (spawnIndex >= spawnPoints.length) spawnIndex = 0; //if the index is out of range of the amount of items in the array, go back to the start

        a.y = 100;
        asteroids.push(a); //add it to the array/vector
        addChild(a); //add it to the display 
    }
}

player.addEventListener(Event.ENTER_FRAME, obstacleMove);
function obstacleMove(evt:Event):void {

    //this is the same as a backwards for loop - for(var i:int=asteroids.length-1;i >= 0; i--)
    var i:int = asteroids.length;
    while(i--){  //since we are potentially removing items from the array/vector, we need to iterate backwards - otherwise when you remove an item, the indices will have shifted and you'll eventually get an out of range error
        asteroids[i].y += 5;
        if (asteroids[i].y > stage.stageHeight || asteroids[i].x > stage.stageWidth || asteroids[i].x < -asteroids[i].width || asteroids[i].y < -asteroids[i].height) {
            //object is out of the bounds of the stage, let's remove it

            removeChild(asteroids[i]); //remove it from the display
            asteroids.splice(i, 1); //remove it from the array/vector

            continue; //move on to the next iteration in the for loop
        }

        if (player.hitTestObject(asteroids[i])) {
            trace("HIT");
        }
    }
}

function randomizeArray(a:*, b:*):int {
    return ( Math.random() < .5 ) ? 1 : -1;
}