【问题标题】:How to add an alpha value to surface objects in pygame?如何在 pygame 中为表面对象添加 alpha 值?
【发布时间】:2013-07-22 14:06:54
【问题描述】:

我正在尝试制作一个菜单屏幕,其中“新游戏”和“加载游戏”图标周围似乎没有框,直到鼠标悬停在它们上方,此时它们有一个不透明的蓝色框。我还没有在代码中实现鼠标控件,因为我目前无法让蓝色框变得不透明。任何建议都会很棒。目前,当代码运行时屏幕是黑色的,但是删除第 30 行会导致屏幕正常显示,但没有 alpha 值。

import random, pygame, sys
from pygame.locals import *

FPS = 30 # frames per second, the general speed of the program
WINDOWWIDTH = 1000 # size of the window's width in pixels
WINDOWHEIGHT = 600 # size of window's height in pixels

#            R    G    B
WHITE    = (255, 255, 255)
RED      = (255, 0, 0)
BLUEINVIS = (0, 0, 255, 255)
BLUEOP = (0, 0, 255, 128)

# Colors

TEXTCOLOR = WHITE
TEXTBOXCOLOR = BLUEINVIS
HIGHLIGHTCOLOR = BLUEOP

BASICFONTSIZE = 20


def main():
    global FPSCLOCK, DISPLAYSURF, BASICFONT
    pygame.init()
    FPSCLOCK = pygame.time.Clock()
    DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
    DISPLAYSURF = DISPLAYSURF.convert_alpha()
    pygame.display.set_caption('Menu')

    BASICFONT = pygame.font.Font('freesansbold.ttf', 50)


    NEW_SURF, NEW_RECT = makeText('New Game', TEXTCOLOR, TEXTBOXCOLOR, WINDOWWIDTH /     2, WINDOWHEIGHT - (WINDOWHEIGHT * 3 / 8))
    LOAD_SURF, LOAD_RECT = makeText('Load Game', TEXTCOLOR, TEXTBOXCOLOR, WINDOWWIDTH / 2, WINDOWHEIGHT - (WINDOWHEIGHT / 4))

    DISPLAYSURF.convert_alpha()

    while True: # main game loop

        DISPLAYSURF.fill(RED)
        DISPLAYSURF.blit(NEW_SURF, NEW_RECT)
        DISPLAYSURF.blit(LOAD_SURF, LOAD_RECT)


        for event in pygame.event.get(): # event handling loop
            #if event.type == MOUSEBUTTONUP:

                #if NEW_RECT.collidepoint(event.pos):

                #elif LOAD_RECT.collidepoint(event.pos):

            #if newRectObj.collidepoint(event.pos):
                #newSurfaceObj = fontObj.render('New Game', True, TEXTCOLOR, HIGHLIGHTCOLOR)            

            if event.type == QUIT:
                pygame.quit()
                sys.exit()

        pygame.display.update()
        FPSCLOCK.tick(FPS)

def makeText(text, color, bgcolor, x, y):
    # create the Surface and Rect objects for some text.
    textSurf = BASICFONT.render(text, True, color, bgcolor)
    textRect = textSurf.get_rect()
    textRect.center = (x, y)
    return (textSurf, textRect)

if __name__ == '__main__':
    main()

【问题讨论】:

    标签: python pygame alpha


    【解决方案1】:

    使用:surface = surface.convert_alpha()

    单独使用surface.convert_alpha() 什么都不做。 convert_alpha() 返回具有 alpha 值的表面。

    http://www.pygame.org/docs/ref/surface.html#pygame.Surface.convert_alpha

    例如:image1 = pygame.image.load("images/person.png").convert_alpha()

    【讨论】:

      【解决方案2】:

      如果我用这个 sn-p 替换您的代码,它会在光标悬停时显示您的文本(蓝底白字)(灵感来自 this SO question)。如果您愿意,我还添加了一些透明度(取消注释 set_alpha 行):

      def main():
          global BASICFONT
          pygame.init()
          FPSCLOCK = pygame.time.Clock()
          DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
          background=pygame.Surface((DISPLAYSURF.get_rect().width, DISPLAYSURF.get_rect().height))
          background.fill(RED)
      
          BASICFONT = pygame.font.Font('freesansbold.ttf', 50)
      
          pygame.display.set_caption('Menu')
      
          NEW_SURF, NEW_RECT = makeText('New Game', TEXTCOLOR, TEXTBOXCOLOR, WINDOWWIDTH /     2, WINDOWHEIGHT - (WINDOWHEIGHT * 3 / 8))
          LOAD_SURF, LOAD_RECT = makeText('Load Game', TEXTCOLOR, TEXTBOXCOLOR, WINDOWWIDTH / 2, WINDOWHEIGHT - (WINDOWHEIGHT / 4))
          #NEW_SURF.set_alpha(128)
          #LOAD_SURF.set_alpha(128)
      
          while True: # main game loop
      
              DISPLAYSURF.blit(background, background.get_rect())
              DISPLAYSURF.blit(NEW_SURF, NEW_RECT)
              DISPLAYSURF.blit(LOAD_SURF, LOAD_RECT)
      
              for event in pygame.event.get(): # event handling loop
                  if event.type == MOUSEMOTION:
                      if NEW_RECT.collidepoint(event.pos):
                        NEW_SURF = BASICFONT.render('New Game', True, TEXTCOLOR, HIGHLIGHTCOLOR)
                        #NEW_SURF.set_alpha(255)
      
                      elif LOAD_RECT.collidepoint(event.pos):
                        LOAD_SURF = BASICFONT.render('Load Game', True, TEXTCOLOR, HIGHLIGHTCOLOR)
                        #LOAD_SURF.set_alpha(255)
      
                      else:
                        NEW_SURF = BASICFONT.render('New Game', True, TEXTCOLOR, TEXTBOXCOLOR)
                        LOAD_SURF = BASICFONT.render('Load Game', True, TEXTCOLOR, TEXTBOXCOLOR)
                        #NEW_SURF.set_alpha(128)
                        #LOAD_SURF.set_alpha(128)
      

      【讨论】:

      • 感谢您的帮助。这是我第一次在这里发帖,我并不失望。我只是想知道是否有任何方法可以让我的文本及其周围的框具有不同的 alpha 值。我希望文本始终为 255,并尽可能更改框。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多