Как эффективно очистить альфа-слой Pygame? - PullRequest
1 голос
/ 12 сентября 2011

Я пытаюсь написать 2D-игру, используя python / pygame, которая при каждом обновлении экрана создает несколько слоев друг над другом.Моя базовая настройка (снизу вверх):

  • Фон: поверхность (непрозрачная), прокручивается с другой скоростью, чем остальные
  • Среда: прозрачная поверхность SRCALPHA (статическая)
  • Игрок / Спрайты / Враги: группа спрайтов
  • Forground: прозрачная поверхность SRCALPHA (статическая)

Прямо сейчас, я срываю эти четыре слоя один сверхудругого каждого экрана.Фон прокручивается с другой скоростью, чем у других трех слоев, поэтому у меня он отделен от среднего уровня.Поскольку у меня есть структурированная игра, она работает на моем довольно скромном ноутбуке со скоростью 60 кадров в секунду.

-НО- У меня проблемы с группой спрайтов, которую я перетягиваю прямо на экран.Необходимость настройки прямоугольника для каждого спрайта в соответствии с моим текущим окном просмотра кажется уродливым способом программирования вещей, и я бы хотел более элегантное решение.

Я бы хотел перебросить спрайты на другую прозрачную поверхностьс этим я мог справиться, но в этом и заключается моя проблема: я не могу найти способ очистки прозрачного слоя, который не наполовину снижает производительность.Некоторые настройки, которые я пробовал:

  • Я пытался заполнить слой белой поверхностью в режиме наложения rgba_sub (surf.fill ((255,255,255,255), area, BLEND_RGBA_SUB)) - этоэто супер, очень медленно
  • Я пробовал Surface.copy () пустой поверхности - это быстрее, но все равно вдвое меньше моего fps
  • Я пытался комбинировать спрайты со средним уровнемслой и использование pygame.sprite.LayeredUpdates для обновления спрайтов.Это не влияет на производительность, но не работает там, где средний уровень прозрачен.Я получаю следы спрайтов поверх фонового слоя.

Лучшее решение, которое я нашел на данный момент, - это моя текущая настройка рисования спрайтов прямо на экране.Он выглядит великолепно, работает быстро, но управлять им сложно, так как я должен убедиться, что прямоугольник каждого спрайта корректируется в соответствии с окном просмотра каждого кадра.Это также затрудняет обнаружение столкновений.

Есть ли другой быстрый способ очистки прозрачной поверхности пигамов?Быстро, как в, можно сделать 60+ раз в секунду? Альтернативно, есть ли настройка для моих слоев, которая все еще будет выполнять тот же эффект?

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

Я выяснил, как быстро очистить прозрачный слой от спрайтов, применяя раствор Питера выборочно к слою:

for s in self.level.sprites:
  spritelayer.fill((0), s.rect)

Это, кажется, работает нормально (стирает все в каждом кадре) и все еще работает на скорости 60 кадров в секунду.

1 голос
/ 12 сентября 2011

Surface.fill () очистит все значения R, G, B и A.

>>> img = pygame.image.load("hasalpha.png")
>>> print img.get_at((300, 300))
(238, 240, 239, 255)
>>> surface.fill(0)
>>> print img.get_at((300, 300))
(0, 0, 0, 0)

Похоже, это будет делать то, что вы описываете.Если вы пытаетесь сделать что-то более конкретное с альфа-значениями, функции pygame.surfarray.pixel могут дать вам непосредственно редактируемые значения.Это будет быстро, но требует зависимости от NumPy.

...