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,这样代码看上去简洁点。

 

posted @ 2019-01-20 20:18 菩提树下的杨过 阅读(...) 评论(...) 编辑 收藏