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

Pygame卡牌鼠标悬停透明效果失效问题求助

问题:Pygame卡牌悬停透明效果不生效

我用Pygame重制一款简单卡牌游戏,想实现鼠标悬停卡牌时,修改卡牌Surface的alpha值让它呈现轻微透明效果,但当前代码无法达成该效果。末尾的print语句能返回True,说明鼠标检测逻辑是对的,但透明效果就是不出来。hand是用image.load加载创建的Surface数组。

相关代码:

while running:
    mX, mY = pygame.mouse.get_pos()
    if 50 + 60 > mX > 50 and 500 + 84 > mY > 500:
        hand[0].set_alpha(100)
    else:
        hand[0].set_alpha(255)


    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        #Hover()
    if printHand:
        #print(hand)
        #print(cardSize)
        #print(hand[0].get_width())
        #print(hand[0].get_height())
        #print(hand[0].get_rect(center=(80, 542)))
        printHand = False

    if displayHand:
        DisplayHand(hand)
        DisplayBoard(pile1)
        DisplayBoard(pile2)
        displayHand = False



    print(50 + 60 > mX > 50 and 500 + 84 > mY > 500)
    pygame.display.update()

问题原因及解决办法

  • 核心问题:你只修改了Surface的alpha值,但DisplayHand仅在displayHand为True时执行一次,后续帧没有重新绘制卡牌,导致alpha的变化无法更新到屏幕上。
  • 修复步骤:
    1. 移除displayHand的条件判断,把绘制函数放到主循环的每一轮执行,确保每帧都重新渲染卡牌:
      while running:
          mX, mY = pygame.mouse.get_pos()
          # 鼠标检测逻辑...
      
          # 事件处理...
      
          # 每帧都执行绘制
          DisplayHand(hand)
          DisplayBoard(pile1)
          DisplayBoard(pile2)
      
          pygame.display.update()
      
    2. 替换硬编码坐标检测,用卡牌的rect做碰撞判断,更灵活可靠:
      # 假设卡牌绘制在(50, 500)位置,先获取对应的rect
      card_rect = hand[0].get_rect(topleft=(50, 500))
      if card_rect.collidepoint(mX, mY):
          hand[0].set_alpha(100)
      else:
          hand[0].set_alpha(255)
      
    3. 确保Surface支持alpha通道:加载图片时使用convert_alpha()格式,比如:
      hand[0] = pygame.image.load("your_card_image.png").convert_alpha()
      
      这样set_alpha才能正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:55:22