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

在Pygame中制作简易换装游戏时的衬衫切换异常问题

解决Pygame换装游戏的衬衫切换问题

你的代码存在两个核心问题导致无法切换衬衫:

  • 按钮的clicked状态没有重置,一旦点击过就会持续返回激活状态,导致对应衬衫一直被绘制
  • 没有维护「当前选中衬衫」的状态,无法控制只显示选中的那件

以下是修复后的完整代码:

import pygame

pygame.init()

# 屏幕尺寸
winW = 600
winH = 600

# 创建窗口
win = pygame.display.set_mode((winW, winH))
pygame.display.set_caption("Dress Up Game")

# 加载并缩放模特图片
lady = pygame.image.load("DUG/ladybase.webp")
lady = pygame.transform.scale(lady, (460, 560))

# 加载并缩放衬衫图片
blueShirt = pygame.image.load("DUG/blue shirt.jpg")
blueShirt = pygame.transform.scale(blueShirt, (60, 60))
greenShirt = pygame.image.load("DUG/greenShirt.jpg")
greenShirt = pygame.transform.scale(greenShirt, (60, 60))
pinkShirt = pygame.image.load("DUG/pinkShirt.jpg")
pinkShirt = pygame.transform.scale(pinkShirt, (60, 60))

class Button(pygame.sprite.Sprite):
    def __init__(self, x, y, image):
        pygame.sprite.Sprite.__init__(self)
        self.image = image
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.clicked = False

    def update(self):
        action = False
        mousePosition = pygame.mouse.get_pos()

        # 检测鼠标点击逻辑:按下时标记点击,松开时重置状态
        if self.rect.collidepoint(mousePosition):
            if pygame.mouse.get_pressed()[0] == 1 and not self.clicked:
                self.clicked = True
                action = True
        # 鼠标松开时重置clicked状态,确保下次点击能触发
        if pygame.mouse.get_pressed()[0] == 0:
            self.clicked = False

        win.blit(self.image, self.rect)
        return action

# 创建按钮实例
pinkShirtButton = Button(20, 100, pinkShirt)
blueShirtButton = Button(80, 100, blueShirt)
greenShirtButton = Button(132, 100, greenShirt)

# 新增变量:记录当前选中的衬衫,初始为None(未选中)
current_shirt = None
# 衬衫在模特身上的位置(根据你的模特图片调整坐标)
shirt_pos = (350, 200)

run = True
while run == True:
    win.fill((255, 0, 0))
    # 绘制模特
    win.blit(lady, (280, 90))

    # 更新按钮状态,并根据点击更新当前选中衬衫
    if pinkShirtButton.update():
        current_shirt = pinkShirt
    if blueShirtButton.update():
        current_shirt = blueShirt
    if greenShirtButton.update():
        current_shirt = greenShirt

    # 只绘制当前选中的衬衫
    if current_shirt is not None:
        win.blit(current_shirt, shirt_pos)

    # 处理退出事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    pygame.display.update()

pygame.quit()

关键修改说明:

  1. 修复按钮点击逻辑:在Button类的update方法中,当鼠标左键松开时重置clicked状态,确保每次点击只触发一次动作,不会持续激活。
  2. 新增状态变量:用current_shirt记录当前选中的衬衫,点击按钮时只更新这个变量,而不是直接绘制衬衫。
  3. 统一绘制逻辑:在游戏循环的最后,根据current_shirt的值绘制对应的衬衫,确保同一时间只显示一件衬衫。
  4. 调整衬衫位置:新增shirt_pos变量统一管理衬衫在模特身上的坐标,方便你根据实际模特图片调整位置。

内容的提问来源于stack exchange,提问作者Mateen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 05:26:16