更新
我现在有这个但闪光电影运行时只有一个球反弹
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;
}
}
感谢任何帮助表示感谢。
答案 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;
注意,此方法只会在屏幕边界碰撞,不会检测球 - 球碰撞。