4

我刚刚开始使用 pygame,我正在尝试制作一个半透明的精灵,而精灵的源文件是从磁盘加载的不透明位图文件。如果可以的话,我不想编辑源图像。我确信有办法用 pygame 代码做到这一点,但谷歌对我没有帮助。

4

4 回答 4

4

加载图像后,您需要在Surface. 看起来有点像这样:

background = pygame.Display.set_mode()
myimage = pygame.image.load("path/to/image.bmp").convert_alpha(background)

这将加载图像并立即将其转换为适合 Alpha 混合到显示表面的像素格式。如果您需要以另一种格式传送到其他屏幕外缓冲区,则可以使用其他表面。

您可以简单地设置每个像素的 alpha,假设您有一个函数,它采用 3 元组作为 rgb 颜色值并返回一些所需的 rgba 颜色 + alpha 的 4 元组,您可以更改每个像素的表面:

def set_alphas(color):
    if color == (255,255,0): # magenta means clear
        return (0,0,0,0)
    if color == (0,255,255): # cyan means shadow
        return (0,0,0,128)
    r,g,b = color
    return (r,g,b,255) # otherwise use the solid color from the image.

for row in range(myimage.get_height()):
    for col in range(myimage,get_width()):
        myimage.set_at((row, col), set_alphas(myimage.get_at((row, col))[:3]))

还有其他更有用的方法可以做到这一点,但我希望这会给你这个想法。

于 2009-08-08T04:21:41.560 回答
2

如果您的图像具有纯色背景,您希望它变得透明,您可以将其设置为color_key值,并且 pygame 会在对图像进行 blitting 时使其透明。

例如:

color = image.get_at((0,0)) #we get the color of the upper-left corner pixel
image.set_colorkey(color)
于 2009-08-08T06:19:04.270 回答
2

我最初的问题可能不清楚,但我想我自己想通了。我正在寻找的是 Surface 的 set_alpha() 方法,所以我所要做的就是确保半透明图像在它们自己的表面上。

这是我精简代码的示例:

import pygame, os.path
from pygame.locals import *

class TranslucentSprite(pygame.sprite.Sprite):
  def __init__(self):
    pygame.sprite.Sprite.__init__(self, TranslucentSprite.container)
    self.image = pygame.image.load(os.path.join('data', 'image.bmp'))
    self.image = self.image.convert()
    self.image.set_colorkey(-1, RLEACCEL)
    self.rect = self.image.get_rect()
    self.rect.center = (320,240)

def main():
  pygame.init()
  screen = pygame.display.set_mode((640,480))
  background = pygame.Surface(screen.get_size())
  background = background.convert()
  background.fill((250,250,250))
  clock = pygame.time.Clock()
  transgroups = pygame.sprite.Group()
  TranslucentSprite.container = transgroups

  """Here's the Translucency Code"""
  transsurface = pygame.display.set_mode(screen.get_size())
  transsurface = transsurface.convert(screen)
  transsurface.fill((255,0,255))
  transsurface.set_colorkey((255,0,255))
  transsurface.set_alpha(50)

  TranslucentSprite()
  while 1:
    clock.tick(60)
    for event in pygame.event.get():
      if event.type == QUIT:
        return
      elif event.type == KEYDOWN and event.key == K_ESCAPE:
        return
    transgroups.draw(transsurface)
    screen.blit(background,(0,0))
    screen.blit(transsurface,(0,0))
    pygame.display.flip()

if __name__ == '__main__' : main()

这是最好的技术吗?这似乎是最简单直接的。

于 2009-08-10T04:01:55.747 回答
1

您可能会考虑切换到使用 png 图像,您可以直接在图像中进行任何类型的透明度。

于 2009-08-08T04:34:59.380 回答