Pygame: Как мне медленно исчезать и убивать спрайтов?

1

Когда я запускаю этот код sprite.spritecollide(a,group,True) спрайт удаляется с экрана. Но он мгновенно исчезает. Как применить к нему эффект затухания? Я хочу, чтобы он медленно исчезал, прежде чем он полностью удаляется. Я прочитал документацию, но все еще не знаю, как это сделать.

Теги:
pygame
kill
sprite
fadeout

1 ответ

0

Вы можете сделать прозрачную альфа-поверхность прозрачной, заполнив ее белым (с желаемым значением альфа), а также pygame.BLEND_RGBA_MULT специальный флаг pygame.BLEND_RGBA_MULT. Добавьте атрибут self.fade в свой подкласс sprite и установите для него значение True чтобы начать эффект, затем уменьшите значение альфа каждого кадра, сделайте копию исходного изображения и сделайте его прозрачным. Убейте спрайт, когда альфа <= 0.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню