当前位置: 首页 > 知识库问答 >
问题:

如何让玩家/敌人在被击中时变色?

傅经业
2023-03-14

当玩家或敌人被击中时,我希望他们的精灵变成红色。从本质上讲,我想要在精灵上显示透明的红色效果。皮游戏是否提供了一种方法来做到这一点?(我使用多个图像,因为角色是动画的,所以创建一个红色的精灵,只是闪烁而不是正常的子画面是行不通的)

共有1个答案

养振濂
2023-03-14

Pygame是低级的,所以你必须编写自己的函数来完成它。我玩了一会儿,找到了一个不错的方法
这里我假设要变红的图像有一个带有像素阿尔法的透明度集(即每个像素都有自己的阿尔法值)。这将让我控制变红发生的位置,例如防止超父背景变红。
为了确保使用像素阿尔法,加载图像时使用。convert_alpha()

步骤如下:

  1. 做一个红色阴影。使用像素字母创建曲面,用红色填充,每个像素的透明度值相等。选择一个你认为最适合你的情况的alpha值(越透明,越淡的效果越红)
  2. 将红色阴影的alpha通道与要变红的图像的alpha-通道合并。保持每个像素的最低(最透明)值。使用surfarray模块和numpy,您可以非常有效地完成这项工作
  3. 在“精灵”(Sprite)表面上划出红色阴影曲面。这将使它变红
  4. 将变红的“精灵”曲面Blit到显示器

这是代码:

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()

为了显示效果,这是原始的< code>'testimage.png'(它是一个矩形,周围有一个alpha通道以形成椭圆):

这是带有上述代码的红色图像:

这里没有动画,是静态的。但是想法是一样的。在动画的每一帧中使用红色功能来红色每个雪碧图像。
为了让你的游戏更快,你可以将所有的图像红色化一次,存储它们,并根据你的游戏逻辑(命中点数或其他)从原来的不红色切换到红色的。

 类似资料:
  • 我让敌人随机移动并看着玩家,现在我想让敌人射击玩家,我不知道为什么,但射击完全随机,正如你在下面的gif中看到的(你按左ctrl射击)。 无论如何,这是玩家类: 这是我的敌人类: 这是我的子弹课: 如果你想测试代码,我已经删除了不必要的东西:< br > https://pastebin.com/HT93hUzt 您可以在此处下载替换图像来测试代码(记得更改图像加载字符串!): https://w

  • 在我创建的游戏中,我只希望僵尸能够每分钟击中玩家2次,而不是拿走洞健康条,因为它会让玩家快速受伤。 这是检查玩家和僵尸碰撞的代码。我这样做是为了让玩家只受到10点伤害,但这样玩家就再也不会受到伤害了。我尝试使用if语句来检查玩家是否无敌,并且在if语句中有一个for循环,当int达到30000时,该循环会使玩家死亡,但僵尸仍然会以如此快的速度伤害玩家,以至于洞健康条被拿走。

  • 我正在创建一个应用程序,实现谷歌的turn为基础的多人api,但我是相对新的Android。我需要做的是,当用户开始与对手比赛时,他们需要等待第二个用户开始,以便在布局可以填充之前将某些数据传递给他们。基本上,我有什么是你从谷歌的回合为基础的多人游戏的例子。它开始一场比赛,并让开始比赛的人进行第一轮。有人对此有经验吗?我不知道如何让首发球员等到另一个球员轮到他们。 我让开始的球员传递他们的信息,他

  • 我使用pygame创建了一个游戏,我想让pygame在玩家触摸屏幕一侧时给出一个错误,例如“您无法触摸屏幕侧面”。我尝试在互联网上搜索,但我没有找到任何好的结果。我想过在屏幕上添加一个方块,当玩家触摸方块时,它会发出警告,但这花了很长时间,无论如何都不起作用。我也不知道如何发出警报,然后在发出警报后,让游戏重新开始。有人知道如何做到这一点吗?

  • 我想通过单击LIBGDX中的按钮来实现LIBGDX中的跳转。一切都很好,但只要不断地点击按钮,玩家就会继续往上走。如果我不松开按钮,它就会超出屏幕高度。所以,我希望玩家在每次点击按钮时只跳到一定高度,虽然按钮被连续点击,但我希望玩家只跳到一定高度,而不是超出屏幕。这是我的密码, 在执行这段代码时,游戏就像FLAPPY BIRD一样工作。但是我只想达到一定的高度。我尝试了各种方法,也引用了这个堆栈答

  • 所以,在学校的一个项目中,我一直在尝试建立一个跳跃机制。然而,我一直面临的问题是,玩家可以只是四处漂浮,而不是在达到某个跳跃高度后摔倒。 我尝试过很多东西,包括按下up键时的正常想法,设置跳转等于true,然后在actionPerform方法中,将yVelester设置为-4。但是,当单击跳转键时,我记录了当时的yPotions,当当前的yPotions小于原始位置-50时,我将yVelSpeed