Pygame, как исправить «висячие пиксели»? - PullRequest
3 голосов
/ 27 июня 2011

enter image description here

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

Ответы [ 4 ]

2 голосов
/ 22 сентября 2011

Обычно вы делаете:

def draw():
    # fill screen with solid color.
    # draw, and flip/update screen.

Но вы можете обновить только грязные части экрана.См. pygame.display.update():

pygame.display.update ()
Обновление частей экрана для программных дисплеев
update(rectangle=None) -> None
update(rectangle_list) -> None

Эта функция похожа на оптимизированную версию pygame.display.flip () для экранов программного обеспечения.Это позволяет обновлять только часть экрана, а не всю область.Если аргумент не передан, он обновляет всю область Surface, например, pygame.display.flip ().

Вы можете передать функции один прямоугольник или последовательность прямоугольников.Более эффективно пропускать сразу несколько прямоугольников, чем вызывать обновление несколько раз с одним или частичным списком прямоугольников.При передаче последовательности прямоугольников безопасно включить в список значения None, которые будут пропущены.

Лучше всего использовать его в сочетании с RenderUpdates, чтоSprite.Group:

pygame.sprite.RenderUpdates
Подкласс группы, отслеживающий грязные обновления.
RenderUpdates(*sprites) -> RenderUpdates
Этот класс является производным от pygame.sprite.Group ().Он имеет расширенный метод draw (), который отслеживает измененные области экрана.

1 голос
/ 28 июня 2011

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

0 голосов
/ 06 ноября 2018

Если вы хотите избежать перерисовки всего экрана, просто исправьте область, которая была «повреждена» вашим спрайтом.Уже предложено нарисовать черный прямоугольник поверх вашего спрайта.Это работает, если ваш фон всегда полностью черный.Однако, если было фоновое изображение, вы можете скопировать только поврежденную часть фонового изображения обратно на экран.

Если фон более динамичный, то другое решение - скопировать часть экрана.что вы покроете спрайтом перед рисованием этого спрайта и сохраните его где-нибудь.Затем нарисуйте спрайт и переверните экран, если необходимо.Прямо перед перемещением спрайта скопируйте сохраненную часть фона обратно на экран, а затем повторите все это снова.

0 голосов
/ 27 февраля 2014

Возьмите название вашего экрана. (Для моего случая это экран.) И сделать ...

screen.fill((0, 0, 0))

Поместите это до блинтинга и после рисунка. (Это будет черный фон.) Надеюсь, это поможет!

...