如何防止移动时图像模糊/闪烁?

问题描述 投票:0回答:1

我最近创建了一个相机,可以在地图上跟随玩家。相机将玩家置于中间,可以使用 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 轴方向移动地图时,所有精灵都有这种奇怪的闪烁效果,当你仔细观察时,它看起来像白色的波浪。我该如何解决这个问题?

Example of player moving around the map

我尝试将屏幕标志设置为

pygame.DOUBLEBUF
,但我没有注意到任何变化。我尝试使用
.flip()
代替
update()
但也没有任何变化。

python pygame flicker pygame-surface
1个回答
0
投票

您的代码的问题是您在每一帧中重新创建相机的表面,而不是简单地重复使用相同的表面。 要根据玩家的操作在该地图上进行单项更改,您可以简单地将地图的一部分与另一个形状/纹理重叠,就像受到损坏的墙壁的情况一样。以下是执行我刚才所说的功能的结构:

def draw_bg_with_updated_wall(CameraHandler x, y, hp):  
    image = find_image(hp, "wall")   
    CameraHandler.static_world_surface.blit(image, (x, y))

其中

find_image
只是一个为您提供墙壁相应纹理的函数

祝您游戏顺利!

© www.soinside.com 2019 - 2024. All rights reserved.