- Python
pygame 飞机大战
- 2024-6-22 19:04:33 @
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]返回动画帧组成的列表
1 条评论
-
mrhowe SU @ 2024-6-29 19:04:35
- 1