目标:实现飞机的动态,爆炸效果的动态
普通方式的实现,图片的动态效果一般有两种
一种是多张图片,文件名最后一个字为有序的数字,连在一起就产生动画效果。
一种是一张图片,里面切割成多行,多列,这些分隔连着一起产生动画。
无论哪种图片,都是装入一个list,设置间隔,循环播放。
import pygame
class Bomb(object):
# 初始化爆炸
def __init__(self, scene):
self.main_scene = scene
# 加载爆炸资源,两种方法。
# 方法一 加载单张图片的列表
# self.images = [pygame.image.load("images/bomb/bomb" + str(v) + ".png") for v in range(1, 3)]
# 方法二 单张图片切片
# 爆炸特效的帧列表
self.images = []
self.boom_picture = pygame.image.load(
"./images/bomb/bomb.png").convert_alpha()
#四行、八列,单个 82x82像素
for r in range(4):
for c in range(8):
frame = self.boom_picture.subsurface(
[c * 82 , r * 82, 82 ,82])
self.images.append(frame)
# 设置当前爆炸播放索引
self.index = 0
# 图片爆炸播放间隔
self.interval = 2
self.interval_index = 0
# 爆炸位置
self.position = [0, 0]
# 是否可见
self.visible = False
# 设置爆炸播放的位置
def set_pos(self, x, y):
self.position[0] = x - 25
self.position[1] = y
# 爆炸播放
def action(self):
# 如果爆炸对象状态不可见,则不计算坐标
if not self.visible:
return
# 控制每一帧图片的播放间隔
self.interval_index += 1
if self.interval_index < self.interval:
return
self.interval_index = 0
self.index = self.index + 1
if self.index >= len(self.images):
self.index = 0
self.visible = False
# 绘制爆炸
def draw(self):
# 如果对象不可见,则不绘制
if not self.visible:
return
self.main_scene.scene.blit(
self.images[self.index], (self.position[0], self.position[1]))