【发布时间】:2013-04-02 23:54:23
【问题描述】:
好吧,我为此搜索了很多,但我只能找到人们说的 do pi * direction,我假设方向是球进入的角度。但我的问题是,我不知道我是如何得到球进入的角度的,所以我无法做到这些。 如果有人能解释我将如何计算球撞击桨帽的角度、反弹后球应给予的速度量以及届时应增加的角度,那就是太棒了。
感谢您的所有回复!
我的代码工作如下(所以你可以知道我想怎么做):
/* 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;
}
}
更新 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);
【问题讨论】:
-
这是一道数学题,与编程无关。
-
我会说它确实如此,因为我正在以编程方式计算值,但我不是在这里争论。对不起,如果它实际上只是数学。
-
你会不知道球被释放的第一个角度吗?从那里你可以计算出球撞击球拍的角度以及之后的角度。尽管我确实同意 Mitch 的观点,但这更多的是数学而不是编程。不错的谜题
-
没有角度是我的问题,它是用一个值释放的,每次渲染一帧时,bally 被设置为 ballY+value 从而向上或向下移动它。
-
在大多数版本的 Pong 中,入射角无关紧要,除了确定方向。在靠近桨的中心击球时,球会从中心以适中的角度击球,而在靠近桨的边缘击球时,球会从中心以更严重的角度击球。