Как предотвратить размытие/мерцание изображения при движении?Python

Программы на Python
Ответить
Anonymous
 Как предотвратить размытие/мерцание изображения при движении?

Сообщение Anonymous »

Недавно я создал камеру, которая следует за игроком по карте. Камера центрирует игрока посередине и может увеличивать и уменьшать масштаб с помощью CTRL + колесо прокрутки.
camera_handler.py:

Код: Выделить всё

import pygame

class CameraHandler:
camera_x, camera_y = 0, 0
zoom_scale = 1.0

@staticmethod
def update_camera_coords(player_rect):
width, height = pygame.display.get_surface().get_size()
CameraHandler.camera_x = min(player_rect.centerx - width // 2, width * 2 - width)
CameraHandler.camera_y = min(player_rect.centery - height // 2, height * 2 - height)

def handle_camera_event(event):
if event.type == pygame.MOUSEWHEEL and pygame.key.get_mods() & pygame.KMOD_CTRL:
if event.y == 1:
CameraHandler.zoom_scale = max(CameraHandler.zoom_scale - 0.2, 0.5)
elif event.y == -1:
CameraHandler.zoom_scale = min(CameraHandler.zoom_scale + 0.2, 2.5)

@staticmethod
def get_camera_surface(sprite_group):
camera_surface_size = pygame.display.get_surface().get_size()
camera_surface = pygame.Surface(camera_surface_size, pygame.SRCALPHA)
camera_surface_size_vector = pygame.math.Vector2(camera_surface_size)
camera_surface.fill((129, 167, 69))

offset_x = -CameraHandler.camera_x
offset_y = -CameraHandler.camera_y

for sprite in sprite_group:
camera_surface.blit(sprite.image, (sprite.rect.x + offset_x, sprite.rect.y + offset_y))

scaled_surface = pygame.transform.scale(camera_surface, camera_surface_size_vector * CameraHandler.zoom_scale)
centered_rect = scaled_surface.get_rect(center=(camera_surface_size[0] // 2, camera_surface_size[1] // 2))
return scaled_surface, centered_rect
Я перенес результат get_camera_surface() на главный экран моего игрового цикла:

Код: Выделить всё

    def main(self):
while self.playing:
self.events()
self.update()
self.draw()
self.dt = self.clock.tick(self.framerate) / 1000
self.running = False

def draw(self):
camera_surface, rect = CameraHandler.get_camera_surface(self.all_sprites)
self.screen.blit(camera_surface, rect)
pygame.display.update(rect)
Когда я уменьшаю масштаб и перемещаюсь по карте в направлении оси X, все спрайты имеют странный эффект мерцания. Если присмотреться, это выглядит как белая волна. Как это исправить?
Изображение
< /p>
Я пытался установить флаг экрана на pygame.DOUBLEBUF, но не заметил никаких изменений. Я пробовал использовать .flip() вместо update(), но изменений тоже нет.

Подробнее здесь: https://stackoverflow.com/questions/792 ... ile-moving
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»