C#船舶与小行星碰撞试验
本文关键字:碰撞 小行星 | 更新日期: 2023-09-27 18:28:20
我们正试图对飞船和小行星进行碰撞检测。如果成功,它应该在N转弯之前检测到碰撞。然而,它混淆了角度350和15,并且它并没有真正起作用。有时它在移动,但有时它根本不移动。另一方面,它也没有在正确的时间拍摄。
我只想问一下如何使碰撞检测工作???如何解决角度混淆问题?
// 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);
}
评论说了一件事,代码做了完全不同的事情。实际运行的是代码。
还有一句忠告:你所有的计算都要加倍。没有理由一直把替身扔到浮子上。你这样做会让你的程序变得更慢、更不准确。还可以考虑用弧度进行所有计算,而不是在弧度和度数之间来回转换。
我还注意到,在您的代码中,您有很多通过零进行除法的机会。这些很可能是虫子。