2012-03-31 7 views
1

UPDATE임의의 수신 거부 공 * *

지금이 있지만 플래시 무비가 어떤 도움이 평가

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

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

+0

당신은'DX = VX의 * DT는 같은 기본 고등학교 물리를 모르는 :(이해; x + = dx'? 그런 경우에 나는 더 쉬운 설명을 할 수 없을 것이라고 두려워합니다 :-( – taskinoor

+0

조금 쫓기면서 나는 이것을 발견했습니다 : http://www.flashguide.org/Flash/Make -a-bouncing-ball-with-Flash.html. 단계 5의 코드를 확인하십시오. 도움이 될만한 질문이 있습니다. – taskinoor