C# C船舶与船尾碰撞试验
我们正试图对飞船和小行星进行碰撞检测。 如果成功,则应在转弯前检测碰撞。 然而,它是混淆之间的角度350和15,它不是真正的工作。 有时它在移动,但有时它根本不移动。 另一方面,它也没有在正确的时间拍摄 我只是想问一下如何使碰撞检测工作??? 如何解决角度混淆问题C# C船舶与船尾碰撞试验,c#,C#,我们正试图对飞船和小行星进行碰撞检测。 如果成功,则应在转弯前检测碰撞。 然而,它是混淆之间的角度350和15,它不是真正的工作。 有时它在移动,但有时它根本不移动。 另一方面,它也没有在正确的时间拍摄 我只是想问一下如何使碰撞检测工作??? 如何解决角度混淆问题 // Get velocities of asteroid Console.WriteLine("lol"); // IF equation is betw
// Get velocities of asteroid
Console.WriteLine("lol");
// IF equation is between -2 and -3
if (equation1a <= -2)
{
// Calculate no. turns till asteroid hits
float turns_till_hit = dx / vx;
// Calculate angle of asteroid
float asteroid_angle_rad = (float)Math.Atan(Math.Abs(dy / dx));
float asteroid_angle_deg = (float)(asteroid_angle_rad * 180 / Math.PI);
float asteroid_angle = 0;
// Calculate angle if asteroid is in certain positions
if (asteroid.Y > ship.Y && asteroid.X > ship.X)
{
asteroid_angle = asteroid_angle_deg;
}
else if (asteroid.Y < ship.Y && asteroid.X > ship.X)
{
asteroid_angle = (360 - asteroid_angle_deg);
}
else if (asteroid.Y < ship.Y && asteroid.X < ship.X)
{
asteroid_angle = (180 + asteroid_angle_deg);
}
else if (asteroid.Y > ship.Y && asteroid.X < ship.X)
{
asteroid_angle = (180 - asteroid_angle_deg);
}
// IF turns till asteroid hits are less than 35
if (turns_till_hit < 50)
{
float angle_between = 0;
// Calculate angle between if asteroid is in certain positions
if (asteroid.Y > ship.Y && asteroid.X > ship.X)
{
angle_between = ship_angle - asteroid_angle;
}
else if (asteroid.Y < ship.Y && asteroid.X > ship.X)
{
angle_between = (360 - Math.Abs(ship_angle - asteroid_angle));
}
else if (asteroid.Y < ship.Y && asteroid.X < ship.X)
{
angle_between = ship_angle - asteroid_angle;
}
else if (asteroid.Y > ship.Y && asteroid.X < ship.X)
{
angle_between = ship_angle - asteroid_angle;
}
// If angle less than 0, add 360
if (angle_between < 0)
{
//angle_between %= 360;
angle_between = Math.Abs(angle_between);
}
// Calculate no. of turns to face asteroid
float turns_to_face = angle_between / 25;
if (turns_to_face < turns_till_hit)
{
float ship_angle_left = ShipAngle(ship_angle, "leftKey", 1);
float ship_angle_right = ShipAngle(ship_angle, "rightKey", 1);
float angle_between_left = Math.Abs(ship_angle_left - asteroid_angle);
float angle_between_right = Math.Abs(ship_angle_right - asteroid_angle);
if (angle_between_left < angle_between_right)
{
leftKey = true;
}
else if (angle_between_right < angle_between_left)
{
rightKey = true;
}
}
if (angle_between > 0 && angle_between < 25)
{
spaceKey = true;
}
}
}
}
}
如何使碰撞检测工作
找到一个不能正常工作的可重复的场景
手工计算出该情景的正确计算结果
在调试器中启动程序。观看程序执行这些计算
当您的计算结果与手工计算的正确计算结果不匹配时,这就是错误所在
特别是,寻找注释与代码不匹配的地方;这些可能是错误的。例如,此位:
// If angle less than 0, add 360
if (angle_between < 0)
{
angle_between = Math.Abs(angle_between);
}
注释说了一件事,代码做了一些完全不同的事情。它是实际运行的代码
还有一个建议:所有的计算都是双倍的。没有理由继续将双打抛到浮球上。这样做会使你的程序变得更慢、更不准确。也可以考虑用弧度做所有的计算,而不是在弧度和度数之间来回转换。
我还注意到,在代码中有很多机会以零除法。这些很可能是bug。你希望我们做什么?你好像忘记问问题了。这是一个问答网站。你已经陈述了一系列的需求,并且说你有bug;这些不是问题。您对这些需求或bug有什么疑问吗?我刚刚编辑了一下…@gbianchi找到bug并更正代码:哈哈哇。这是一个潜在的巨大问题。你需要改进你的文章很多。这段代码也有很多错误。spaceKey、leftKey等在理想情况下都应该根据它们的“切换”来命名。例如spaceKeyVisible。但是如何使用弧度呢?我以为永远都是度?@CherryMa:数学函数都使用弧度。