2012-03-31 11 views
1

UPDATEZufall hüpfende Bälle in Flash AS3 * Aktualisiert *

Ich habe jetzt diese aber nur ein Ball springt, wenn der Flash-Film

ausgeführt wird
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; 
    } 
} 

Dank jede Hilfe dankbar.

Antwort

2

Natürlich bewegt sich nur eine Kugel, denn in Ihrer movearray Funktion beziehen Sie sich nur auf eine Kugelinstanz. Da Sie Ihre Ball-Instanzen in einem Array speichern, müssen Sie das Array durchlaufen, um nach jeder Kugel zu suchen. Da jeder Ball sich unabhängig bewegt, ist es auch erforderlich, eine Reihe von Ballgeschwindigkeiten zu speichern.

Zum Beispiel:

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

Brilliant, danke und das Bit, das du nicht wusstest, war für eine andere Sache, die ich arbeitete, wo die Kugeln von links nach rechts bewegen und gehen .... wie Raum Eindringlinge – LochyMacleod

0

Um einen Ball zu bewegen, müssen Sie die Geschwindigkeit dafür angeben. Angenommen, ein Ball hat die Geschwindigkeit vx, vy. Und die Zeit zwischen aufeinanderfolgenden Aufrufen von movearray ist dt. So ist die neue Position des Balls ist:

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

Wenn ein Ball oberen oder unteren Teil des Bildschirms trifft Sie vy negieren müssen. Wenn der Ball das linke oder rechte Ende berührt, musst du vx negieren. Zum Beispiel ist vx positiv und somit bewegt sich der Ball nach rechts. Wenn es das rechte Ende erreicht, musst du vx = -vx machen, also ist vx jetzt negativ und der Ball beginnt sich nach links zu bewegen.

Also müssen Sie Geschwindigkeit speichern (kann zufällig sein, genau wie die Anfangspositionen) für jeden Ball und innerhalb movearray berechnen dt und neue Positionen. Und wenn ein Ball die Wand trifft, negiere die Geschwindigkeit entsprechend. Um den Treffer an der Wand zu testen, müssen Sie ihre x, y-Koordinaten mit der Bildschirmbreite, -höhe usw. vergleichen. Um dt zu berechnen, können Sie die Anrufzeit von movearray verfolgen.

dt = currentTime - lastTimeCalled; 
lastTimeCalled = currentTime; 

Beachten Sie, dass diese Methode nur auf Bildschirm Grenze kollidieren wird, wird es nicht erkennen Ball-Ball-Kollision.

+0

ja ich vergaß eine komplette Noob zu sagen, im, und ich nicht wirklich verstehen, dass :( – LochyMacleod

+0

Sie wissen nicht, die grundlegende High-School-Physik wie 'dx = vx * dt; x + = dx'? In diesem Fall habe ich Angst, dass ich keine einfachere Erklärung abgeben kann :-( – taskinoor

+0

Nach ein wenig googeln fand ich das: http://www.flashguide.org/Flash/Make -a-bouncing-ball-with-Flash.html Bitte überprüfen Sie den Code in Schritt 5. Das könnte helfen – taskinoor