python - 如何只对玩家视觉区域中的瓷砖进行 blit

描述

我正在制作一个 2d 平台游戏,但我遇到了问题

我已经检查了这个答案:https://stackoverflow.com/questions/20963775/blitting-a-pygame-tile-map-efficiently 但我不使用 camera,我使用 veriables cxcy

问题

map 越大,游戏越慢。我的 maps 目前比我想要制作可玩 maps 的尺寸小,但我的游戏已经下降了 5 fps。所以如果我把可玩尺寸设为maps,游戏会很慢。

代码

所以我的 map 代码非常简单。这是一些: 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,但我需要检查每一个瓷砖,这样它就不起作用了(我已经试过了)。

非常感谢你的帮助!!!

回答1

将所有图块放入矩阵中,以便它们在矩阵中的位置与它们在游戏中出现的位置相关。然后,根据相机的位置和屏幕的大小,仅遍历矩阵中可以查看的图块并将它们blit到屏幕上。

例如,假设每个图块为 5 x 5 像素,屏幕为 200 x 200 像素,map 为 1500 x 500 像素。

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

如果相机(假设是在屏幕的左上角)在 (120,45),那么从 x = 120, y = 45 到 x = 320, y = 245 的框(由于屏幕宽度增加了 200和高度)包括所有必须进行blitted的图块。

然后将这些数字除以 5 以说明 map 和 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(....)

或者,您可以将游戏分成多个房间,因此只需检查玩家所在房间的瓷砖并进行拼贴。

相似文章

python - 为什么我的 pygame 代码中没有生命计数?

所以我正在做一个项目,我必须制作一个游戏,给用户三个生命,每次光束矩形与玩家的矩形碰撞时,它都会减去一个生命并将它们放在原始位置。当生命==0时:将显示死亡屏幕。但是由于某种原因,即使我确保每次玩家r...