一款游戏通常包含了不同的子系统。假如战斗场景运行中,需要多个系统合作完成,简单的实现:将多个子系统的代码放在BattleScene之中。这会造成不好的两点:
- BattleScene负责战斗场景的的切换及功能执行,不应该负责系统的初始化。
- 这种设计方式,不容易转接给其他项目使用。
class BattleScene(object):
def __init__(self):
self.game_system = None # 游戏事件系统
self.camp_system = None # 兵营系统
self.level_system = None # 关卡系统
self.charater_system = None # 角色管理系统
self.action_system = None # 行动力系统
self.achievement_system = None # 成就系统
def on_init(self):
self.init_game_sys()
def init_game_sys(self):
self.game_system = GameSystem()
self.camp_system = CampSystem()
self.level_system = LevelSystem()
self.charater_system = CharaterSystem()
self.action_system = ActionSystem()
self.achievement_system = AchievementSystem()
def update_game_sys(self):
self.game_system.update()
self.camp_system.update()
self.level_system.update()
self.charater_system.update()
self.action_system.update()
self.achievement_system.update()
如何解决呢?使用外观模式(Facade)来解决,外观模式为子系统定义统一的接口。举个例子:汽车包含非常多的系统:引擎系统、传动系统、车身骨架系统、电装系统。对于驾驶员而言,并不要了解这些系统的如何协调工作,驾驶员只需要通过高级接口(方向盘、踏板、仪表盘)即可操控汽车。因此外观模式的重点在于:隐藏系统间的互动细节,提供简单的接口。下图是外观系统的示意图。
- client(客户端、用户)
- subSystem(子系统)
- Facade(1、对外的接口,整合子系统的接口和功能 ;2、接受客户端的信息,将信息传给负责的子系统)
下面是实战框架
from Script.State_Patterns.Application.Scene import Scene
class GameSystemMgr:
__instance = None
def __new__(cls, *args, **kwargs):
if cls.__instance is None:
cls.__instance = super().__new__(cls)
return cls.__instance
def __init__(self):
self._game_system = None # 游戏事件系统
self._camp_system = None # 兵营系统
self._level_system = None # 关卡系统
self._charater_system = None # 角色管理系统
self._action_system = None # 行动力系统
self._achievement_system = None # 成就系统
self.cls
def on_init(self):
self.game_system = GameSystem()
self.camp_system = CampSystem()
self.level_system = LevelSystem()
self.charater_system = CharaterSystem()
self.action_system = ActionSystem()
self.achievement_system = AchievementSystem()
def update(self):
self.game_system.update()
self.camp_system.update()
self.level_system.update()
self.charater_system.update()
self.action_system.update()
self.achievement_system.update()
def release(self):
self.game_system.release()
self.camp_system.release()
self.level_system.release()
self.charater_system.release()
self.action_system.release()
self.achievement_system.release()
class BattleScene(Scene):
def __init__(self):
self.game_sys_mgr = GameSystemMgr()
def scenebegin(self):
self.game_sys_mgr.on_init()
def sceneend(self):
self.game_sys_mgr.release()
def update(self):
self.game_sys_mgr.update()
这样,每当游戏多增一个系统的时候,只需要在GameSystemMgr添加即可,并且不需要公布细节。