You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pygame中实现移动转向时翻转Sprite精灵

问题解决:Pygame中车辆方向翻转实现

核心思路

提前生成车辆左右朝向的图像副本,通过状态变量跟踪当前朝向,根据按键更新状态后绘制对应图像,避免重复翻转操作影响性能。

修改步骤

  1. 预生成翻转图像:初始化时创建车辆的左右朝向版本
  2. 添加方向状态变量:跟踪车辆当前朝向(左/右)
  3. 更新按键逻辑:按下左右移动键时同步更新方向状态
  4. 调整绘制逻辑:根据方向状态选择对应朝向的图像绘制
  5. 修复原代码问题:修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:06:27