如何只 blit 那些在玩家视野范围内的方块

How to blit only those tiles that are in player vision zone

描述

我在制作 2d 平台游戏时遇到了问题

我已经检查过这个答案:Blitting a Pygame Tile-map Efficiently 但我不使用 camera,我使用变量 cxcy.

问题

地图越大,游戏越慢。与我想要制作可玩地图的尺寸​​相比,我的地图目前很小,但我的游戏已经下降了 5 fps。所以如果我制作可玩大小的地图,游戏会很慢。

代码

所以我的地图代码很简单。这是一些: pos = [(150, 300), (180, 330)...] 然后在循环中我将这个位置列表转换为 rects 这样我就可以进行碰撞,然后让它跟随相机并同时绘制瓷砖:

p.clear()
for a in range(len(pos)):
    p.append(pygame.draw.rect(win, (0, 0, 50), (pos[a][0] - cam.x, pos[a][1] - cam.y, 30, 30)))

我试过的

所以我想检查每个瓦片与玩家的距离并仅 blit 那些在玩家视野范围内的瓦片,但我需要检查每个瓦片所以它不会工作(我已经试过)。

非常感谢您的帮助!!!

将所有图块放入矩阵中,使它们在矩阵中的位置与其出现的位置相关联 in-game。然后,根据相机的位置和屏幕的大小,仅遍历矩阵中可见的图块,并将它们 blit 到屏幕上。

例如, 假设每个图块都是 5 x 5 像素, 屏幕为 200 x 200 像素,并且 地图为 1500 x 500 像素。

tilemap 矩阵为 300 x 100 像素,这是地图的第五个比例,因为每个图块都是 5 x 5 像素。

如果摄像头(假设在屏幕左上角)位于 (120,45),则框从 x = 120, y = 45 到 x = 320, y = 245(已添加200,因为屏幕宽度和高度)包括所有必须块化的图块。

然后将这些数字除以 5 以说明地图和 tilemap 之间的比例差异,以获得所需切片的索引。

tile_size = 5  # Width and height of tiles in pixels

min_y = camera_y // tile_size
max_y = (camera_y + screen_height) // tile_size

min_x = camera_x // tile_size
max_x = (camera_x + screen_width) // tile_size

for y in range(min_y, max_y):
    for x in range(min_x, max_x):
        tile = tile_map[y][x]
        # Use the tile from the tilemap to blit whatever you want
        # Still must subtract camera_x and camera_y when positioning the rect
        pygame.draw.rect(....)

或者,您可以将游戏分成多个房间,这样只需检查玩家所在房间的瓷砖即可。