pygame-KidsCanCode系列jumpy-part1-如何组织复杂游戏的代码
武侠小说中,高手过招讲究起手式,所谓"行家一伸手,便知有没有"。程序开发、软件架构中,也是类似的道理,当业务逻辑越来越复杂,代码越来越多时,一个好的项目结构,从目录命名、模块分层这些,从一开始就决定了后面的代码是否易于维护。
所以这节主要讨论下,游戏中如何组织自己的代码,回忆上节学到的最小开发框架(即:模板),一个游戏大致可以分为以下几个标准处理过程:
__init__() 初始化
new() 游戏初次进入(或主角挂了,重新开始时)
update() 游戏逻辑更新
events() 事件处理(响应键盘、鼠标等事件)
draw() 屏幕渲染绘制
show_start_screen() 游戏的启动画面(通常也用来展示广告)
show_go_screen() 游戏结束时的画面
run() 游戏运行的循环入口
按上面的讨论,把上节的模板改造一下,变成下面这样:
import pygame as pg
from part_01.settings import * class Game:
def __init__(self):
pg.init()
pg.mixer.init()
self.screen = pg.display.set_mode(SIZE)
pg.display.set_caption(TITLE)
self.clock = pg.time.Clock()
self.running = True
self.playing = False
self.all_sprites = [] # 开始新游戏时的处理(eg: 主角挂了,重新开始;或第1次进入)
def new(self):
self.all_sprites = pg.sprite.Group()
self.run() # 游戏运行的循环入口
def run(self):
# 注:有2个控制变量,running是控制pygame是否退出,而playing是游戏情节是否继续处理
# (即:有可能游戏情况结束,比如:主角挂了,显示game over,但是pygame并不需要退出)
self.playing = True
while self.playing:
self.clock.tick(FPS)
self.events()
self.update()
self.draw() # 游戏逻辑更新处理
def update(self):
pass # 事件处理
def events(self):
for event in pg.event.get():
if event.type == pg.QUIT:
if self.playing:
self.playing = False
self.running = False # 屏幕渲染
def draw(self):
self.screen.fill(BLACK)
self.all_sprites.draw(self.screen)
pg.display.update() # 游戏开始的splash图片
def show_start_screen(self):
pass # game over时的显示
def show_go_screen(self):
pass g = Game()
# 显示开始场景
g.show_start_screen()
while g.running:
# 开始
g.new()
# 主角挂了之后的显示
g.show_go_screen() pg.quit()
注1:引入了一个列表(或叫容器)all_sprites,用于存放所有sprite
注2: 一些常量,仍然放在settings.py中
# game options SIZE = WIDTH, HEIGHT = 360, 480
FPS = 30 TITLE = "My Game" # define color
BLACK = 0, 0, 0
WHITE = 255, 255, 255
RED = 255, 0, 0
GREEN = 0, 255, 0
BLUE = 0, 0, 255
注3:有二个控制循环的bool型变量,running与playing,二者的区别在于running用于控制pygame是否退出,而playing用于控制游戏情节是否继续。
注4:为了简化代码,import pygame时,指定了一个别名pg,这样代码看上去简洁点。
pygame-KidsCanCode系列jumpy-part1-如何组织复杂游戏的代码的更多相关文章
- webpack4 系列教程(三): 多页面解决方案--提取公共代码
这节课讲解webpack4打包多页面应用过程中的提取公共代码部分.相比于webpack3,4.0版本用optimization.splitChunks配置替换了3.0版本的CommonsChunkPl ...
- 《Visual C++ 2010入门教程》系列五:合理组织项目、使用外部工具让工作更有效
原文:http://www.cnblogs.com/Mrt-02/archive/2011/07/24/2115631.html 这一章跟大家分享一些与c++项目管理.VAX.SVN.VS快捷键等方面 ...
- 【Flask-RESTPlus系列】Part1:快速入门
0x00 内容概览 Flask-RESTPlus安装 快速入门 初始化 一个最简单的API示例 资源路由 端点 参数解析 数据格式化 顺序保留 完整例子 0x01 Flask-RESTPlus安装 1 ...
- 玩转UITableView系列(一)--- 解耦封装、简化代码、适者生存!
UITableView这个iOS开发中永远绕不开的UIView,那么就不可避免的要在多个页面多种场景下反复摩擦UITableView,就算是刚跳进火坑不久的iOS Developer也知道实现UITa ...
- ae(ArcEngine) java swing开发入门系列(1):开发环境和代码部署
前言:做ae开发大部分人都是用C#版,很少用到java版,本系列文章主要介绍java版ae开发的入门,对于ae接口的高级应用,可以看C#版相关文章 开发环境软件: Intellij IDEA 2018 ...
- 夯实Java基础系列7:一文读懂Java 代码块和执行顺序
目录 Java中的构造方法 构造方法简介 构造方法实例 例 1 例 2 Java中的几种构造方法详解 普通构造方法 默认构造方法 重载构造方法 java子类构造方法调用父类构造方法 Java中的代码块 ...
- Python3+pygame实现的flappy bird游戏,代码完整,还有音乐
之前一直在手机上玩flappy bird游戏,闲暇时间就编写了一个 是采用python3+pygame模块制作而成的,运行效果非常流畅,会让你大吃一惊哦哈哈 一.运行效果展示 下载游戏之后,注意在自己 ...
- 11.pygame飞机大战游戏整体代码
主程序 # -*- coding: utf-8 -*- # @Time: 2022/5/20 22:26 # @Author: LiQi # @Describe: 主程序 import pygame ...
- 【java学习系列】 Android第一本书《第一行代码》
开始Java的学习,从Android,开始吧.<第一代码>开始阅读和调试demo例子. 下面是 <第一行代码>的思维导图:
随机推荐
- 移动端根据不同DPR加载大小不同的图片
1.首先创建mixin.styl文件代码如下: bg-image($url) // 创建bg-image($url)函数 background-image: url($url + "@2x. ...
- 【CF446D】DZY Loves Games
题解: 不错的题目 首先要求的黑点个数非常多 比较容易想到矩阵乘法 于是我们可以求出从某个黑点出发到任意一个黑点之间的概率 发现不同出发点带来的变化只有常数项 于是我们可以预处理出从每个方程转移的系数 ...
- 【CF666E】Forensic Examination
题解: 熟练掌握了后缀自动机后大部分题目应该都比较容易想 首先对t建立广义后缀自动机 然后我们可以用线段树合并处理出每个点每个串出现的次数,然后求出最大值 匹配的时候比较巧妙 我们离线处理 对于同一个 ...
- OSPF协议之详细图解
OSPF是一种基于SPF算法的链路状态路由协议. 上图是在一个OSPF区域里面添入一台新的路由器的时候,OSPF协议的工作过程,如果你能非常详细的叙述出这张图的话,基本上OSPF协议的工作过程你就掌握 ...
- js获取单选框的值
js获取单选框的值 var lx= $("input[name='lx']:checked").val();
- day64 django django零碎知识点整理
本文转载自紫金葫芦,哪吒,liwenzhou.cnblog博客地址 简单了解mvc框架和MTV框架, mvc是一种简单的软件架构模式: m----model,模型 v---view,视图 c---co ...
- Spark-Unit2-Spark交互式命令行与SparkWordCount
一.Spark交互式命令行 启动脚本:spark-shell 先启动spark:./start-all.sh 本地模式启动命令:/bin/spark-shell 集群模式启动命令:/bin/spark ...
- P2280 [HNOI2003]激光炸弹(二维前缀和)
题目描述 一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标.现在地图上有n(n≤10000)个目标,用整数xi,yi(0≤xi,yi≤5000)表示目标在地图上的位置,每个目标都有一个价 ...
- Codeforces 514C Watto and Mechanism 【Trie树】+【DFS】
<题目链接> 题目大意:输入n个单词构成单词库,然后进行m次查询,每次查询输入一个单词(注意这些单词只由a,b,c构成),问该单词库中是否存在与当前查询的单词有且仅有一个字符不同的单词. ...
- springboot2.0 redis EnableCaching的配置和使用
一.前言 关于EnableCaching最简单使用,个人感觉只需提供一个CacheManager的一个实例就好了.springboot为我们提供了cache相关的自动配置.引入cache模块,如下. ...