Управление слоями в pygame
Я создаю игру на pygame, основная суть которой - процедурно генерируемый 2д-мир. Отрисовка выполняется в каждой итерации основного цикла и не вызывает вопросов. Проблемы начинаются когда я пытаюсь нарисовать спрайт игрока, он просто перекрывается спрайтами мира.
В текущий момент я добавил отрисовку игрока в функцию отрисовки мира, которая осуществляется тупым созданием новых спрайтов. Это приводит к довольно быстрому увеличению потребляемой памяти. Каким образом я могу заставить один спрайт pygame отображаться поверх всех остальных, независимо от времени создания?
Для быстрого создания спрайтов я взял класс Sprite из многочисленных гайдов по pygame:
class Sprite(pygame.sprite.Sprite):
def __init__(self, x, y, image, ID=-1):
pygame.sprite.Sprite.__init__(self)
self.image = image
self.rect = self.image.get_rect()
self.rect.topleft = (x, y)
all_sprites.add(self)
self.sprite = self
self.id = ID
def pos(self,x,y):
self.rect = self.image.get_rect()
self.rect.topleft = (x, y)
self.x = x
self.y = y
Вот код функции для отрисовки мира:
def draw(a, sX, sY):
x = -1
y = -1
for i in a:
x += 1
for j in a[x]:
y += 1
if x > sX-1:
x=0
if y > sY-1:
y=0
#if sp.get(x, y) == '*':
#sp.put(x,y, Sprite(x*20,y*20,image(world.get(x, y)['image'])))
if sp.get(x, y).id != world.get(x, y)['id']:
sp.put(x,y, Sprite(x*20,y*20,image(world.get(x, y)['image']), world.get(x, y)['id']))
if pla.get(x,y) != dum:
pla.put(x,y, dum)
sp.put(x,y, Sprite(x*20,y*20,image('data/player/player.png'), -2))
Данные о блоках в мире хранятся в виде словарей в двумерном массиве. Для удобства работы с двумерными массивами я создал класс, и методы get и put - от него.
dum - пустой класс, имитирующий спрайт. Обозначает пустоту в текущем месте массива
pla - двумерный массив, хранящий в себе игрока, все остальное заполнено пустотой
sp - двумерный массив, играет роль видеобуфера, созданного чтобы отрисовка новых спрайтов не забивала память. Хранит в себе спрайты мира.
Входная переменная у функции "а" - основной двумерный массив мира