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例子. 下面是 <第一行代码>的思维导图:
随机推荐
- js条件语句初步练习
var a=18 if(a<10){ alert("便宜") } else{ ...
- python2 python3 转换,兼容
0. 1.参考 https://docs.python.org/3/library/urllib.html urllib is a package that collects several modu ...
- 修改element ui 默认样式最好的解释
KedAyAyA 17年10月 https://forum.vuejs.org/t/elementui/19171/5 首先添加了scoped的style标签会在vue-loader里进行处理 所谓的 ...
- [转]android sqlite db-journal文件产生原因及说明 .
http://blog.csdn.net/kaiwii/article/details/8609093 今天在android中将sqlite的数据库文件生成在SD卡上的过程中,发现生成的.db文件的旁 ...
- 在vue-cli项目中使用bootstrap的方法示例
在一个html页面中加入bootstrap是很方便,就是一般的将css和js文件通过Link和Script标签就行. 那么在一个用vue-cli生成的前端项目中如何加入?因为框架不一样了,略微要适应一 ...
- Web服务API
Web服务API 内容 [ 隐藏 ] 1 概述 2个 services.php 3 详细教程 4 例子 5 另见 概观 Web服务API允许您将插件的功能(通常是外部函数)公开为Web服务. ...
- PHP.ini 文件大小限制
post_max_size=80000000000M upload_max_filesize=2000000000M
- C# Upload
using System; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Web; ...
- XamarinSQLite教程添加索引
XamarinSQLite教程添加索引 索引可以提升数据库表的查询速度.下面为已存在的表添加索引,操作步骤如下: (1)右击Students,选择Add index…(beta)命令,弹出Add In ...
- Codeforces.1110F.Nearest Leaf(线段树)
题目链接 \(dls\)讲过这道题,所以这不是线段树裸题吗,这场没打气气气气气=-= 现在是写着玩=v= \(Description\) 给定一棵\(n\)个点的树.\(q\)次询问,每次询问给定\( ...