Pygame开发Hangman游戏:注释win.fill后按钮不消失的问题求助
Pygame Hangman游戏按钮点击不消失问题解答
问题描述
我正在使用Pygame制作Hangman(猜单词)游戏,遇到如下现象:
- 直接运行代码,点击圆形按钮后按钮会消失,符合游戏预期逻辑;
- 但如果注释掉代码中的
win.fill('darkred')一行,点击按钮后按钮不再消失。
问题代码
import pygame , math pygame.init() WIDTH , HEIGHT = 900 , 600 win = pygame.display.set_mode((WIDTH , HEIGHT)) pygame.display.set_caption('Hangmane') RUN = True # 存储按钮坐标的列表 letters = [ ] RADIUS = 20 BUTTON_X = 0 BUTTON_Y = 457 for i in range(26): BUTTON_X += 60 if i == 14: BUTTON_X = 100 BUTTON_Y = 520 letters.append([BUTTON_X, BUTTON_Y]) # 绘制所有按钮(圆形) def button(): for letter in letters: BUTTON_X , BUTTON_Y = letter pygame.draw.circle(win,'green',(BUTTON_X,BUTTON_Y),RADIUS,3) # 移除被点击的按钮坐标 def click_checker(coordinates): letters.remove(coordinates) while RUN: win.fill('darkred') # 注释这一行后按钮点击不消失 button() pygame.display.update() for event in pygame.event.get(): if event.type == pygame.QUIT: RUN = False if event.type == pygame.MOUSEBUTTONDOWN: pos_x , pos_y = pygame.mouse.get_pos() for letter in letters: BUTTON_X , BUTTON_Y = letter dis = math.sqrt((BUTTON_X-pos_x)**2 + (BUTTON_Y-pos_y)**2) if dis < RADIUS: # 判断鼠标是否点击到圆形按钮内 click_checker(letter) pygame.quit()
原因解释
这是Pygame的帧缓冲渲染机制导致的:
- Pygame的窗口画面由一帧一帧的像素数据组成,每次绘制操作都是在当前帧的像素上叠加内容;
- 调用
win.fill('darkred')时,会将整个窗口的像素全部覆盖为深红色,相当于清空了上一帧的所有残留内容; - 之后
button()函数只会绘制当前letters列表中剩余的按钮,被点击移除的按钮不会被重新绘制,所以窗口上看不到它了; - 如果注释掉
win.fill(),上一帧绘制的所有按钮像素不会被清除——即使你从letters列表里移除了某个按钮的坐标,它之前的图形还留在窗口上,和新绘制的按钮叠加在一起,看起来就像按钮没消失。
简单说:每一帧都需要先清空画布,再重新绘制当前所有需要显示的元素,否则旧的渲染内容会一直残留。
内容的提问来源于stack exchange,提问作者nobod_369
相关产品推荐
相关产品推荐

