2013-04-25 3 views
0

저는이 문제를 아주 오랫동안 고집 해 왔으며, 주위를 검색하고 시도했지만 아무것도 작동하지 않습니다. 몇 가지 설명은 내가 프로그래밍 전반에 매우 새로운 점을 이해하고 배울 많은 것을 얻은 것처럼 이해하기가 어렵다.플래시로 브레이크 아웃 : 내 벽돌을 향상시키는 데 도움이 필요합니다. 볼 충돌

나는 두 가지 문제

1

있습니다 속도가 너무 빠른 때로는 때 볼이 늘 벽돌과 충돌.

2 : 공은 2 개의 벽돌을 치는 것이 가능합니다. 두 가지 문제는 내 유형의 충돌 감지가 제대로 작동하기에 60fps로 충분하지 않다는 사실과 관련이 있습니다.

가능한 한 간단한 방법으로 충돌을 감지하여이를 방지 할 수있는 사람이 필요합니다.

private function checkCollision(): void { 
    grdx = Math.floor((ball.x)/28); 
    grdy = Math.floor((ball.y)/14); 
    ngrdx = Math.floor((ball.x + dx)/28); 
    ngrdy = Math.floor((ball.y + dy)/14); 
    var flipX: Boolean = false; 
    var flipY: Boolean = false; 
    if ((grdy <= level.length - 1) && 
     (ngrdy <= level.length - 1) && 
     (grdy >= 0 && ngrdy >= 0)) { 
    if (testBlock(grdx, ngrdy)) { 
     flipY = true; 
     paddleFlag = 1; 
    } 
    if (testBlock(ngrdx, grdy)) { 
     flipX = true; 
     paddleFlag = 1; 
    } 
    if (testBlock(ngrdx, ngrdy)) { 
     flipX = true; 
     flipY = true; 
     paddleFlag = 1; 
    } 
    dx *= flipX ? -1 : 1; 
    dy *= flipY ? -1 : 1; 
    } 
} 
private function testBlock(xPos: int, yPos: int): Boolean { 
    if (level[yPos][xPos] > 0 && level[yPos][xPos] != 13) { 
    trace("hit on X,Y"); 
    level[yPos][xPos] = 0; 
    breakBlock("Block_" + yPos + "_" + xPos); 
    trace("Block: " + totalBreaks + "/" + totalBlocks); 
    return true; 
    } 
    return false; 
} 
private function breakBlock(blockName: String): void { 
    if (this.getChildByName(blockName)) { 
    this.removeChild(this.getChildByName(blockName)); 
    totalBreaks++; 
    } 
} 

내 나쁜 영어에 대한 당신과 죄송합니다, 감사의 나의 motherlanguage :

여기에 내 현재의 충돌 코드입니다.

+3

, 당신의 벽돌 수평 정렬과 수직으로, 당신은 그리드 대 공을 쓸어 하나를 사용하여 주어진 후 그 지역을 확인하는 볼에 가장 가깝게 시작하여 경로를 겹칩니다. 충돌이 발생하면 벽돌을 깨고 새로운 각도, 속도 및 좌표를 계산합니다. – Vesper

답변

1

하나의 솔루션이 주어진에 작은 반복, 여러 번 공을 이동하는 것입니다이 틀.

예를 들어 나는 마지막 프레임에서 경과 한 시간을 기준으로 볼을 이동한다고 가정하고이 솔루션을 제공합니다.

마지막 프레임 업데이트 이후 30 밀리 초가 경과했다고 가정합니다. 이 경우 시간 경과에 따라 15 밀리 초를 사용하여 해당 프레임에서 두 번 이동/충돌을 업데이트합니다.

원하는 충돌의 해상도가 높을수록 더 많은 반복을 수행 할 수 있습니다. 여기

은 예입니다 : "AABB 청소 알고리즘"라는 일이있다

// class declarations 
var lastFrame:Number; 
var iterationsPerFrame:int; 

function startGame():void 
{ 
    // lets specify 3 updates per frame 
    iterationsPerFrame = 3; 

    // save initial time 
    lastFrame = getTimer(); 

    // create your listener 
    addEventListener(Event.ENTER_FRAME, update); 
} 

function update(e:Event):void 
{ 
    var currentFrame:Number = getTimer(); 
    var deltaTime:Number = (currentFrame - lastFrame)/1000; 

    var iterationDelta:Number = deltaTime/iterationsPerFrame; 

    for (var index:int = 0;index < iterationsPerFrame;index++) 
    { 
      // I'm assuming dx,dy are the velocity of the ball, in pixels per second 
      ball.x += dx * iterationDelta; 
      ball.y += dy * iterationDelta; 
     // check collision 
    } 


    // set lastFrame to the currentFrame time, preparing for next frame 
    lastFrame = currentFrame; 

    // after this, your frame is going to render 
} 
+0

정확하게 내가하는 일, 어떻게하면 60fps보다 빨리 반복 할 수 있을까요? – Leyon

+0

프레임 당 얼마나 많은 업데이트/충돌 반복을하고 있습니까? 충분하지 않으면 더 많은 반복 작업을 수행합니다. 권리 ? 해결책은 게임을 60fps보다 빠르게 반복하지 않는 것이고 목표는 더 빠른 속도로 이동/충돌을 반복하는 것입니다. 당신이 만드는 각 부분은 프레임마다 또 다른 반복입니다. 권리 ? – prototypical

+0

게임이 60fps로 실행 중이고 운동/충돌이 2 회 반복되는 경우 이동 및 충돌이 120fps로 실행된다는 것입니다. 해당 상황에서 각 반복마다 이동 업데이트에서 사용하는 경과 시간이 1/2인지 확인해야합니다. – prototypical

0

각 프레임 (A)의 속도, 패들이 얼마나 멀리 떨어져 있는지 (B), A > B이 해당 프레임의 충돌을 수동으로 트리거하는 경우 볼의 움직임을 계산할 수 있습니다.

당신은 본질적으로 XY 좌표 공 좌표 모든 벽돌 XY을 확인하고, 그래서 벽돌이 배열에 저장되어있는 경우이된다 : SQRT (SQRD (p2.x -을 P1.x) + SQRD (p2.y - p1.y))

for(var i=0; i<brickArray.length; i++) 
{ 
    var distance:Number = Math.sqrt((brickArray[i].x - ball.x) * (brickArray[i].x - ball.x) + 
            (brickArray[i].y - ball.y) * (brickArray[i].y - ball.y)); 
} 

이 고속 콜리슨 감지에 아주 좋은 튜토리얼 : http://www.newgrounds.com/bbs/topic/1072673

+0

나는 당신의 해결책을 들여다 보았다. 나는 그것이 효과가 있다고 생각한다. 방금 공과의 거리를 비교하기 위해 벽돌의 x와 y 좌표를 계산하는 방법을 알아야합니다. – Leyon

+0

몇 가지 수식을 사용하여 답변을 업데이트하겠습니다. –

+0

오키, 고맙다. – Leyon