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

Pygame取消按钮悬停图片淡入效果实现立即切换问题

Pygame按钮悬停图片渐变问题解决办法

问题原因

出现淡入淡出效果的核心原因是背景设置了20的透明度:每次游戏循环绘制的半透明背景无法完全覆盖上一帧的按钮画面,上一帧残留的旧按钮图像会被后续多帧的半透明背景慢慢覆盖,视觉上就形成了渐变过渡效果。

修复方案

可根据需求选择任意一种方案:

  • 如果不需要背景半透明效果,直接删除bg.set_alpha(20)这行代码即可,不透明的背景会完全覆盖上一帧所有内容,按钮图片就会立即切换
  • 如果需要保留背景半透明效果,在每次绘制背景前先调用screen.fill()用纯色清空画布,彻底清除上一帧的画面残留即可

同时原代码还存在点击事件对应代码缩进错误、Button类硬编码悬停图片的问题,也可以同步修正,修复后的完整代码如下:

import pygame, sys, random

# 主窗口配置
screen_width = 1280
screen_height = 720
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Classics")

# 资源加载
bg = pygame.image.load("bg.png")
pong_btn_img = pygame.image.load("Button2.png")
pong_btn_img_p = pygame.image.load("pongpressed.png")
default_img_size = (300, 195)
pong_btn_img = pygame.transform.scale(pong_btn_img, default_img_size)
pong_btn_img_p = pygame.transform.scale(pong_btn_img_p, default_img_size)

# 基础初始化
pygame.init()
clock = pygame.time.Clock()


# 自定义按钮类
class Button():
    def __init__(self, x, y, normal_img, hover_img):
        self.normal_img = normal_img
        self.hover_img = hover_img
        self.rect = self.normal_img.get_rect()
        self.rect.topleft = (x,y)
    def draw(self):
        # 获取鼠标位置
        pos = pygame.mouse.get_pos()
        # 判断悬停状态
        if self.rect.collidepoint(pos):
            # 绘制悬停态
            screen.blit(self.hover_img, (self.rect.x, self.rect.y + 20))
            # 处理点击事件
            if pygame.mouse.get_pressed()[0]:
                exec(open("Game.py").read())
        else:
            # 绘制正常态
            screen.blit(self.normal_img, (self.rect.x, self.rect.y))

# 按钮实例化
pong_btn = Button(525, 300, pong_btn_img, pong_btn_img_p)

while True:
    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    # 清空画布(如果不需要保留半透明背景,可删除fill和set_alpha两行)
    screen.fill((0,0,0))
    bg.set_alpha(20)
    screen.blit(bg, (0,0))
    pong_btn.draw()

    # 刷新画面
    pygame.display.flip()
    clock.tick(60)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:27:02