Python学习笔记(三十)
理解游戏循环和游戏时钟
现在英雄飞机以及被绘制到屏幕上了,怎么能够让飞机移动呢?
游戏中的动画实现原理
跟电影的原理类似,游戏中的动画效果,本质上是快速地在屏幕上绘制图像
电影是将多长静止的电影胶片连接、快速的播放,产生的连贯的视觉效果
一般在电脑上每秒绘制60次(60帧),就能够达到非常连续高品质的动画效果
每次绘制的结果被帧Frame
游戏循环
游戏中的两个部分
游戏循环的开始就意味着游戏的正式开始
游戏初始化
初始化窗口
绘制图像的初始位置
设置游戏时钟
循环
设置刷新帧率
检测用户的交互
更新所有图像的位置
更新屏幕显示
游戏循环的作用
1、保证游戏不会之间退出
2、变化图像的位置 -- 动画效果
每隔1/60秒移动一下 所有图像的位置
通用pygame.display.update()更新屏幕显示
3、检测用户交互--按键、鼠标等
游戏时钟
Pygame专门提供了一个类
pygame.time.clock可以非常方便的设置屏幕绘制速度--刷新频率
要使用时钟对象需要两步
1、在游戏初始化创建一个时钟对象
2、在游戏循环中让时钟对象调用tick(频率)方法
tick方法会根据上次被调用的时间,自动设置游戏循环中的延时
英雄的简单动画实现
1、在游戏初始化中定义一个pygame.Rect的变量记录英雄的初始位置
2、在游戏循环中定义让英雄的y -1 --向上移动
3、y<=0将英雄移动到屏幕的底部
提示:
每一次调用update()方法之前,需要把所有的游戏图像都要重新绘制一遍
而且应该最先重新绘制背景图像,否则会出现重影,需要遮挡
在游戏循环中的监听事件
事件event
就是游戏启动后,用户针对游戏所做的操作
例如:点击关闭按钮,点击鼠标,按下键盘
监听
在游戏循环中,判断用户的具体的操作
只有捕获用户具体的操作,才能有针对性的做出响应
代码实现
pygame中通过pygame.event.get()可以获得用户当前所做动作的事件列表
用户可以同一时间做很多事情
提示:这段代码非常固定,几乎所有的pygame游戏都大同小异
精灵和精灵组
在刚刚完成的案例中,图像加载,位置变化、绘制图像都需要程序编写代码分别处理
为了简化开发步骤,pygame提供了两个类
pygame.sprite.Sprite -- 存储图像数据image和位置rect的对象
pygame.sprite.Group
精灵
image
rect
update
kill()
精灵组
_init_(self, *精灵):
add(*sprites): 向组中增加精灵
sprites(): 返回所有精灵列表
update(*args):让组中所有精灵调用update方法
draw(Surface)将组中所有精灵的image,绘制到surface的rect位置
游戏的初始化
创建精灵
创建精灵组
游戏循环
精灵组。update()
精灵组。draw(screen)
pygame.display.update()
派生精灵子类
1、新建plane_sprites.py
2、定义GameSprite继承自pygame.sprite.Sprite
注意:如果一个类的父亲不是object
在重写初始化方法时,一定要先super()一下父类的init方法
保证父类中实现的init代码能够被正常执行
GamaSpite
image
rect
speed
__init__(self, image_name, speed=1):
update(self)
属性
image 精灵图像,使用image_name加载
rect 精灵大小,默认使用图像大小
speed精灵移动速度,默认为1
方法
update 每次更新屏幕时在游戏循环内调用
让精灵的self.rect.y += self.speed
提示
image的get_rect()方法,可以返回pygame.Rect
使用游戏精灵和精灵组创建敌机
需求使用刚刚派生的游戏精灵和精灵组创建敌机并且实现敌机动画
步骤
1、使用from 导入plane_sprites模块
from导入的模块可以直接使用
import导入的模块需要通过模块名使用
2、在游戏初始化创建精灵对象和精灵组对象
3、在游戏循环中让精灵组分别调用update()和draw(screen)方法
职责
精灵
封装图像image,位置和速度speed
提供update()方法,根据游戏需求,更新位置rect
精灵组
包含多个精灵对象
update()方法,让精灵组中的所有精灵调用update方法更新位置
draw(screen)方法,在screen上绘制精灵组中的所有精灵
游戏框架搭建
目标--使用面向对象设计飞机大战游戏类
目标
明确主程序职责
实现主程序类
准备游戏精灵组
明确主程序职责
回顾快速入门案例,一个游戏主程序的职责可以分为两个部分
游戏初始化
游戏循环
根据明确的职责,设计PlaneGame类如下
planeGame
screen
clock
精灵组或精灵
_init_
_create_sprites(self)
start_game
_event_handler
__check_collide(self)
__update_sprites(self)
__game_over()
游戏初始化
设置游戏窗口
创建游戏时钟
创建精灵、精灵组
游戏循环
设置刷新频率
事件监听
碰撞检测
更新/绘制精灵组
更新屏幕显示
提示根据职责封装私有方法,可以避免某一个方法的代码写得太过冗长。
实现飞机大战主游戏类
明确文件职责
plane_main
1、封装主游戏类
2、创建游戏对象
3、启动游戏
plane_sprites
1、封装游戏中所有需要的精灵子类
2、提供游戏的相关工具
代码实现