1

我是一个相当缺乏经验的程序员,目前正在学习 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 正方形。但是,我不确定我是否做了任何有用的事情,因为检查是否需要花费同样多的时间两个对象在同一扇区(或相邻扇区)中,因为它检查它们是否发生碰撞。

我已经看到了与此帖子类似的问题,但它并不能完全满足我的问题。从中我确实了解到时间管理系统很有用。我最终会尝试实现它,但由于我对编程还很陌生,我想在深入研究更高级的设计之前优化碰撞检查本身。

那么,我有什么方法可以有效地优化我当前的碰撞检查,还是我有办法开始?

4

1 回答 1

3

空间分区仅在您以不需要您以某种方式将每个对象与每个对象进行比较的方式实现它时才会对您有所帮助。

在您的空间划分网格中,您希望每个网格单元在其中具有某种对象成员列表,并且每个对象都知道它在哪个单元中。然后您只需要在一个对象和所有对象之间进行比较该单元格内和紧邻单元格内的其他对象(因为对象可能重叠边界)。缺点是您现在需要保持所有这些状态的更新。

我强烈推荐Real-Time Collision Detection一书,除了其他 CD 主题外,它还深入介绍了几种不同的广泛阶段分区方案及其相对优势和劣势。除了统一网格之外,还有分层网格、四叉树、扫描和修剪以及其他可能更适合您的技术(扫描和修剪可能特别有用)。

于 2012-04-29T20:29:56.313 回答