我是一个相当缺乏经验的程序员,目前正在学习 C# 并试图学习游戏设计。
我正在使用 Microsoft 的 XNA 框架来构建一个 Galaga-esque Scrolling Shooter 游戏。经过几次粗略的试验,我与劣质的 OOP 结构作斗争,做出了一些糟糕的设计选择,我终于想出了一个值得尊敬的引擎启动。
目前,我在使碰撞检测不落后于游戏方面遇到问题。我当前的引擎将所有活动的游戏对象保存在 List 对象中并循环遍历每个对象,检查它是否与其他对象发生碰撞。不用说,它可能会好很多。
这是我的碰撞检查,在 ObjectHandler 类中完成。
public override void Update(GameTime gameTime)
{
...
//Handle collisions
foreach (GameObject obj in Objects)
{
ICollideable e = obj as ICollideable;
//Check if the object implements ICollideable
if (e != null)
{
//Check collision with each other object
foreach (GameObject obj2 in Objects)
{
//Check if the second object implements ICollideable
ICollideable e2 = obj2 as ICollideable;
//check if they are in the same sector
if (e2 != null && SameSector(e.Sector,e2.Sector))
{
//Check if the collision masks interesect
//if so call each object's collision event
if (e.Mask.Intersects(e2.Mask))
{
e.CollisionEvent(e2);
e2.CollisionEvent(e);
}
}
}
}
}
...
}
这是 SameSector 函数。
private bool SameSector(Point p1, Point p2)
{
if (Math.Abs(p1.X-p2.X)<=1 && Math.Abs(p1.Y-p2.Y)<=1)
return true;
else
return false;
}
这里的“掩码”是一个 Rectangle 对象,它是 XNA 框架的一部分。如您所见,我已经实现了一种空间分区系统,其中每个对象都设置了它所在的 60x60 正方形。但是,我不确定我是否做了任何有用的事情,因为检查是否需要花费同样多的时间两个对象在同一扇区(或相邻扇区)中,因为它检查它们是否发生碰撞。
我已经看到了与此帖子类似的问题,但它并不能完全满足我的问题。从中我确实了解到时间管理系统很有用。我最终会尝试实现它,但由于我对编程还很陌生,我想在深入研究更高级的设计之前优化碰撞检查本身。
那么,我有什么方法可以有效地优化我当前的碰撞检查,还是我有办法开始?