我正在制作一款具有可破坏地形的游戏(如游戏中的蠕虫或焦土),并通过蒙版使用像素完美碰撞检测。
关卡是一个单一的表面,它现在是如何工作的,我每帧都创建一个副本,绘制需要在其上绘制的所有精灵,然后将可见区域blit到显示表面。
有没有办法避免每帧复制整个水平表面,仍然可以使用pygame中找到的像素完美碰撞工具?
我首先尝试在水平面上进行blitting,然后在屏幕上对每个精灵进行blitting(由相机调整的blit坐标,除了坐标为静态的玩家角色),但是在这种情况下,碰撞检测系统崩溃了我似乎无法修复它。
我设法通过以下方式使其工作: 在绘制精灵时,我将他们的游戏世界坐标(基本上是相对于水平位图原点的坐标)转换为屏幕坐标(相对于摄像机的坐标,这是水平的当前可见区域)。
在碰撞检测阶段,我使用相对于水平面定位的坐标和边界框;就像上面一样。问题是相机的位置是否与玩家的位置绑定,而这个位置不是也不应该是静态值(我真的不确定我是如何设法在这么长时间内没有意识到的。)
虽然这解决了我的问题,但下面的答案是关于如何在这种情况下提高性能的更全面的看法。 我也愿意接受使用其他库的建议,这些库可以使考验变得更容易或更快。我已经考虑过pyglet和rabbyt,但看起来存在同样的问题。
答案 0 :(得分:6)
在计算机速度很慢的图形加速器之前的几天,这个问题经常出现。您基本上希望最小化刷新屏幕所需的工作。你走在正确的轨道上,但我推荐以下内容:
正如您所做的那样,在屏幕外保留背景的副本 现在
分配一个与屏幕尺寸相同的工作位图。
对于每个精灵,计算边界矩形(边界框) 它的新旧职位。
如果新旧边界框重叠,请将它们合并为一个 更大的盒子。如果它们不重叠,请单独处理。
将所有边界框分组为重叠的集合。他们可能都是 结束于一组(当精灵彼此接近时),或 每个边界框可能在一个集合中(当精灵是 相隔很远)。
将背景复制到相应的工作位图的区域 到每个边界框集。
将每个集合的精灵复制到新的工作位图中 位置(当然是正确的z顺序!)。
最后,将完成的屏幕外位图复制到显示表面, 通过设置边界框设置边界框。
这种方法可以最大限度地减少背景和精灵所需的复制量。如果精灵相对于显示区域较小,则节省的费用应该很高。最糟糕的情况是精灵全部排列在对角线上,几乎没有相互重叠。在这种情况下,您可能希望切换到比框更广义的边界形状。请查看QuickDraw区域以获取示例:Wikipedia Discussion Patent Source。
现在,您可能认为将边界框分组为集合的工作是O(n ^ 2)操作,您就是对的。但它只会随着精灵数量的平方而增长。 16个精灵意味着256个比较。这可能不如单个精灵blit工作。
我专注于最小化像素复制工作。我必须管理员我不熟悉你的碰撞检测库的细节,但我明白了。希望这与我提出的算法兼容。
祝你好运。如果您完成游戏并在线发布,请在您的问题或评论中添加一个链接。