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

如何删除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:27:04