Как обновлять 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()

А это уже непосредственно часть кода в цикле с обновлением всех слоёв и так далее.

В общем, подскажите, как мне сделать, чтоб при прогрузке у меня ничего не лагало, я реально не знаю, что мне нужно сделать.


Ответы (0 шт):