2013-04-02 3 views
3

글쎄 나는 이것에 대해 많은 것을 수색 했어.하지만 내가 알 수있는 것은 pi * direction과 같은 말이다. 방향은 공이 들어오는 각도 다. 하지만 제 문제는 볼을 처음부터 들어올 각도를 어떻게 얻을 수 있을지 모르겠습니다. 그래서 저는 이것을 할 수 없습니다. 아무도 설명 할 수있는 방법은 볼이 외륜 모자를 쳤다 각도를 계산할 것입니다, 속도가 공을 리바운드 후 부여해야합니다 각도와 다음에 의해 증가해야 그게 끝내 줄 겁니다.Pong 패들 충돌 속도와 리바운드 각도

모든 응답을 보내 주셔서 감사합니다.

/* General Paddle Properties */ 
double PaddleLength = 80; //Down-wards length of the paddle 
double PaddleWidth = 8; //How thick the paddle is 

/* Positioning of user control paddle */ 
double UserPaddleTop = 0; //How far away from the top of the screen the paddle is 
double UserPaddleLeft = 10; //How far left from the side of the client rectangle it is 

/* Positioning of ai controled paddle */ 
double AIPaddleTop = 0; 
double AIPaddleLeft = 10; 

/* Ball properties and position */ 
double BallSize = 5; 
double BallTop = 0; 
double BallLeft = 0; 
double BallSpeedY = -0.01, BallSpeedX = -0.03; 

방법 :

private void UpdateBall() 
     { 
      if (((int)(UserPaddleLeft + PaddleWidth) == (int)BallLeft) && !((int)UserPaddleTop > (int)BallTop) && !((int)(UserPaddleTop + PaddleLength) < BallTop) 
       || ((int)(AIPaddleLeft - PaddleWidth) == (int)BallLeft) && !((int)AIPaddleTop > (int)BallTop) && !((int)(AIPaddleTop + PaddleLength) < BallTop)) //Collided 
      { 
       BallSpeedX = -BallSpeedX; //The height is 800 the balltop is 300 
       BallSpeedY = Math.Cos(BallSpeedX 
      } 

      if ((int)BallTop == 0 || (int)BallTop == ClientRectangle.Height) //Hit the top 
      { 
       BallSpeedY = -BallSpeedY; 
      } 

      if ((int)BallLeft == 0) 
      { 
       System.Diagnostics.Debug.WriteLine("AI gets one point!"); 
       BallSpeedX = -0.03; //Goes towards the user AI has scored 
       Scores[0]++; 
       this.Title = "Pong Testing - Scores: " + Scores[0] + "|" + Scores[1]; 
       ResetAll(); 
      } 
      else if ((int)BallLeft == ClientRectangle.Width) 
      { 
       System.Diagnostics.Debug.WriteLine("User gets one point!"); 
       BallSpeedX = 0.03; //Goes towards the AI user has scored 
       Scores[1]++; 
       this.Title = "Pong Testing - Scores: " + Scores[0] + "|" + Scores[1]; 
       ResetAll(); 
      } 

      BallLeft = (BallLeft + BallSpeedX); 
      BallTop = (BallTop + BallSpeedY); 
     } 

     private void UpdateAI() 
     { 
      if(!((int)(BallTop + PaddleLength) == 0) && !((int)(BallTop + PaddleLength) >= ClientRectangle.Height)) //Make sure updating it pos won't make it go out of bounds 
       AIPaddleTop = BallTop; //Change to real ai by using offset 
     } 

     protected override void OnUpdateFrame(FrameEventArgs e) 
     { 
      base.OnUpdateFrame(e); 

      if ((int)UserPaddleTop != 0 && Keyboard[Key.Up]) 
      { 
       UserPaddleTop = UserPaddleTop - MoveSpeed; 
      } 
      else if (Keyboard[Key.Down] && (int)(UserPaddleTop + PaddleLength) != ClientRectangle.Height) 
      { 
       UserPaddleTop = UserPaddleTop + MoveSpeed; 
      } 
     } 

UPDATE 1 :

내 코드는 다음과 같이 (그래서 당신은 내가 어떻게 할 방법의 아이디어를 얻을 수 있습니다) 작동 모든 사람들의 도움 덕분에 나는 그것에 대한 기본적인 코드를 만들 수 있었지만 지금은이 코드가 너무 빨라서 공을 보내서 얻을 수 없다. 아무도 제발 도와 줄래?

코드 (공 스핀 마찰 패들 운동 등을 무시하고) 가장 단순한 의미에서

 double AngleNormal = Math.Atan2(BallSpeedX,BallSpeedY); 
     double AngleBallMovement = Math.Sqrt((BallSpeedX * BallSpeedX) + (BallSpeedY * BallSpeedY)); 
     double ReflectionAngle = AngleNormal - (AngleBallMovement - AngleNormal); 
     BallSpeedY = Math.Sin(ReflectionAngle); 
     BallSpeedX = Math.Cos(ReflectionAngle); 
+1

이것은 수학 문제이며 프로그래밍과 관련이 없습니다. –

+2

저는 프로그래밍 방식으로 값을 계산하고 있기 때문에 그럴 것이라고 말하고 싶지만 논쟁을하기 위해 여기에 서 있지 않습니다. 그것이 실제로 수학 일 경우 미안 해요. – user1763295

+0

공이 풀린 첫 번째 각도를 모르십니까? 거기에서 공이 패들과 그 이후의 각도에 부딪 힐 각도를 계산할 수 있습니다. Mitch와 동의하지만, 이것은 프로그래밍보다는 수학입니다. 좋은 퍼즐 비록 –

답변

0

정상 표면에 입사의 각도를 해결하고 반전한다. 단순한 물리 충돌과 관련하여, 입사각은 충돌 지점에서의 패들의 표면 법선에 대한 볼의 이동 각이다. 진정한 직사각형 패들 통상의 매우 간단한 사례를 들어

angleReflect = angleNormal - (angleBallMovement - angleNormal) 

동작의 외륜의 축에 직교 될 것이다 : 임의의 좌표 공간에서의 계산은 같은 것이있다. 반사각은 항상 공이 움직이는 방향의 함수가 될 것이기 때문에 공에 대한 제어력은 거의 없습니다.

공이 충격을주는 외륜의 중심으로부터의 거리를 기준으로 외륜 표면의 법선 벡터를 변경하여 곡선 패들 표면을 시뮬레이션 할 수 있습니다. 이를 통해 플레이어는 패들 중앙에서 볼을 가로 채서 볼의 이동 각을 변경하여 가파른 각도 또는 더 얕은 각도의 반사 각도를 얻을 수 있습니다.

마력을 추가하거나 스핀 및 패들 모션 계산을 믹스에 추가하는 것이 가장 재미 있습니다. 추적하기 위해 대부분의 선수에 대한 좀 많이 가져옵니다,하지만 몇 가지 흥미로운 트릭 샷 :

수 있습니다 -이 각도를 계산하는 방법 에 관해서는

, 삼각 함수 Math.atan2(x, y) 당신에게 줄 것이다 주어진 [x, y] 속도 벡터에 대한 각도 (라디안) 및 Math.sqrt(x*x + y*y)은 이동 벡터의 길이를 제공합니다. 이렇게하면 충격의 지점을 얻기 위해 패들의 표면과 교차 할 수있는 선이 생깁니다 (정확도에 따라 공의 반경을 고려함). 운동 '선'의 나머지 부분은 입사각과 추가 한 다른 계산을 사용하여 반영되어 공의 최종 위치와 새로운 속도 벡터를 제공합니다.이 각도를 계산하기 위해서는

+0

내 코드가 작동하는 방식을 살펴볼 수 있겠습니까? 내 제안이 훌륭하지만 내 ballY 이동이 이루어지는 방식에 맞는지 확실하지 않습니다. 이것은 기본적으로 증가분으로 이루어지며, 프레임이 렌더링 될 때마다 ballY가 ballY + increment로 설정됩니다. 그래서 각도를 반영하는 것이 실제로 염두에두고 적용될 것인가, 아니면 당신이 그것을 할 다른 방법이 있습니까? – user1763295

+0

@ user1763295 귀하의 코드는 직각 좌표 ('BallSpeedX' 및'BallSpeedY')를 사용하여 속도 벡터를 설명합니다. 이를 극좌표 ('angle'과'magnitude')로 변환하면 반사를 계산하는 더 간단한 방법을 얻을 수 있습니다. 그런 다음 업데이트를 위해 직각 좌표로 다시 변환 할 수 있습니다. 그것들은 서로 바꿔서 동일한 정보를 표현하는 단지 두 가지 방법이 있으므로 특정 문제에 적용 할 수있는 것을 사용하십시오. – Corey

+0

당신에게 미안하지만 나는 당신이 말했던 것처럼 무엇을했으며 그 각도 수학을 다른 포스트에서 발견 한 아이디어와 결합 시켰습니다. 그리고 이제 외륜이 공을 치면 공을 치지 않고 타격을 가한 사람 공은 너무 빨리 움직이기 때문에 공이 포인트를 얻습니다. 내가 가지고있는 코드를 보여주기 위해 원래 게시물을 업데이트했습니다. – user1763295

1

을 :)위한

레이저 포인터와 거울이 좋은 시각화 도구, 당신은 볼이 움직이는 어떤 방향으로 알고있다. 당신은 당신의 BallSpeedXBallSpeedY 정보 값. 원래 위치가 (0, 0), BallSpeedX이 2이고 BallSpeedY이 3이라고 가정합니다. 따라서 한면이 2이고 다른면이 3 인 직각 삼각형을 가지며 간단한 삼각법을 사용하여 각도를 계산할 수 있습니다.

이제 패들이 X 축과 평행하므로 아마 그 축에 대한 각도를 계산해야합니다. 하지만 너무 힘들어서는 안됩니다.

공이 패들에 닿는 각도를 알면 180도 (또는 pi 라디안)에서 그 값을 빼면 새로운 각도가됩니다. 따라서 볼이 60 도의 패들에 닿으면 120도에서 튀어 나올 것입니다. 스핀, 완벽한 탄력, 패들 운동 등이 없다고 가정합니다.

공이 패들에서 떨어질 때의 속도는 사용자가 결정합니다. 당신은 에너지 손실이 없다고 추측 할 수 있고 계속해서 볼을 저어 오는 속도를 볼에게 줄 수 있습니다. 또는 바운스가 볼의 에너지의 10 %를 흡수한다고 말할 수 있습니다.이 경우 볼의 속도를 10 % 줄이려고합니다 (단, X 및 Y 속도 값에서 10 %를 뺀 것이 아니라, 각도를 바꿀 것이다).

진흙으로 지금 지우기?