2016-11-29 11 views
1

이것은 내 첫 번째 커다란 프로그래밍 프로젝트이므로 버그를 몇 주 동안이나 발견 한 초보자입니다. 어쩌면 누군가가 도울 수 있습니다. :)사각형의 가장자리와 충돌 할 때 볼이 튀어 오름

저는 간단한 2D 게임을 만들고 있습니다. 스마트 폰의 피칭과 요잉을 통해 공을 제어 할 수 있습니다. 공이 사각형 - 장애물의 정확한 가장자리에 부딪 칠 때마다 먼저 공으로 들어가서 무작위로 점프합니다. 장애물이 직선을 만들 때마다 발생하지 않습니다.

디버깅 중 잠시 후 나는 게임의 물리학 부분에 오류가 있어야한다고 확신합니다. 코드는 다음과 같습니다.

 float var = gameView.screenSize()/2; 
    // If the player touches the barrier, its speed will invert 
    for(RectF r : barrier) { 
     if(playerSpeedX > 0 && playerX > r.left - var && playerX < r.right + var && playerY >= r.top && playerY <= r.bottom) { playerX = r.left - var; playerSpeedX = -playerSpeedX;} // left 
     if(playerSpeedX < 0 && playerX > r.left - var && playerX < r.right + var && playerY >= r.top && playerY <= r.bottom) { playerX = r.right + var; playerSpeedX = -playerSpeedX;} // right 
     if(playerSpeedY > 0 && playerY > r.top - var && playerY < r.bottom + var && playerX >= r.left && playerX <= r.right) { playerY = r.top - var; playerSpeedY = -playerSpeedY;} // top 
     if(playerSpeedY < 0 && playerY > r.top - var && playerY < r.bottom + var && playerX >= r.left && playerX <= r.right) { playerY = r.bottom + var; playerSpeedY = -playerSpeed;} //bottom 
    } 

var는 장애물 크기의 절반을 나타냅니다.

어쩌면 누군가 나를 도울 수 있습니다. 미리 감사드립니다. :)

+0

장애물이 * 직사각형 인 경우 * 단일 * 값 "* 장애물 크기 *의 절반"은 무엇을 의미합니까? 단일 치수는 * 사각형 (오히려 특정 직사각형)에 대해서만 의미가 있습니다. – Clifford

+0

코드가 주어질 확률이 높은 "볼의 크기 * 절반"을 의미하지 않았다는 것이 확실합니까? – Clifford

+0

게임 영역은 16 : 9 그리드로 나뉘어 있으므로 공과 장애물은 동일한 그리드 크기를 사용합니다. 그리고 예, 장애물은 모두 사각형입니다. 죄송합니다. –

답변

0

필자는 필요한 정보가있을 경우 부재중에 몇 가지 가정을하고 더 나은 이해와 디버그 기능을위한 코드를 제시했습니다. 이것만으로도 문제를 직접 해결할 수 있지만 어쨌든 다른 사람들에게 도움을 요청할 때 장난감이 어떻게 질문을 제시해야 할 것입니다. 하나 개의 조건 if 블록이 명확하게 표시되고, 나머지는 같은 패턴에 따라 수 있습니다 나는 이러한 가정이 정확하지 확신하지만, 아마도 제안

// If the player touches the barrier, its speed will invert 
    for(RectF r : barrier) 
    { 
     if(playerSpeedX > 0 &&     // If moving right and ... 
      playerX > r.left - var &&   // ... ball edge past left of r and 
      playerX < r.right + var &&   // ... ball edge not past right of r and 
      playerY >= r.top &&     // ... ball centre below top of r and 
      playerY <= r.bottom)     // ... ball centre above top of r 
     { 
      playerX = r.left - var;   // Move ball to the left 
      playerSpeedX = -playerSpeedX; // Change motion direction 
     } 

     ... 
    } 

을 그 조건 힘에서 두 번째와 세 번째 부울 하위 표현 >에서 >=으로 변경하면 \\Move ball to the left 문이 필요하지 않습니다.

선명도와 각 하위 표현식의 목적을 명확하게 설명 할 수있는 기능을 제외하고 코드를 이런 식으로 레이아웃하는 이점은 행 지향 소스 수준 디버거에서 코드를 단계별로 실행할 때 동작을 확인할 수 있다는 것입니다 각각의 하위 식과 문장은 개별적으로 모든 일을 한꺼번에 처리하고 왜 그런지 (또는 적어도 덜 명백한 이유는) 알지 못합니다. debugger을 사용하는 것은 어쨌든 SO에서 질문을 게시하는 것과 같은 개발 문제를 해결하는 훨씬 더 효율적인 방법 일 것입니다.