Как обновлять tile_surface без лагов?
В общем, у меня такая проблема: мне нужно отрисовывать спрайты на карте, и они должны обновляться (в ином случае у меня картинка как-бы накладывается на друг друга, нету такого что прошлый кадр стирается), но по итогу у меня все дико лагает.
tmx_data = pytmx.util_pygame.load_pygame("maps/map1.tmx")
camera_rect = pygame.Rect(0, 0, win.get_width(), win.get_height())
class TileMap:
def __init__(self, tmx_data):
self.width = tmx_data.width * tmx_data.tilewidth
self.height = tmx_data.height * tmx_data.tileheight
self.surface = pygame.Surface((self.width, self.height), pygame.SRCALPHA)
self.visible_layers = [layer for layer in tmx_data.visible_layers if layer.visible]
self.tile_images = {}
for layer in self.visible_layers:
if isinstance(layer, pytmx.TiledTileLayer):
for x, y, gid in layer:
if gid:
image = tmx_data.get_tile_image_by_gid(gid)
self.tile_images[gid] = image.convert_alpha()
def update(self, camera_rect):
self.surface.fill((0, 0, 0, 0))
for layer in self.visible_layers:
if isinstance(layer, pytmx.TiledTileLayer):
for x, y, gid in layer:
if gid:
tile = self.tile_images[gid]
if tile:
tile_rect = tile.get_rect()
tile_rect.x = x * tmx_data.tilewidth
tile_rect.y = y * tmx_data.tileheight
if camera_rect.colliderect(tile_rect):
self.surface.blit(tile, (tile_rect.x - camera_rect.x, tile_rect.y - camera_rect.y))
elif isinstance(layer, pytmx.TiledImageLayer):
image = pygame.image.load(layer.image.source).convert_alpha()
image_rect = image.get_rect()
image_rect.x = layer.x
image_rect.y = layer.y
if camera_rect.colliderect(image_rect):
self.surface.blit(image, (image_rect.x - camera_rect.x, image_rect.y - camera_rect.y))
elif isinstance(layer, pytmx.TiledObjectGroup):
for obj in layer:
if hasattr(obj, 'gid'):
obj_tile = self.tile_images.get(obj.gid)
if obj_tile:
obj_rect = obj_tile.get_rect()
obj_rect.x = obj.x
obj_rect.y = obj.y
if camera_rect.colliderect(obj_rect):
self.surface.blit(obj_tile, (obj_rect.x - camera_rect.x, obj_rect.y - camera_rect.y))
elif hasattr(obj, 'polygon'):
p = pygame.math.Vector2(obj.x, obj.y)
for point in obj.polygon:
point = p + pygame.math.Vector2(point)
if camera_rect.collidepoint(point):
self.surface.set_at((int(point.x - camera_rect.x), int(point.y - camera_rect.y)), obj.color)
self.surface = self.surface.convert_alpha()
def blit(self, surface):
surface.blit(self.surface, (0, 0))
Это я пытался сделать класс с картой как отдельный слой.
# get keys pressed
keys = pygame.key.get_pressed()
# обновляем всех спрайты
sprites.update(keys)
# обновляем TileMap
tile_map.update(camera_rect)
# отрисовываем все элементы
#win.fill((0, 0, 0))
tile_map.blit(win)
sprites.draw(win)
player.draw(win)
pygame.display.update()
А это уже непосредственно часть кода в цикле с обновлением всех слоёв и так далее.
В общем, подскажите, как мне сделать, чтоб при прогрузке у меня ничего не лагало, я реально не знаю, что мне нужно сделать.