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