如何在Pygame中实现移动转向时翻转Sprite精灵
问题解决:Pygame中车辆方向翻转实现
核心思路
提前生成车辆左右朝向的图像副本,通过状态变量跟踪当前朝向,根据按键更新状态后绘制对应图像,避免重复翻转操作影响性能。
修改步骤
- 预生成翻转图像:初始化时创建车辆的左右朝向版本
- 添加方向状态变量:跟踪车辆当前朝向(左/右)
- 更新按键逻辑:按下左右移动键时同步更新方向状态
- 调整绘制逻辑:根据方向状态选择对应朝向的图像绘制
- 修复原代码问题:修正ESC按键无效、重复调用
pygame.key.get_pressed()的冗余操作
修改后的完整代码
# Imports import pygame import os pygame.init() # Colors WHITE = (255,255,255) BLACK = (0,0,0) GREEN = (54, 236, 189) GRAY = (64, 64, 64) # Images ICON = pygame.image.load(os.path.join("Assets", "icon.png")) COOL = pygame.image.load(os.path.join("Assets", "cool.jpg")) CAR1_IMG = pygame.image.load(os.path.join("Assets", "car1_sprite.png")) CAR2_IMG = pygame.image.load(os.path.join("Assets", "car2_sprite.png")) # Characters CHARACTER_WIDTH = 252 CHARACTER_HEIGHT = 86 # 预生成左右朝向的车辆图像 CAR1_RIGHT = pygame.transform.scale(CAR1_IMG, (CHARACTER_WIDTH, CHARACTER_HEIGHT)) CAR1_LEFT = pygame.transform.flip(CAR1_RIGHT, True, False) # 水平翻转,垂直保持不变 CAR2_RIGHT = pygame.transform.scale(CAR2_IMG, (CHARACTER_WIDTH, CHARACTER_HEIGHT)) CAR2_LEFT = pygame.transform.flip(CAR2_RIGHT, True, False) # Window WIDTH, HEIGHT = 1280, 720 WIN = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("USSPCS: Ultimate Super Supercar Policecar Chase Simulator Game of The Year Deluxe Edition") pygame.display.set_icon(ICON) FPS = 60 VEL = 3 # Render def draw_window(car1_rect, car2_rect, car1_facing_right, car2_facing_right): WIN.fill(GRAY) # 根据朝向选择绘制的图像 WIN.blit(CAR1_RIGHT if car1_facing_right else CAR1_LEFT, (car1_rect.x, car1_rect.y)) WIN.blit(CAR2_RIGHT if car2_facing_right else CAR2_LEFT, (car2_rect.x, car2_rect.y)) pygame.display.update() # Game def main(): CAR1_RECT = pygame.Rect(300, 100, CHARACTER_WIDTH, CHARACTER_HEIGHT) CAR2_RECT = pygame.Rect(300, 300, CHARACTER_WIDTH, CHARACTER_HEIGHT) # 初始化方向状态:默认朝右 car1_facing_right = True car2_facing_right = True clock = pygame.time.Clock() running = True while running: clock.tick(FPS) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 将ESC按键判断移至事件循环内,确保触发有效 if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False # 仅调用一次按键获取,优化性能 key_pressed = pygame.key.get_pressed() # CAR1控制逻辑 if key_pressed[pygame.K_a]: CAR1_RECT.x -= VEL car1_facing_right = False # 左移时切换为朝左状态 if key_pressed[pygame.K_d]: CAR1_RECT.x += VEL car1_facing_right = True # 右移时切换为朝右状态 if key_pressed[pygame.K_w]: CAR1_RECT.y -= VEL if key_pressed[pygame.K_s]: CAR1_RECT.y += VEL # CAR2控制逻辑 if key_pressed[pygame.K_LEFT]: CAR2_RECT.x -= VEL car2_facing_right = False if key_pressed[pygame.K_RIGHT]: CAR2_RECT.x += VEL car2_facing_right = True if key_pressed[pygame.K_UP]: CAR2_RECT.y -= VEL if key_pressed[pygame.K_DOWN]: CAR2_RECT.y += VEL draw_window(CAR1_RECT, CAR2_RECT, car1_facing_right, car2_facing_right) pygame.quit() if __name__ == "__main__": main()
关键说明
pygame.transform.flip(surface, x_flip, y_flip):第二个参数设为True实现水平翻转,第三个参数设为False保持垂直方向不变,符合车辆转向需求- 预生成翻转图像:避免每次绘制时重复执行翻转操作,减少性能开销
- 方向状态变量:确保车辆在持续移动过程中保持稳定朝向,不会因按键重复触发而反复切换图像
内容的提问来源于stack exchange,提问作者svasim
相关产品推荐
相关产品推荐

