python - Pygame:如何慢慢淡出并杀死 Sprite ?

标签 python pygame sprite fadeout kill

当我运行此代码sprite.spritecollide(a,group,True)时, Sprite 将从屏幕上删除。但它立刻就消失了。如何对其应用淡入淡出效果?我希望它在完全删除之前慢慢淡出。我已阅读文档,但仍然不确定如何操作。

最佳答案

您可以通过用白色(具有所需的 Alpha 值)填充每个像素的 Alpha 表面来使其透明,并传递 pygame.BLEND_RGBA_MULT 特殊标志。将 self.fade 属性添加到您的 sprite 子类中,并将其设置为 True 以启动效果,然后减少每帧的 alpha 值,制作原始图像的副本并使其透明。当 alpha <= 0 时杀死 Sprite 。

import pygame as pg
from pygame.math import Vector2


pg.init()
PLAYER_IMAGE = pg.Surface((42, 68), pg.SRCALPHA)
PLAYER_IMAGE.fill(pg.Color('dodgerblue'))


class Entity(pg.sprite.Sprite):

    def __init__(self, pos, *groups):
        super().__init__(*groups)
        self.image = PLAYER_IMAGE
        self.rect = self.image.get_rect(center=pos)
        self.vel = Vector2(0, 0)
        self.pos = Vector2(pos)
        self.alpha = 255
        self.fade = False

    def update(self):
        self.pos += self.vel
        self.rect.center = self.pos

        if self.fade:  # If the fade effect is activated.
            # Reduce the alpha each frame, create a new copy of the original
            # image and fill it with white (with the self.alpha value)
            # and pass the BLEND_RGBA_MULT special_flag to reduce the alpha.
            self.alpha = max(0, self.alpha-5)  # alpha should never be < 0.
            self.image = PLAYER_IMAGE.copy()
            self.image.fill((255, 255, 255, self.alpha), special_flags=pg.BLEND_RGBA_MULT)
            if self.alpha <= 0:  # Kill the sprite when the alpha is <= 0.
                self.kill()


def main():
    screen = pg.display.set_mode((640, 480))
    clock = pg.time.Clock()
    all_sprites = pg.sprite.Group()
    entity = Entity((250, 170), all_sprites)
    entity2 = Entity((350, 270), all_sprites)
    group = pg.sprite.Group(entity2)
    done = False

    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            elif event.type == pg.KEYDOWN:
                if event.key == pg.K_d:
                    entity.vel.x = 5
                elif event.key == pg.K_a:
                    entity.vel.x = -5
                elif event.key == pg.K_w:
                    entity.vel.y = -5
                elif event.key == pg.K_s:
                    entity.vel.y = 5
                elif event.key == pg.K_SPACE:
                    entity.fade = True  # Start the fade effect.
            elif event.type == pg.KEYUP:
                if event.key == pg.K_d and entity.vel.x > 0:
                    entity.vel.x = 0
                elif event.key == pg.K_a and entity.vel.x < 0:
                    entity.vel.x = 0
                elif event.key == pg.K_w:
                    entity.vel.y = 0
                elif event.key == pg.K_s:
                    entity.vel.y = 0

        all_sprites.update()

        collided = pg.sprite.spritecollide(entity, group, False)
        for sprite in collided:
            sprite.fade = True  # Start the fade effect.

        screen.fill((30, 30, 30))
        all_sprites.draw(screen)

        pg.display.flip()
        clock.tick(60)

    pg.quit()


if __name__ == '__main__':
    main()

关于python - Pygame:如何慢慢淡出并杀死 Sprite ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53623302/

相关文章:

python - 在列表解析中使用 if, elif, else, Python

python - 如何比较两个 Pandas DataFrame 并显示 DataFrame 2 中的差异

ios - Sprite Kit 碰撞次数超过 1 次

html - 图像 Sprite 和触摸设备

python - 尝试迭代字典时出现类型错误: 'int' 不可迭代

python - 为什么super()继承 "wrong"类?

python - 如何在 Sprite 的底部添加额外的图像或矩形?

python - Pygame 运行没有任何问题,但屏幕上没有绘制任何内容

python - Pygame圆碰撞?

CSS Sprite 加载速度 - 哪个更快?