pygame只能编写游戏_游戏框架搭建

游戏框架搭建

目标 —— 使用 面相对象 设计 飞机大战游戏类

目标

  • 明确主程序职责
  • 实现主程序类
  • 准备游戏精灵组

01. 明确主程序职责

  • 回顾 快速入门案例,一个游戏主程序的 职责 可以分为两个部分:
    • 游戏初始化
    • 游戏循环
  • 根据明确的职责,设计 PlaneGame 类如下:

872134b012063bce2f630d9897d96b2b.png
提示 根据 职责 封装私有方法,可以避免某一个方法的代码写得太过冗长
如果某一个方法编写的太长,既不好阅读,也不好维护!
  • 游戏初始化 —— __init__() 会调用以下方法:

方法职责__create_sprites(self)创建所有精灵和精灵组

  • 游戏循环 —— start_game() 会调用以下方法:

方法职责__event_handler(self)事件监听__check_collide(self)碰撞检测 —— 子弹销毁敌机、敌机撞毁英雄__update_sprites(self)精灵组更新和绘制__game_over()游戏结束

02. 实现飞机大战主游戏类

2.1 明确文件职责

872134b012063bce2f630d9897d96b2b.png
  • plane_main
  1. 封装 主游戏类
  2. 创建 游戏对象
  3. 启动游戏
  • plane_sprites
    • 封装游戏中 所有 需要使用的 精灵子类
    • 提供游戏的 相关工具

代码实现

  • 新建 plane_main.py 文件,并且设置为可执行
  • 编写 基础代码
import pygame
from plane_sprites import *
​
​
class PlaneGame(object):"""飞机大战主游戏"""
​def __init__(self):print("游戏初始化")
​def start_game(self):print("开始游戏...")
​
​
if __name__ == '__main__':# 创建游戏对象game = PlaneGame()
​# 开始游戏game.start_game()
​

2.3 游戏初始化部分

  • 完成 __init__() 代码如下:
def __init__(self):print("游戏初始化")# 1. 创建游戏的窗口self.screen = pygame.display.set_mode((480, 700))# 2. 创建游戏的时钟self.clock = pygame.time.Clock()# 3. 调用私有方法,精灵和精灵组的创建self.__create_sprites()
​
def __create_sprites(self):pass

使用 常量 代替固定的数值

  • 常量 —— 不变化的量
  • 变量 —— 可以变化的量

应用场景

  • 在开发时,可能会需要使用 固定的数值,例如 屏幕的高度700
  • 这个时候,建议 不要 直接使用固定数值,而应该使用 常量
  • 在开发时,为了保证代码的可维护性,尽量不要使用 魔法数字

常量的定义

  • 定义 常量 和 定义 变量 的语法完全一样,都是使用 赋值语句
  • 常量命名 应该 所有字母都使用大写单词与单词之间使用下划线连接

常量的好处

  • 阅读代码时,通过 常量名 见名之意,不需要猜测数字的含义
  • 如果需要 调整值,只需要 修改常量定义 就可以实现 统一修改
提示:Python 中并没有真正意义的常量,只是通过命名的约定 —— 所有字母都是大写的就是常量,开发时不要轻易的修改!

代码调整

  • plane_sprites.py 中增加常量定义
import pygame
​
# 游戏屏幕大小
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)
  • 修改 plane_main.py 中的窗口大小
self.screen = pygame.display.set_mode(SCREEN_RECT.size)

2.4 游戏循环部分

  • 完成 start_game() 基础代码如下:
def start_game(self):"""开始游戏"""print("开始游戏...")while True:# 1. 设置刷新帧率self.clock.tick(60)# 2. 事件监听self.__event_handler()# 3. 碰撞检测self.__check_collide()# 4. 更新精灵组self.__update_sprites()# 5. 更新屏幕显示pygame.display.update()
​
def __event_handler(self):"""事件监听"""for event in pygame.event.get():if event.type == pygame.QUIT:PlaneGame.__game_over()
​
def __check_collide(self):"""碰撞检测"""pass
​
def __update_sprites(self):"""更新精灵组"""pass@staticmethod
def __game_over():"""游戏结束"""
​print("游戏结束")pygame.quit()exit()

03. 准备游戏精灵组

3.1 确定精灵组

872134b012063bce2f630d9897d96b2b.png

3.2 代码实现

  • 创建精灵组方法
def __create_sprites(self):"""创建精灵组"""# 背景组self.back_group = pygame.sprite.Group()# 敌机组self.enemy_group = pygame.sprite.Group()# 英雄组self.hero_group = pygame.sprite.Group()
​
  • 更新精灵组方法
def __update_sprites(self):"""更新精灵组"""for group in [self.back_group, self.enemy_group, self.hero_group]:group.update()group.draw(self.screen)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

poj3335 半平面交

题意:给出一多边形。判断多边形是否存在一点,使得多边形边界上的所有点都能看见该点。 sol:在纸上随手画画就可以找出规律:按逆时针顺序连接所有点。然后找出这些line的半平面交。 题中给出的点已经按顺时针排好序了,所…

php进程间通信 yoc_续上篇Swoole多进程数据共享的问题

原因进程作为程序执行过程中资源分配的基本单位,拥有独立的地址空间,同一进程的线程可以共享本进程的全局变量,静态变量等数据和地址空间,但进程之间资源相互独立。由于PHP语言不支持多线程,因此Swoole使用多进程模式,…

解读Google分布式锁服务

背景介绍 在2010年4月,Google的网页索引更新实现了实时更新,在今年的OSDI大会上,Google首次公布了有关这一技术的论文。 在此之前,Google的索引更新,采用的的批处理的方式(map/reduce),也就是当增量数据达到…

必应输入法产品分析

2013年4月,微软MSN(中国)宣布推出首款整合搜索体验的中文云输入法“必应Bing输入法”,其前身是“英库拼音输入法(于2012年8月发布测试版)” 在此,Fruits小组从宏观的软件工程角度和微观的产品实现细节对必应输入法进行了考察和分析。 &#x…

抓localhost包 - rawcap

抓localhost包的话用wireshark好像有点麻烦,所以用rawcap RawCap官网 RawCap下载连接 直接运行,首先根据需要选择监听相应的网卡,然后再填写抓包文件保存的名字

持续集成交付CICD:Jira 发布流水线

目录 一、实验 1.环境 2.GitLab 查看项目 3.Jira 远程触发 Jenkins 实现合并 GitLab 分支 4.K8S master节点操作 5.Jira 发布流水线 一、实验 1.环境 (1)主机 表1 主机 主机架构版本IP备注master1K8S master节点1.20.6192.168.204.180 jenkins…

三个彩灯循环点亮程序_近百组彩灯点亮江畔,义渡灯会正式亮灯啦

10月23日晚上,大渡口区义渡古镇华灯初上。夜幕之下,2020第一届义渡灯会亮灯仪式在此举行,来自四川的近百组彩灯将在这里点亮夜空,一直陪伴广大市民游客至明年元宵节后。当晚6点半,义渡灯会亮灯仪式正式开启。本次灯会以…

QPushButton hover配置

鼠标移动到QPushButton上面时显示下划线 //下面是当鼠标移动到按钮上时,按钮上的文字显示下划线 QPushButton#Button_2:hover{ text-decoration:underline; }//下面是普通显示 QPushButton#Button_2{ color:rgba(52, 144, 255 ,255); border-radius:0px; backgrou…

eclipse没有日志_强化公共DHT以抵抗eclipse攻击,ipfs官方还说了什么?

近日,IPFS官方发布博客,就如何强化公共DHT以抵抗eclipse攻击进行详细介绍,星球君帮大家翻译了一下,让我们来看看官方都说了什么吧:IPFS 2020 年的一个主要焦点是随着网络规模的不断扩大而改进内容路由。虽然我们已经对…

HTTP基础10--web(2)

因输出值转义不完全引发的安全漏洞 实施 Web 应用的安全对策可大致分为以下两部分。 客户端的验证Web 应用端(服务器端)的验证: 输入值验证 / 输出值转义客户端允许篡改数据或关闭 JavaScript,不适合将 JavaScript 验证作为安全的防范对策。保…

单一课和综合课的划分依据_武夷岩茶产地如何划分?

产地是指某种物品的生产、出产或加工制造的地点,日常含义是指某种物品的主要生产地。本文探讨的武夷岩茶种植产地,也就是当地茶人俗称的“山场”。武夷岩茶“山场”的俗称可能缘起于宋代的茶政。宋代官府设置“榷(qu)茶场”&#…

C# 枚举 字符串 转换

普通方法 这种方法尽管很SB但确实可以解决问题 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e){string SelPath "";switch (comboBox1.SelectedIndex){case 0: SelPath System.Environment.GetFolderPath(System.Environment.SpecialFo…

arduino 机器视觉编程_万物皆可仿真的MATLAB/Simulink神奇在哪?解析如何将其应用于一整套机器人设计开发流程...

MATLAB/Simulink:万物皆可仿真 MATLAB是由美国MathWorks公司出品的一款商业数学软件。它是一个多功能的科学计算平台,将算法开发、数据分析、矩阵计算等诸多强大功能集成在一个易于操作的视窗环境中。MATLAB下的Simulink更是被认为可以“仿真任何系统”。…

boost 变量类型转换

如果vs版本比较低,会不支持一些std类型转换函数(vs2008就不支持),比如: std::to_string \\数字转字符串 std::stoll \\字符串转数字而且项目碰巧用boost库,可以考虑用下面的的方法来进行类型转换…

android 系统源码调试 局部变量值_如何方便快速的整编Android 9.0系统源码?

点击上方“刘望舒”,选择“星标”多点在看,就是真爱!作者 : 刘望舒 | 来源 :刘望舒的博客地址:http://liuwangshu.cn/framework/aosp/3-compiling-aosp.html前言在上一篇文章是时候下载Android 9.0系统源码了中&…

让“是男人就下到100层”在Android平台上跑起来

原工程:https://github.com/jeekun/DownFloors 移植后的代码:HelloCpp.zip 移植后的APK:HelloCpp.apk 说明:(cocos2d-x版本是“ 2.2) 1.该工程是直接在HelloCpp上修改完成,所以包名也不修改了 2.原工程里面可能是采用g…

Codeforces Round #277 (Div. 2) 题解

Codeforces Round #277 (Div. 2)A. Calculating Functiontime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputFor a positive integer n lets define a function f: f(n)   - 1  2 - 3  ..  ( - 1)nn Your …

QT 边框圆角处理

平时的边框是平角的: 如果需要圆角的话,就要加stylesheet加上这个: border-radius:3px;比如: QPushButton{ border-radius:3px; }就变成圆角了: px前面的数字越大就越圆,比如5px比3px圆 假如只需要某一…

3级调度 fpga_Vivado HLS学习笔记——1.了解FPGA架构

本篇文章为本人学习Xilinx的Vivado HLS教程记录的学习笔记,仅供学习参考。Vivado HLS官方视频教程:优酷视频​v.youku.com目录: Vivado HLS课程简介FPGA与CPU、GPU、DSP的区别FPGA的优势Xilinx FPGA架构:逻辑单元、算术逻辑单元、存储单元使用…

BZOJ2435 [Noi2011]道路修建

这是NOI11年题,你在逗我? 直接dfs就可以了,Linux下貌似不会爆栈。。。 1 /**************************************************************2 Problem: 24353 User: rausen4 Language: C5 Result: Accepted6 Time:5184 …