如何避免在虫子游戏中每一帧都复制水平面?

2024-05-19 02:29:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个游戏,有破坏性地形(如在游戏蠕虫,或焦土)和使用像素完美的碰撞检测通过面具。在

这个层次是一个单一的表面,现在的工作方式是我创建一个副本每一帧,绘制所有需要绘制的精灵,然后blit可见区域到显示表面。在

有什么方法可以避免复制整个水平面每一帧,仍然能够使用像素完美的碰撞工具在pygame?在

我试着先blitting水平面,然后blitting屏幕上的每个精灵(他们的blit坐标由相机调整,除了玩家角色的坐标是静态的),但在这种情况下,碰撞检测系统崩溃了,我似乎无法修复它。在

更新

我设法通过以下方式实现: 当绘制精灵时,我将它们的游戏世界坐标(基本上是相对于关卡位图原点的坐标)转换为屏幕坐标(相对于相机的坐标,这是关卡当前可见的区域)。在

在碰撞检测阶段,我使用相对于水平面定位的坐标和边界框;如上所述。问题是摄像机的位置和玩家的位置是有联系的,这不是也不应该是一个静态值(我真的不知道我是怎么做到这么长时间没有意识到这一点的)。在

虽然这解决了我的问题,但下面的答案更全面地介绍了如何在这种情况下提高性能。 我也会用其他的图书馆更快的开放或者更容易的建议。我曾考虑过pyglet和rabbyt,但看起来同样的问题也存在。在


Tags: 游戏区域屏幕方式玩家静态绘制情况
1条回答
网友
1楼 · 发布于 2024-05-19 02:29:59

这是一个在图形加速器出现之前经常出现的问题,当时计算机速度很慢。您基本上希望最小化刷新屏幕所需的工作量。您的思路是正确的,但我建议您:

  1. 在屏幕外保留一份背景副本,就像你正在做的那样 现在。

  2. 分配与屏幕大小相同的工作位图。

  3. 对于每个精灵,计算 它的新的和旧的立场。

  4. 如果新边界框和旧边界框重叠,请将它们合并为一个 更大的盒子。如果没有重叠,则分开处理。

  5. 将所有边界框分组为重叠的集合。他们可能都 在一组中结束(当精灵彼此靠近时),或 每个边界框可以单独在一个集合中(当精灵 相隔甚远)。

  6. 将背景复制到对应的工作位图区域 到每个边界框集。

  7. 将每个集合的精灵复制到新的工作位图中 位置(当然是按照正确的z顺序!)。

  8. 最后,将完成的屏幕外位图复制到显示表面, 通过设置边界框设置边界框。

这种方法可以最大限度地减少复制的数量,包括背景和精灵。如果精灵相对于显示区域来说很小,那么节省的费用应该是可观的。最糟糕的情况是精灵们都排在一条对角线上,只是彼此几乎没有重叠。在这种情况下,您可能希望切换到比长方体更通用的边界形状。以快速绘制区域为例:WikipediaDiscussionPatentSource。在

现在,您可能认为将边界框分组为集合的工作是一个O(n^2)操作,您是对的。但它只随精灵数量的平方而增长。16个精灵意味着256个比较。这可能比一个雪碧闪电要少。在

我专注于最小化像素复制工作。我必须管理我不熟悉你的碰撞检测库的细节,但我明白了。希望这与我提出的算法兼容。在

祝你好运。如果你完成游戏并把它发布到网上,在你的问题或评论中加入一个链接。在

相关问题 更多 >

    热门问题