如何在pygame中制作半透明精灵
我刚开始使用pygame这个库,想要制作一个半透明的精灵(就是游戏中的角色或物体),但是这个精灵的源文件是一个不透明的位图文件,直接从硬盘加载的。我不想去修改这个源文件,如果可以的话。我相信用pygame的代码一定能做到这一点,但我在网上找不到相关的帮助。
4 个回答
2
如果你的图片有一个纯色的背景,而你想让这个背景变成透明的,你可以把这个颜色设置为 color_key 的值。这样在显示这张图片的时候,pygame 就会把这个颜色变成透明。
例如:
color = image.get_at((0,0)) #we get the color of the upper-left corner pixel
image.set_colorkey(color)
4
在加载图片之后,你需要在Surface
上启用一个透明通道,效果大概是这样的:
background = pygame.Display.set_mode()
myimage = pygame.image.load("path/to/image.bmp").convert_alpha(background)
这段代码会加载图片,并立即将其转换为适合在显示表面上进行透明混合的像素格式。如果你需要把图像复制到其他格式的离屏缓冲区,也可以使用其他的表面。
你可以很简单地设置每个像素的透明度,比如说你有一个函数,它接受一个包含红、绿、蓝三种颜色值的三元组,并返回一个包含颜色和透明度的四元组(rgba)。这样你就可以逐个像素地修改表面:
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]))
还有其他更实用的方法来做到这一点,但我希望这能让你大致明白这个概念。
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()
这是最好的方法吗?看起来这是最简单明了的做法。