在视口周围包裹pygame表面

时间:2012-10-25 00:26:38

标签: python scroll pygame geometry-surface

我正在编写一个游戏,其中视口在有限的游戏世界中跟随玩家的船只,而我正在努力使背景在所有方向上“包裹”(您可以将其视为2D表面)缠绕在一个球体上 - 无论你走进哪个方向,你都会回到你开始的地方。)

我可以轻松地将船和物体包裹起来,但直到视口本身通过游戏世界的边缘才会显示背景。是否可以使背景表面“包裹”?

如果我不是很善于表达,我很抱歉。这似乎是一个简单的问题,大量的游戏都是这样做的,但我没有找到答案的运气。我有一些关于如何通过平铺背景来做到这一点的想法,但如果我能告诉表面要包裹它会很好。

3 个答案:

答案 0 :(得分:0)

我不这么认为,但我有一个想法。我猜测你的背景是水平的,总是在右边,然后你可以将部分开头附加到背景的末尾。

示例,如果您有10,000px背景且视口为1000px,请将第一个1000px附加到背景末尾,这样您将拥有11,000px背景。然后当视口到达背景的末尾时,您只需将其移动到0px位置并继续向右移动。

答案 1 :(得分:0)

我正在用类似你所描述的可能有用的东西进行捣蛋。我决定尝试使用包含所有Tiles的单个map类,并且我只想将其中的一部分一次加载到内存中,因此我将其分解为Sectors(32x32 tile)。我将其限制为仅同时加载3x3扇区。当我的地图滚动到边缘时,它将卸载另一侧的扇区并加载新的扇区。

我的Map类将有一个所有已加载扇区的Rect,我的相机将有一个Rect所在的位置。我会使用这两个Rect来查找Map应该blit的哪个部分,以及我是否应该加载新的扇区。一旦开始更改加载的扇区,就必须转移

每个部门都具有以下属性:  1.它的坐标,(0,0)是世界上最可能的部门。  2.其相对扇区坐标,其中(0,0)是最大负载扇区,(2,2)如果加载3x3则最右下角。  3.一个占据该区域的Rect  4.表示该部门满载的布尔

每个游戏勾选将检查bool是否完全加载扇区,如果不是,则在生成器上调用下一个将X块拼接到地图表面上的生成器。我

  1. 整个表面
  2. 每次更新都会卸载,加载或更新现有的Sector
  3. 当现有的部门更新时,它会转移
  4. 它将在更新时卸载扇区,然后创建所需的新扇区。在创建之后,每个扇区将启动一个生成器,该生成器将为每次更新blit X块的数量

答案 2 :(得分:0)

感谢大家的建议。我最终做了一些与提供的答案略有不同的事情。基本上,我创建了主曲面的子表面并将它们用作缓冲区,只要视口包含世界之外的坐标,就会适当地显示它们。因为滚动是全向的,我需要使用8个缓冲区,每侧一个,所有四个角。我的解决方案可能不是最优雅的,但似乎运行良好,没有明显的性能下降。