在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()
关键修改说明:
- 修复按钮点击逻辑:在Button类的
update方法中,当鼠标左键松开时重置clicked状态,确保每次点击只触发一次动作,不会持续激活。 - 新增状态变量:用
current_shirt记录当前选中的衬衫,点击按钮时只更新这个变量,而不是直接绘制衬衫。 - 统一绘制逻辑:在游戏循环的最后,根据
current_shirt的值绘制对应的衬衫,确保同一时间只显示一件衬衫。 - 调整衬衫位置:新增
shirt_pos变量统一管理衬衫在模特身上的坐标,方便你根据实际模特图片调整位置。
内容的提问来源于stack exchange,提问作者Mateen
相关产品推荐
相关产品推荐

