我最近创建了一个相机,可以在地图上跟随玩家。相机将玩家置于中间,可以使用 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 轴方向移动地图时,所有精灵都有这种奇怪的闪烁效果,当你仔细观察时,它看起来像白色的波浪。我该如何解决这个问题?
我尝试将屏幕标志设置为
pygame.DOUBLEBUF
,但我没有注意到任何变化。我尝试使用 .flip()
代替 update()
但也没有任何变化。
您的代码的问题是您在每一帧中重新创建相机的表面,而不是简单地重复使用相同的表面。 要根据玩家的操作在该地图上进行单项更改,您可以简单地将地图的一部分与另一个形状/纹理重叠,就像受到损坏的墙壁的情况一样。以下是执行我刚才所说的功能的结构:
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
只是一个为您提供墙壁相应纹理的函数
祝您游戏顺利!