Случайные прыгающие шары во флэш-памяти AS3 * Обновлено * - PullRequest
1 голос
/ 31 марта 2012

UPDATE

Теперь у меня есть это, но только один мяч отскакивает, когда запускается флэш-фильм

var array:Array = new Array;

var dx:Number = Math.random() * 20;

var dy:Number = Math.random() * 10;

var velX:Number = 5;

var velY:Number = 5;


addEventListener(Event.ENTER_FRAME, movearray);


for (var i:Number = 0; i < 20; i++) {

    var ball:Ball = new Ball();

    ball.x = Math.random() * 550;

    ball.y = Math.random() * 400;

    addChild(ball);

    array.push(ball);

}


function movearray(evt:Event):void {

    ball.x += velX;

    ball.y += velY;

    if (ball.x > stage.stageWidth - ball.width / 2 || ball.x < 0 + ball.width /2){
      velX *= -1;
    }
    else if (ball.y > stage.stageHeight - ball.height / 2 || ball.y < 0 + ball.height /2){
      velY *= -1;
   }
}

Спасибо, любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 31 марта 2012

Конечно, движется только один шар, потому что в вашей функции movearray вы имеете в виду только один экземпляр шара. Поскольку вы храните ваши экземпляры мяча в массиве, вы должны пройти через этот массив, чтобы проверить каждый шар. Кроме того, поскольку каждый шар движется независимо, необходимо также хранить массив скоростей мяча.

Например:

import flash.geom.Point;

var numBalls:uint = 20;
var arrayBalls:Array = new Array();
var arrayVels:Array = new Array();

//I don't know what is this for
//var dx:Number = Math.random() * 20;
//var dy:Number = Math.random() * 10;

var initialVelX:Number = 5;
var initialVelY:Number = 5;

addEventListener(Event.ENTER_FRAME, movearray);

for (var i:uint = 0; i < numBalls; i++)
{

    var ball:Ball = new Ball();

    ball.x = Math.random() * 550;
    ball.y = Math.random() * 400;

    addChild(ball);

    arrayBalls.push(ball);

    //use a Point to store velocities in two axis
    //you could also set random starting velocities
    //so each ball would move differently initially
    var vel:Point = new Point(initialVelX,initialVelY);

    arrayVels.push(vel);

}

function movearray(evt:Event):void 
{
    var ball:Ball;
    var vel:Point;

    for (var i:uint = 0; i < numBalls; i++)
    {

        ball = arrayBalls[i];
        vel = arrayVels[i];

        ball.x += vel.x;
        ball.y += vel.y;

        if (ball.x > stage.stageWidth - ball.width / 2 || ball.x < 0 + ball.width /2)
        {
            vel.x *= -1;
        }
        else if (ball.y > stage.stageHeight - ball.height / 2 || ball.y < 0 + ball.height /2)
        {
            vel.y *= -1;
        }

    }
}
0 голосов
/ 31 марта 2012

Чтобы переместить шар, вам нужно указать скорость для него. Предположим, что шар имеет скорость vx, vy. И время между последовательным вызовом movearray составляет DT. Итак, новая позиция мяча:

dx = vx * dt;
dy = vy * dt;
xNew = xOld + dx;
yNew = nOld + dy;

Когда мяч попадает в верхнюю или нижнюю часть экрана, вам нужно отрицать vy. Когда мяч попадает в левый или правый конец, вам нужно отрицать vx. Например, vx является положительным и, таким образом, мяч движется вправо. Когда он попадает в правый конец, вам нужно сделать vx = -vx, так что vx теперь отрицательный, и мяч начнет двигаться влево.

Таким образом, вы должны хранить скорость (может быть случайной, как и начальные позиции) для каждого шара, а внутри movearray вычислять dt и новые позиции. И если какой-либо шар ударяется о стену, тогда соответственно уменьшите скорость. Чтобы проверить удар по стене, вам нужно сравнить их координаты x, y с шириной экрана, высотой и т. Д. Чтобы рассчитать dt, вы можете отслеживать время вызова movearray.

.
dt = currentTime - lastTimeCalled;
lastTimeCalled = currentTime;

Обратите внимание, что этот метод будет сталкиваться только на границе экрана, он не будет обнаруживать столкновение шара с шариком.

...