gpt4 book ai didi

c# - Pong Paddle 碰撞速度和回弹角度

转载 作者:行者123 更新时间:2023-11-30 12:30:37 28 4
gpt4 key购买 nike

好吧,我为此搜索了很多,但我能找到的只是人们说的像 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);

最佳答案

在最简单的意义上(忽略球旋转、摩擦、 Racket 运动等)就是算出相对于表面法线的入射角并将其反转。在简单物理碰撞的上下文中,入射角是球相对于碰撞点桨叶表面法线的运动角度。在任意坐标空间中,计算类似于:

angleReflect = angleNormal - (angleBallMovement - angleNormal)

对于真正的矩形桨的一个非常简单的情况,法线将垂直于桨的运动轴。这使您几乎无法控制球,因为反射角始终纯粹是球移动方向的函数。

您可以根据球撞击 Racket 中心的距离改变 Racket 表面的法向量,从而模拟弯曲的 Racket 表面。这允许玩家通过在 Racket 上偏离中心拦截球来改变球的运动角度,以获得更陡或更浅的反射角。

真正有趣的是当您开始将摩擦、旋转和桨运动计算添加到组合中时。对于大多数玩家来说,需要跟踪的东西有点多,但允许一些有趣的技巧投篮:)

--

至于如何计算角度,三角函数 Math.atan2(x, y) 会给你一个角度(在弧度)对于给定的 [x,y] 速度矢量,Math.sqrt(x*x + y*y) 为您提供运动矢量的长度。这为您提供了一条线,您可以通过该线与桨的表面相交(考虑到球的半径,如果您追求准确性)以获得冲击点。运动“线”的剩余部分使用入射角和您添加的任何其他计算反射(reflect)出来,给出球的最终位置和新的速度矢量。

激光笔和镜子是很好的可视化工具:)

关于c# - Pong Paddle 碰撞速度和回弹角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15753937/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com