如何删除pygame自定义菜单中移动后残留的原有光标图像
问题原因
Pygame的屏幕绘制为叠加逻辑,所有绘制操作都是直接在当前屏幕画布上覆盖内容,不会自动清除上一帧的图案。你当前的代码仅在函数初始化时绘制了一次背景、初始光标和按钮,进入事件循环后只在按键时绘制新位置的光标,旧位置的光标没有被背景覆盖,因此会残留形成重影。
另外你代码里的CursorOne_move.move_ip(x[OneX], 61)用法错误:move_ip是相对位移方法,会在当前坐标的基础上累加传入的数值,而你传入的是绝对坐标,会导致光标位置越跑越偏。
修复方案
将所有绘制逻辑移到事件循环内部,每次处理完事件后,先重绘背景覆盖上一帧的全部内容,再绘制最新位置的光标、按钮等元素,最后统一刷新屏幕。
修正后的代码示例
One_Right_Key = pygame.K_RIGHT # 游戏自定义设置菜单 def Customisation(players): # 初始化第二玩家光标位置,单玩家时设为不存在的下标避免冲突 TwoX = 100 # 提前加载资源,不要放在循环里重复加载 background = pygame.image.load('Menu/Customisation Background.png') # 加载1P光标 CursorOne = pygame.image.load('Misc/P1 Cursor.png') CursorOne = pygame.transform.scale(CursorOne, (124, 100)) OneX = 0 # 加载2P光标(如果是双人模式) CursorTwo = None if players == 2: CursorTwo = pygame.image.load('Misc/P2 Cursor.png') CursorTwo = pygame.transform.scale(CursorTwo, (124, 100)) TwoX = 1 # 3个角色选项的X坐标 x = [157, 545, 954] # 返回按钮文本 Back_Text = BackButtonFont.render("Back", True, (255, 255, 255)) Running = True while Running: # 1. 先绘制背景,覆盖上一帧的所有内容 screen.blit(background, (0, 0)) # 2. 处理事件 for event in pygame.event.get(): if event.type == pygame.MOUSEBUTTONUP: mouse = pygame.mouse.get_pos() if 0 <= mouse[0] <= 280 and 611 < mouse[1] <= 719: MainMenu() return if event.type == pygame.KEYDOWN: if event.key == One_Right_Key: OneX += 1 # 避免和2P光标位置重复 if OneX == TwoX: OneX += 1 # 下标越界就回滚到第一个位置 if OneX >= 3: OneX = 0 if event.type == pygame.QUIT: pygame.quit() exit() # 3. 绘制当前最新的UI元素 # 绘制1P光标 screen.blit(CursorOne, (x[OneX], 61)) # 双人模式下绘制2P光标 if players == 2: screen.blit(CursorTwo, (x[TwoX], 61)) # 绘制返回按钮 screen.blit(Back_Text, (37, 628)) # 4. 统一刷新屏幕 pygame.display.flip()
内容的提问来源于stack exchange,提问作者IMC364
相关产品推荐
相关产品推荐

