【问题标题】:Need help on performing Frustum Culling on my platform game在我的平台游戏上执行 Frustum Culling 需要帮助
【发布时间】:2020-01-04 02:33:17
【问题描述】:

为了实现 Frustum Culling 算法,我试图做的是从取决于玩家 x 和 y 位置的位置开始 render() 函数中的嵌套 for 循环,这样代码只会循环遍历 .tmx 文件的一小部分必须渲染的部分。 现在的问题是,如何从取决于我的 Player 坐标的位置开始循环? 提前感谢您的帮助。

import pygame
import pytmx
pygame.init()

class Map():
    def __init__(self,filename):
        tm=pytmx.load_pygame(filename,pixelalpha=True)
        self.width=tm.width * tm.tilewidth
        self.height=tm.height*tm.tileheight
        self.tmxdata=tm

    def render(self,surface):
        ti=self.tmxdata.get_tile_image_by_gid
        for layer in self.tmxdata.visible_layers:
            if isinstance(layer,pytmx.TiledTileLayer):
                for x,y,gid in layer:
                    tile = ti(gid)
                    if tile
                        surface.blit(tile,(x*self.tmxdata.tilewidth,y*self.tmxdata.tileheight))
    def make_map(self):
        temp_surface=pygame.Surface((self.width,self.height))
        self.render(temp_surface)
        return temp_surface

【问题讨论】:

  • 如果您有答案,请接受。不需要浮动答案。

标签: python pygame pytmx


【解决方案1】:

如果瓦片地图的大小是恒定的(即每个瓦片具有相同的宽度和高度),您可以计算世界上某个点的当前瓦片地图坐标。

假设我们有 20 像素宽和 20 像素高的图块,并且您的播放器位于 (432, 36) 位置。然后我们可以通过整数除法(除法和截断/“删除小数”)找到他/她所在的瓦片。

tile_x = player_x // tile_width
tile_y = player_y // tile_height

在我们的例子中,玩家将站在 x 轴上的瓷砖 21 (432 // 20 = 21) 上,以及 y 轴上的瓷砖 1 (36 // 20 = 1) 上。

您可以从那里定义您希望在玩家周围有多大的可见区域。如果您想在每个方向渲染 1 个图块(包括玩家站立的图块),则必须遍历 x = 20 to 22y = 0 to 2

【讨论】:

  • 完全明白。
  • 但是,如何从我想要的 x 和 y 位置开始进行 for 循环。例如,我不希望他们通过图层中的第一个元素(在这种情况下是坐标(0,0)),因为我知道不在我的播放器视图范围内,为此我想从坐标开始(24 ,0) 这样程序就不需要遍历第一个数据并浪费计算能力来检查不需要的数据,例如位置 (0,0)、(1,0) 等处的图块...最多(23,0) 因为我知道这些坐标不是我感兴趣的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
相关资源
最近更新 更多