当玩家或敌人被击中时,我希望他们的精灵变成红色。本质上,我希望在精灵上具有透明的红色效果。 pygame提供了一种方法吗? (我使用多个图像作为角色的动画,所以创建一个红色的精灵,然后将其抹去,而不是正常的,将不会起作用)
答案 0 :(得分:0)
Pygame是低级别的,因此您必须编写自己的函数才能执行此操作。我玩了一下,找到了不错的方法。
在这里,我假设要变红的图像的透明度设置为像素alphas (即每个像素都有自己的alpha值)。这将让我控制发红的位置,例如防止透明背景被发红。
为了确保使用像素Alpha,在加载图像时,请使用.convert_alpha()
。
步骤如下:
这是代码:
import sys
import numpy as np
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 800))
pygame.display.set_caption("Test")
def reddening(surf):
"""surf: pygame.Surface to be reddened. The function returns a new surface."""
#making a red shade with transparency
redshade = pygame.Surface(surf.get_rect().size).convert_alpha()
redshade.fill((255, 0, 0, 100)) #red with alpha
#merging the alpha chanel of base image on the redshade, keeping minimum values (most transparent) in each pixel
alpha_basemask = pygame.surfarray.array_alpha(surf)
alpha_redmask = pygame.surfarray.pixels_alpha(redshade)
np.minimum(alpha_basemask, alpha_redmask, out=alpha_redmask)
#deleting the alpha_redmask reference to unlock redshade (or it cannot be blit)
del alpha_redmask
#reddening a copy of the original image
redsurf = surf.copy()
redsurf.blit(redshade, (0, 0))
return redsurf
#loading a base image with transparency
surf_base = pygame.image.load('testcolim_walpha.png').convert_alpha()
red_surf = reddening(surf_base)
screen.blit(red_surf, (100, 200))
pygame.display.update()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
为显示效果,这是原始的'testimage.png'
(它是矩形的,带有环绕的alpha通道以制作椭圆形):
这是上面代码变红的图像:
这里没有动画,它是静态的。但是想法是一样的。使用变红功能在动画的每一帧期间变红每个Sprite图像。
为了使您的游戏更快,您可以一次将所有图像变红,存储并根据您的游戏逻辑(命中点值或其他值)从原始非变红的图像切换到变红的图像。