击中时如何使玩家/敌人改变颜色?

时间:2019-11-01 17:35:47

标签: python pygame

当玩家或敌人被击中时,我希望他们的精灵变成红色。本质上,我希望在精灵上具有透明的红色效果。 pygame提供了一种方法吗? (我使用多个图像作为角色的动画,所以创建一个红色的精灵,然后将其抹去,而不是正常的,将不会起作用)

1 个答案:

答案 0 :(得分:0)

Pygame是低级别的,因此您必须编写自己的函数才能执行此操作。我玩了一下,找到了不错的方法。
在这里,我假设要变红的图像的透明度设置为像素alphas (即每个像素都有自己的alpha值)。这将让我控制发红的位置,例如防止透明背景被发红。
为了确保使用像素Alpha,在加载图像时,请使用.convert_alpha()

步骤如下:

  1. 制作红色阴影。创建一个具有像素Alpha的Surface,用红色填充,每个像素的透明度值相等。选择您认为最适合您的情况的Alpha值(透明度越高,变红的效果越浅)。
  2. 将红色阴影的alpha通道与要变红的图像的alpha通道合并。保持每个像素的最低(最透明)值。您可以使用surfarray模块和 numpy 非常有效地做到这一点。
  3. 在Sprite的表面上涂上红色阴影表面。这会变红。
  4. 将变红的Sprite表面消光到显示器上。

这是代码:

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通道以制作椭圆形):

original image

这是上面代码变红的图像:

reddened image

如何在动画中使用它

这里没有动画,它是静态的。但是想法是一样的。使用变红功能在动画的每一帧期间变红每个Sprite图像。
 为了使您的游戏更快,您可以一次将所有图像变红,存储并根据您的游戏逻辑(命中点值或其他值)从原始非变红的图像切换到变红的图像。