2012-03-31 55 views
1

UPDATE随机闪光灯AS3弹跳球*更新*

我现在有这个,但是当flash动画运行

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

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

辉煌,感谢和你不知道的另一件事是我有工作的地方,球从左到右移动,并下降....像太空入侵者 – LochyMacleod 2012-03-31 17:46:59

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; 

需要注意的是,这种方法只会在屏幕边界发生碰撞,不会检测到球 - 球碰撞。

+0

是啊,我忘了说我是个完整的小白,我真的不明白:( – LochyMacleod 2012-03-31 07:50:32

+0

你不知道基本的高中物理像'DX = VX * DT; x + = dx'?在这种情况下,我害怕我无法做出更简单的解释:-( – taskinoor 2012-03-31 07:53:59

+0

经过一点Google搜索,我发现这个:http://www.flashguide.org/Flash/Make -a-bouncing-ball-with-Flash.html。请检查第5步中的代码。这可能有帮助。 – taskinoor 2012-03-31 07:56:33