2012-03-31 54 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