2015-01-27 6 views
2

나는 원형 모양의 패들이 원형 경계 안에 있어야하는 공을 굴절시키는 Pong-360 게임을 가지고 있습니다. 공이 경계선에 올랐을 때 패들과 마주 치지 않으면 경계선을 벗어나지 않고 선수가 마지막으로 공 점수를 치게됩니다. 내가 가지고있는 문제는 외륜에 충격을 가하면 올바른 방향으로 공을 돌려 보내는 것입니다. 공이 패들의 특정 절반에 닿으면 그 방향으로 튀어 나와야하지만, 경계의 반대쪽으로 다시 돌아 가야합니다. Screenshot of game with added notes 바로 지금 나는 경계를 16 개의 슬라이스로 나누고 충격을받은 슬라이스에 따라 범위 내에서 임의의 각도로 무작위로 각도를 지정하여 튀어 오름을 얻었습니다. 내 수학이 정확하지 않기 때문에 이것은 의도 한대로 작동하지 않습니다. 그러나 어떤 식 으로든 다시해야합니다. 공이 어디를 가든 상관없이 경계의 반대쪽 반으로 공을 되돌릴 수있는 각도를 얻는 방법을 알 수는 없습니다. 나는 공의 이동 방향, 경계 내의 현재 위치, 접촉을 한 외륜의 위치와 같은 변수로부터 각도를 얻으려는 시도를 여러 번했지만, 지금까지 나는 실패를 경험했다.원 안에 공이 튀어 오름

public void bounce(){ 

     boolean changeAngle = false; 

     if(bluePaddle.intersects(ball.getX(), ball.getY(), ball.getDiameter(), ball.getDiameter())){ 

      lastHit = 1; 
      changeAngle = true; 
     } 
     else if(redPaddle.intersects(ball.getX(), ball.getY(), ball.getDiameter(), ball.getDiameter())){ 

      lastHit = 2; 
      changeAngle = true; 
     } 

     if (changeAngle){ 

      // Right side of boundary 
      if (ball.getX() > center_x) { 

       // Quadrant 4 
       if (ball.getY() > center_y){ 

        // Slice 13 
        if (ball.getY() - center_y > Math.sin(3 * Math.PI/8)){      
         angle = (double) (randNum.nextInt(90) + 90); 
        } 
        // Code for other slices omitted 
       }//end Quadrant 4 
       // Code for other quadrants omitted 
      }//end right side of boundary 

      // Code for Left side of boundary omitted 

      ball.setDx((int) (speed * Math.cos(Math.toRadians(angle)))); 
      ball.setDy((int) (speed * Math.sin(Math.toRadians(angle)))); 
     }//end if (changeAngle) 

     bouncing = false;  
    }//end bounce method 

을 당신이 볼 수 있듯이,이 각도는 단순히 내가 각 슬라이스에 대한 좋은 것이라고 생각 범위 내에서 무작위로 생성되고, 지금처럼 다음과 같이 현재, 공의 방향을 변경하기위한 코드입니다. 강조하기 위해 필자는 주로 수학에 대한 도움이 필요하며 Java로 구현하는 것은 보조입니다. 컴파일 및 실행되는 전체 코드 (모든 .java 및 .class 파일)는 다음에서 찾을 수 있습니다. https://github.com/pideltajah/Pong360/tree/master/Pong360

주 방법은 Pong.java 파일에 있습니다.

도움이 될 것입니다.

+0

이 가능하지 않는 것 같습니다 그린 화살표 : 정규화 된 차이 벡터

velBall = normalize(p - pBall) 

희망이 의미

[정정했다 EDIT] 있습니다. 외륜이 가장 오른쪽의 포션에 있으면 그 휨이 자신의 측면에 부딪히게됩니다. 더 나아가 매우 합리적인 방법으로 해결할 수없는 것 같습니다. 예를 들어, 빨간 외륜이 위에있는 경우, 외륜의 오른쪽을 치면 빨간색의 벽에 공을 보냅니다. – dwn

+0

벡터를 벡터에 매핑하여 중심선을 강타 할 수도 있지만 전략에 리바운드를 사용하는 것이 좋습니다 – dwn

+1

또는 원형을 분기로 나눌 수 있으며 각 플레이어는 두 개의 패들을 180도 간격으로 제어 할 수 있습니다 (또는 정사각형의 경우 반대편). 그건 멍청한 생각인데, 제 변명은 늦었습니다. – dwn

답변

1

먼저 패들에 닿은 부분을 찾으십시오. 빨간 패들의 경우처럼 이렇게 할 수 있습니다 (파란색 패들이 비슷하지만, ang0과 ang1을 교환해야 할 수도 있습니다).

원의 두 변의 각도 ang0와 ang0 하부 에지이다 ANG1, 및 ANG1가

이 원의 중심 포인트라고 가정 상부 에지 (0, 0) 볼이 볼 것 pBall = (xBall, yBall)

시점에서 특정 각도에 있어야 함 ballAng = atan2 (yBall, xBall) [ang0 .. ang1] 범위 내

이제 패들의 각도 위치를 매개 변수로 변환하십시오 ko [0 .. 1].

이 원 중심선의 바닥 위치를 점 P0라고 말하고, 중심선의 상단은 다음과 같습니다 당신은 이제 당신은, 중심선에 매핑과 같이 할

u = (ballAng - ang0)/(ang1 - ang0); 

으로 이것을 정의 할 수 있습니다

지금 공의 속도 벡터로

p = p0 + u * (p1 - p0) 

로 중심선과의 교점을 정의 P1 점은, 이것은을 할 필요가

+0

시간을내어 회신 해 주셔서 감사합니다. 나중에 귀하의 솔루션을 구현하고 추가 업데이트를 시도 할 것입니다. 다시 한번 감사드립니다. –

+0

정말 이상하게 보이기를 원한다면 대신 퐁 사각형에서 퐁 원으로의 직접 맵핑으로 처리 할 수 ​​있습니다.하지만 공이 따라 가면서 볼이 커브를 만듭니다. – dwn

+0

마지막으로 하나의 개념 : 튀어 오르는 것이 정상적으로 일어나도록 할 수 있지만, 중심선에 일종의 자력을 추가하십시오 – dwn

관련 문제