Pygame: 我如何慢慢淡出并杀死精灵?
Pygame: How do I slowly fade and kill a sprite?
当我 运行 此代码时 sprite.spritecollide(a,group,True)
精灵从屏幕上移除。但它会立即消失。如何对其应用淡入淡出效果?我希望它在完全移除之前慢慢淡出。我已阅读文档,但仍不确定如何操作。
您可以通过用白色(具有所需的 alpha 值)填充每个像素的 alpha 表面并传递 pygame.BLEND_RGBA_MULT
特殊标志来使它透明。将 self.fade
属性添加到您的 sprite 子类并将其设置为 True
以启动效果,然后减少每帧的 alpha 值,制作原始图像的副本并使其透明。当 alpha <= 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()
当我 运行 此代码时 sprite.spritecollide(a,group,True)
精灵从屏幕上移除。但它会立即消失。如何对其应用淡入淡出效果?我希望它在完全移除之前慢慢淡出。我已阅读文档,但仍不确定如何操作。
您可以通过用白色(具有所需的 alpha 值)填充每个像素的 alpha 表面并传递 pygame.BLEND_RGBA_MULT
特殊标志来使它透明。将 self.fade
属性添加到您的 sprite 子类并将其设置为 True
以启动效果,然后减少每帧的 alpha 值,制作原始图像的副本并使其透明。当 alpha <= 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()