闪存中的随机弹跳球AS3 *更新*

时间:2012-03-31 07:17:55

标签: actionscript-3 flash actionscript

更新

我现在有这个但闪光电影运行时只有一个球反弹

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 个答案:

答案 0 :(得分:2)

当然只有一个球移动,这是因为在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;
        }

    }
}

答案 1 :(得分:0)

要移动球,您需要为其指定速度。假设一个球有速度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;

注意,此方法只会在屏幕边界碰撞,不会检测球 - 球碰撞。