描述
我正在制作一个 2d 平台游戏,但我遇到了问题
我已经检查了这个答案:https://stackoverflow.com/questions/20963775/blitting-a-pygame-tile-map-efficiently 但我不使用 camera
,我使用 veriables cx
和 cy
。
问题
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(....)
或者,您可以将游戏分成多个房间,因此只需检查玩家所在房间的瓷砖并进行拼贴。