飞机大战文件

image image image image image image image

plane.py文件源代码

from settings import *  # [2]
from pygame.locals import *  # [2]

class HeroPlane(pygame.sprite.Sprite):
    def __init__(self, images, rate=50):
        """
        英雄飞机
        :param images: 组成飞机的图片列表
        :param rate: 飞机动画的播放频率
        """
        pygame.sprite.Sprite.__init__(self)  # [2]初始化动画精灵
        self._layer = 10  # [2]飞机所在的层级
        self.images = images  # [2]图片列表
        self.image = self.images[0]  # [2]surface对象
        self.rect = self.image.get_rect()  # [2]获取rect对象
        self.mask = pygame.sprite.from_surface(self.image)  # [2]图层蒙版,用于完美碰撞检测
        self.rect.midbottom = [WIDTH / 2, HEIGHT - 10]  # [2]设置飞机初始位置

        self.speedx = 5  # [2]飞机x方向速度
        self.speedy = 5  # [2]飞机y方向速度
        self.hp = 100  # [2]飞机生命数

        self.all_frame = len(self.images)  # [2]总的动画帧数目
        self.frame = 0  # [2]当前动画帧
        self.last_time = 0  # [2]记录上次的时间
        self.rate = rate  # [2]动画播放间隔

    def update(self):
        """移动我方飞机"""
        if self.hp > 0:  # [2]如果我方飞机状态为存活
            keys = pygame.key.get_pressed()  # [2]获取按键
            if keys[K_w] and self.rect.top > 0:  # [2]如果按下 w 键并且没有超过窗口顶部
                self.rect.top -= self.speedy  # [2]飞机向上飞
            if keys[K_s] and self.rect.bottom < HEIGHT:  # [2]如果按下 s 键并且没有超过窗口底部
                self.rect.bottom += self.speedy  # [2]飞机向下飞
            if keys[K_a] and self.rect.left > 0:  # [2]如果按下 a 键并且没有超过窗口底左侧
                self.rect.left -= self.speedx  # [2]飞机向左飞
            if keys[K_d] and self.rect.right < WIDTH:  # [2]如果按下 d 键并且没有超过窗口右侧
                self.rect.right += self.speedx  # [2]飞机向右飞
        else:
            self.kill()  # [2]移出精灵组

        now = pygame.time.get_ticks()  # [2]获取当前时间
        if now - self.last_time > self.rate:  # [2]每50毫秒更新一帧动画
            self.last_time = now  # [2]更新上次记录的时间为当前时间
            self.frame += 1  # [2]动画帧数加1
            if self.frame >= self.all_frame:  # [2]如果动画播放到最后一个
                self.frame = 0  # [2]重置为第一个
            self.image = self.images[self.frame]  # [2]更新图片

image.py源代码

"""第6章播放动画中有此功能"""
import pygame  # [2]
def load_images(filename, rows, columns):
    """
    [2]加载动画图片
    :param filename: 图片的文件名
    :param rows: 动画的行数
    :param columns: 动画的列数
    :return: images: 动画帧组成的列表
    """
    images = []  # [2]存储动画帧的列表
    master_image = pygame.image.load(filename).convert_alpha()  # [2]加载动画主图
    master_rect = master_image.get_rect()  # [2]获取序列图的尺寸
    frame_width = master_rect.width//columns  # [2]单个动画帧的宽度
    frame_height = master_rect.height//rows  # [2]单个动画帧的高度
    for row in range(rows):  # [2]根据单个动画帧尺寸切割图片
        for col in range(columns):
            frame_rect = (col * frame_width, row * frame_height, frame_width, frame_height)
            frame_image = master_image.subsurface(frame_rect)
            images.append(frame_image)  # [2]将单个动画帧加入到列表
    return images  # [2]返回动画帧组成的列表

image

1 条评论

  • 1