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

  • 相关阅读:
    npm版本管理
    spring框架学习笔记5:SpringAOP示例
    spring框架学习笔记4:SpringAOP实现原理
    spring框架学习笔记3:使用注解代替配置文件
    spring框架学习笔记2:配置详解
    spring框架学习笔记1:搭建测试
    struts2框架学习笔记7:struts2标签
    struts2框架学习笔记6:拦截器
    struts2框架学习笔记5:OGNL表达式
    struts2框架学习笔记4:获取参数
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/pygame-kidscancode-part1-code-structure.html
Copyright © 2020-2023  润新知