手机版
网站地图
美文美图
最新动态
你好,欢迎访问
好美文阅读网
个性皮肤
搜索
网站首页
美文
文章
散文
日记
诗歌
小说
故事
句子
作文
签名
祝福语
情书
范文
读后感
文学百科
美文摘抄
节日文章
名家散文
网名大全
座右铭
口号大全
面试技巧
说说大全
阅读答案
诗词默写
流言蜚语
节日祝福
好句子
经典台词
谚语大全
亲情故事
友情故事
表白情书
工作报告
活动总结
心得体会
专题汇总
美文网首页
飞机大战
飞机大战
作者:
v_c61b
| 来源:发表于
2018-03-18 19:56 被阅读0次
一:
安装pygame
$sudo pip3 install pygame
验证安装
$python3 -m pygame.examples.aliens
二:
1.1 游戏的初始化和退出
要使用 pygame 提供的所有功能之前,需要调用 init 方法
在游戏结束前需要调用一下 quit 方法
方法说明
pygame.init()导入并初始化所有 pygame 模块,使用其他模块之前,必须先调用 init 方法
pygame.quit()卸载所有 pygame 模块,在游戏结束之前调用
三:
理解游戏中的坐标系
坐标系
原点 在 左上角 (0, 0)
x 轴 水平方向向 右,逐渐增加
y 轴 垂直方向向 下,逐渐增加
在游戏中,所有可见的元素 都是以 矩形区域 来描述位置的
要描述一个矩形区域有四个要素:(x, y) (width, height)
pygame 专门提供了一个类 pygame.Rect 用于描述 矩形区域
Rect(x,y,width,height)->Rect
四:
创建游戏主窗口
pygame 专门提供了一个 模块 pygame.display 用于创建、管理 游戏窗口
方法说明
pygame.display.set_mode()初始化游戏显示窗口
pygame.display.update()刷新屏幕内容显示,稍后使用
set_mode 方法
set_mode(resolution=(0,0),flags=0,depth=0)->Surface
作用 —— 创建游戏显示窗口
参数
resolution 指定屏幕的 宽 和 高,默认创建的窗口大小和屏幕大小一致
flags 参数指定屏幕的附加选项,例如是否全屏等等,默认不需要传递
depth 参数表示颜色的位数,默认自动匹配
返回值
暂时 可以理解为 游戏的屏幕,游戏的元素 都需要被绘制到 游戏的屏幕 上
注意:必须使用变量记录 set_mode 方法的返回结果!因为:后续所有的图像绘制都基于这个返回结果
# 创建游戏主窗口screen=pygame.display.set_mode((480,700))
五:
为了做到游戏程序启动后,不会立即退出,通常会在游戏程序中增加一个 游戏循环
所谓 游戏循环 就是一个 无限循环
在 创建游戏窗口 代码下方,增加一个无限循环
注意:游戏窗口不需要重复创建
# 创建游戏主窗口screen=pygame.display.set_mode((480,700))
# 游戏循环whileTrue:
pass
六:
绘制背景图像
需求
加载 background.png 创建背景
将 背景 绘制在屏幕的 (0, 0) 位置
调用屏幕更新显示背景图像
# 绘制背景图像# 1> 加载图像
bg=pygame.image.load("./images/background.png")
# 2> 绘制在屏幕
screen.blit(bg,(0,0))
# 3> 更新显示
pygame.display.update()
七:
理解 游戏循环 和 游戏时钟
游戏循环的作用
保证游戏 不会直接退出
变化图像位置 —— 动画效果
每隔 1 / 60 秒 移动一下所有图像的位置
调用 pygame.display.update() 更新屏幕显示
检测用户交互 —— 按键、鼠标等...
3.3 游戏时钟
pygame 专门提供了一个类 pygame.time.Clock 可以非常方便的设置屏幕绘制速度 —— 刷新帧率
要使用 时钟对象 需要两步:
1)在 游戏初始化 创建一个 时钟对象
2)在 游戏循环 中让时钟对象调用 tick(帧率) 方法
tick 方法会根据 上次被调用的时间,自动设置 游戏循环 中的延时
# 3. 创建游戏时钟对象
clock=pygame.time.Clock()
i=0
# 游戏循环
whileTrue:
# 设置屏幕刷新帧率
clock.tick(60)
print(i)
i+=1
八:
英雄的简单动画实现需求在 游戏初始化 定义一个 pygame.Rect 的变量记录英雄的初始位置在 游戏循环 中每次让 英雄 的 y - 1 —— 向上移动y <= 0 将英雄移动到屏幕的底部提示:每一次调用 update() 方法之前,需要把 所有的游戏图像都重新绘制一遍而且应该 最先 重新绘制 背景图像# 4. 定义英雄的初始位置hero_rect = pygame.Rect(150, 500, 102, 126) while True: # 可以指定循环体内部的代码执行的频率 clock.tick(60) # 更新英雄位置 hero_rect.y -= 1 # 如果移出屏幕,则将英雄的顶部移动到屏幕底部 if hero_rect.y <= 0: hero_rect.y = 700 # 绘制背景图片 screen.blit(bg, (0, 0)) # 绘制英雄图像 screen.blit(hero, hero_rect) # 更新显示 pygame.display.update()
九:
在游戏循环中 监听 事件
事件 event
就是游戏启动后,用户针对游戏所做的操作
例如:点击关闭按钮,点击鼠标,按下键盘...
监听
在 游戏循环 中,判断用户 具体的操作
只有 捕获 到用户具体的操作,才能有针对性的做出响应
代码实现
pygame 中通过 +) 可以获得 用户当前所做动作 的 事件列表
用户可以同一时间做很多事情
提示:这段代码非常的固定,几乎所有的 pygame 游戏都 大同小异!
# 游戏循环
whileTrue:
# 设置屏幕刷新帧率
clock.tick(60)
# 事件监听
foreventinpygame.event.get():
# 判断用户是否点击了关闭按钮
ifevent.type==pygame.QUIT:
print("退出游戏...")
pygame.quit()
# 直接退出系统
exit()
十:
精灵
在游戏开发中,通常把 显示图像的对象 叫做精灵 Sprite
精灵 需要 有 两个重要的属性
image 要显示的图像
rect 图像要显示在屏幕的位置
默认的 update() 方法什么事情也没做
子类可以重写此方法,在每次刷新屏幕时,更新精灵位置
注意:pygame.sprite.Sprite 并没有提供 image 和 rect 两个属性
需要程序员从 pygame.sprite.Sprite 派生子类
并在 子类 的 初始化方法 中,设置 image 和 rect 属性
精灵组
一个 精灵组 可以包含多个 精灵 对象
调用 精灵组 对象的 update() 方法
可以 自动 调用 组内每一个精灵 的 update() 方法
调用 精灵组 对象的 draw(屏幕对象) 方法
可以将 组内每一个精灵 的 image 绘制在 rect 位置
Group(*sprites)->Group
注意:仍然需要调用 pygame.display.update() 才能在屏幕看到最终结果
十一:
派生精灵子类
新建 plane_sprites.py 文件
定义 GameSprite 继承自 pygame.sprite.Sprite
注意
如果一个类的 父类 不是 object
在重写 初始化方法 时,一定要 先 super() 一下父类的 __init__ 方法
保证父类中实现的 __init__ 代码能够被正常执行
属性
image 精灵图像,使用 image_name 加载
rect 精灵大小,默认使用图像大小
speed 精灵移动速度,默认为 1
方法
update 每次更新屏幕时在游戏循环内调用
让精灵的 self.rect.y += self.speed
提示
image 的 get_rect() 方法,可以返回 pygame.Rect(0, 0, 图像宽, 图像高) 的对象
importpygame
classGameSprite(pygame.sprite.Sprite):
"""游戏精灵基类"""
def__init__(self,image_name,speed=1):
# 调用父类的初始化方法
super().__init__()
# 加载图像
self.image=pygame.image.load(image_name)
# 设置尺寸
self.rect=self.image.get_rect()
# 记录速度
self.speed=speed
defupdate(self,*args):
# 默认在垂直方向移动
self.rect.y+=self.speed
十二:
使用 游戏精灵 和 精灵组 创建敌机
需求
使用刚刚派生的 游戏精灵 和 精灵组 创建 敌机 并且实现敌机动画
步骤
使用 from 导入 plane_sprites 模块
from 导入的模块可以 直接使用
import 导入的模块需要通过 模块名. 来使用
在 游戏初始化 创建 精灵对象 和 精灵组对象
在 游戏循环中 让 精灵组 分别调用 update() 和 draw(screen) 方法
职责
精灵
封装 图像 image、位置 rect 和 速度 speed
提供 update() 方法,根据游戏需求,更新位置 rect
精灵组
包含 多个 精灵对象
update 方法,让精灵组中的所有精灵调用 update 方法更新位置
draw(screen) 方法,在 screen 上绘制精灵组中的所有精灵
实现步骤
1) 导入 plane_sprites 模块
fromplane_spritesimport*
2) 修改初始化部分代码
# 创建敌机精灵和精灵组
enemy1=GameSprite("./images/enemy1.png")
enemy2=GameSprite("./images/enemy1.png",2)
enemy2.rect.x=200
enemy_group=pygame.sprite.Group(enemy1,enemy2)
3) 修改游戏循环部分代码
# 让敌机组调用 update 和 draw 方法
enemy_group.update()enemy_group.draw(screen)
# 更新屏幕显示
pygame.display.update()
相关文章
网友评论
本文标题:
飞机大战
本文链接:
https://www.haomeiwen.com/subject/yahyqftx.html
延伸阅读
那年盛夏诗歌
环境监察队工作总结范文
优秀教师学习心得范文
华胥引的读后感300字
《Its red》教学反思范文
农资购销的合同范本
竞选中队委优秀演讲稿
辞金蹈海的成语解释
《世纪宝鼎》公开课教案设计
因为爱你,所以牵挂
今生今世红尘醉——美到
一个90后的内心独白
致已逝去的高中年华
深度阅读
您也可以注册成为美文阅读网的作者,发表您的原创作品、分享您的心情!
情人节
母亲节
重阳节
清明节
端午节
植树节
元宵节
妇女节
愚人节
圣诞节
父亲节
教师节
儿童节
劳动节
青年节
建军节
万圣节
平安夜
光棍节
中秋节
国庆节
感恩节
腊八节
更多话题
栏目导航
摄影
故事
互联网
读书
旅行
热点阅读
命里有时终须有,命里无时莫强求 - 草稿
回顾私塾
《悲华经》观世音菩萨发愿文
家长会
《数字图像处理与分析》学习笔记 1
2018-03-18
拥抱初阳,才是时光
2018-03-18
吹不起从前的清风伴雨
这5个帐户你单独设置了吗?别说没提醒你!
网友评论