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,这样代码看上去简洁点。
作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。