2014-04-07 4 views
0

간단한 2D 게임 인 Arkanoid 게임에서 프로젝트를 진행하고 있습니다.충돌 감지 2D

나는 거의 모든 것을 올바르게 작동하지만, 볼과 벽돌이 충돌 할 때 (즉, 충돌 당시에는 벽과 같은 역할을하여 볼의 방향을 반대로 움직여야 함).

예를 들어 벽돌과의 충돌이 측면에 있거나 Y 축을 변경하지 않고 X 축 방향 만 투자해야하거나 그 반대의 경우처럼 충돌이 수평 또는 수직으로 발생하는지 확인하는 데 문제가 발생합니다.

나에게 확인 코드를 찾지 못했습니다.

public void detectCollisionWithBricks() { 
    for (int i = 0; i < brickGroup.length; i++) { 
     for (int j = 0; j < brickGroup[i].length; j++) {     
      if (brickExists[i][j]) {      
       if (getEllipse().intersects(
         brickGroup.brick[i][j] 
           .getRectangle())) { 
        incY*=-1; 
        incX*=-1; 

        brickExists[i][j] = false; 
       } 
      } 
     } 
    } 
} 

코드 :이 코드의 일부를 이해하지 않는 경우

-brickGroup: bidimensional array of bricks 

-brick: class painting a brick in the panel 

-brickExist: bidimensional array whit se same size as brickGroup, if false, doesn't paint the brick. 

-getEllipse(): returns an Ellipse2D.Double, with the coordinates of the ball. 

-getRectangle(): returns an Rectangle2D.Double, with the coordinates of the brick. 

-incX: increases the X position of the ball. 

-incY: increases the Y position of the ball. 

가 물어보세요. 사전에 내 영어 :(

감사에 대한

죄송합니다

답변

0

당신은 항상 동시에 치수를 반전 할 수 없습니다.

incY*=-1; 
incX*=-1; 

당신은 독립적으로 각 차원을 처리해야 벡터를 사용해보십시오,이 참조 : 2d collision response between circles

경우에 따라 더 간단 할 수도 있습니다. exi에 따라 달라질 수 있습니다. incX 값 또는 incY 값. incX가 0이 아니고 incY가 0이면 가로로 이동합니다. 나는 1/-1 있지만 일부 가변 속도를 사용하고 반전하지 권합니다 다음과 같이

incY = -incY; 
incX = -incX; 
0

내가 접근 방법을 추천 할 것입니다;

는 첫째로 필요에 따라 격자의 크기를 변경할 수 있습니다 잠재적으로 2 차원 배열

bricks = new int[width][height]; 

로 벽돌을 나타냅니다. 이렇게함으로써 당신은 주어진 시간에 볼의 위치에 따라 충돌을 확인하고 시간이 소요 검사 루프

if (bricks[ballx/brickwidth][bally/brickheight] > 0) { 
    //we have a collision 
} 

다음 당신이 수평 또는 수직 충돌 여부를 확인하실 수 있습니다에게있을 수 없다는 것을 의미 할 수 게임의 위치에 따라는 당신이 볼과 벽돌의 중심 사이의 라인의 각도를 측정하면이 또한 벽돌

0

을의 모서리에 충돌을 처리해야

if (bricks[ballx/brickwidth][bally/brickheight] > 0) { 
    if (ballx % gridwidth < tolerance) { 
     incx*=-1; 
    } 
    if (bally % gridheight < tolerance) { 
     incy*=-1; 
    } 
} 

허용 오차 (쉬운에와 눈금 선을 사용하여 계산)을 사용하여 볼을 이동할 방향을 결정할 수 있습니다.

또한 +1 또는 -1 대신 부동 소수점 정밀도로 방향을 변경할 수 있습니다.