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、提供游戏的相关工具

 

代码实现

 

posted @ 2022-06-21 09:33  黑羽青衣  阅读(58)  评论(0编辑  收藏  举报