一、总体目录
- 明确主程序的指责
- 实现飞机大战主程序类
- 准备游戏精灵组
二、明确主程序的指责
- 2.1、一个主程序的 职责 可以分为两个部分:初始化 和 游戏循环
- 2.2、根据明确的指责,设计
PlanGame
类如下:
PlanGame提示:根据 职责 封装私有方法,可以避免某一个方法的代码写得太过冗长,如果某一个方法编写的太长,既不好看,也不容易维护!
- 2.3、游戏初始化
__init__()
会调用以下方法方法 职责 __event_handler(self)
事件监听 __check_collide(self)
碰撞检测---子弹销毁敌机、敌机撞毁英雄 __update_sprites(self)
精灵组更新和绘制 __game_over(self)
游戏结束
三、实现飞机大战主程序类
-
3.1、明确文件职责
明确文件职责-
plane_main
:封装 主游戏类;创建 游戏对象;启动游戏 -
plane_sprites
: 封装游戏中 所有 需要使用的 精灵子类;提供游戏的 相关工具 -
创建
plane_main.py
模块import pygame from plan_sprites import * class PlanGame(object): """飞机大战主游戏""" def __init__(self): print("游戏初始化") def start_game(self): print("开始游戏") # 在主模块里面编写测试代码 if __name__ == '__main__': # 1、创建游戏对象 game = PlanGame() # 2、启动游戏 game.start_game()
-
-
3.2、plane_main.py 模块 初始化内容的完善(SCREEN_RECT是屏幕 Rect的常量:常量相约是所有字母大写,字母之间用
_
下划线)def __init__(self): print("游戏初始化") # 1、设置游戏窗口 self.screen = pygame.display.set_mode(SCREEN_RECT.size) # 2、创建游戏时钟 self.lock = pygame.time.Clock() # 3、创建精灵和精灵组(私有方法) self. __create_plan_sprites() def __create_plan_sprites(self): print("创建游戏精灵")
-
3.3、plane_main.py 模块 开始游戏的代码完善
def start_game(self): while True: print("开始游戏") # 1、设置刷新帧率 self.lock.tick(FRAME_PER_SEC) # 2、事件监听 self.__event_handler() # 3、碰撞检测 self.__check_collide() # 4、更新/绘制精灵组 self.__update_sprites() # 5、更新显示 pygame.display.update() def __event_handler(self): print("处理用户的操作事件") for event in pygame.event.get(): if event.type == pygame.QUIT: # 游戏关闭(结束) self.__game_over() def __check_collide(self): print("碰撞检测") def __update_sprites(self): print("更新/绘制精灵组") @staticmethod def __game_over(): print("游戏结束") # 退出游戏,卸载加载的所有模块, pygame.quit() # 直接退出系统(终止当前正在执行的程序) exit()
-
3.4、上面的代码用到了常量,比如上面的屏幕的
Rect: SCREEN_RECT
和时钟刷新帧率FRAME_PER_SEC
,下面就介绍一下常量常量:不变化的量(没有真正意义的常量)
变量:不可以变化的量- 应用场景:
- 在开发时候,可能会需要使用 固定的数值,例如:屏幕的高度 是 700
- 这个时候,建议 不要 直接使用固定数值,而是应该使用 常量
- 在开发时,为了保证代码的可维护性,尽量不要使用 魔法数字
- 常量的定义
- 定义 常量 和定义 变量 的语法完全一样,都是使用 赋值语句
- 常量 的 命名 应该 所有字母都使用大写,单词与单词之间使用下划线连接起来
- 常量的好处
- 阅读代码时,通过 常量名 见名之意,不需要猜测数字的含义
- 如果需要 调整值,只需要 修改常量定义 就可以实现 统一修改
- 应用场景:
三、准备游戏精灵组
-
3.1、先在
__init__
方法里面完善def __init__(self): # 新增精灵组属性 self.enemy_group = None # 3、创建精灵和精灵组(私有方法),传精灵的个数 self.__create_plan_sprites(4)
-
3.2、
def __create_plan_sprites(self, enemy_num)
方法里面完善, enemy_num精灵的个数def __create_plan_sprites(self,enemy_num): enemy_list = [] num = 0 while num < enemy_num: # 创建敌机的精灵对象 enemy = GameSprites("./images/enemy1.png") enemy_list.append(enemy) num += 1 enemy_tuple = tuple(enemy_list) # 创建敌机的精灵组 self.enemy_group = pygame.sprite.Group(*enemy_tuple) print("enemy_list的数量 %d",len(enemy_list))
-
3.3、 更新/绘制精灵组
self.__update_sprites()
def __update_sprites(self): print("更新/绘制精灵组") # 让精灵组调用两个方法 # update - 让组中的所有精灵更新位置 self.enemy_group.update() # draw - 在screen上绘制所有的精灵 self.enemy_group.draw(self.screen)
网友评论