牧师与魔鬼——动作分离版
在上周的作业中,牧师与魔鬼游戏中的各个事件,都是写在Director中,并且都是继承Monobehavior的。在这周动作分离的设计中,我将上船、下船以及船的移动都分离出来。参照老师给的设计模式,画出简略的UML图如下:
面向对象设计UML图
动作序列
在这里的设计中,参照之前师兄的设计模式,可以将动作序列分成如下几个:
文件名 | 功能 |
---|---|
CCActionManager | 具体动作作为类中的一个对象从而管理动作,同时继承SSActionManager |
CCBoatMoving | 船移动的具体方法,继承SSAction,将GenGameObject作为其中一个对象 |
CCGetOffBoat | 牧师或魔鬼对象下船的具体方法,继承SSAction,其中的对象有int型判断河岸,与GameObject型对象接收具体作用的游戏对象 |
CCGetOnTheBoat | 牧师或魔鬼对象上船的具体方法,继承SSAction,其中的对象有GameObject型接收具体作用的游戏对象 |
CCActionManager
CCActionManager是对具体游戏事件的控制,其中包含三个方法:Start(),Update(),和SSActionEvent()。Start()方法中用于将SSDirector实例化,Update()方法中用于实现具体的游戏事件,SSActionEvent()方法则是接口ISSActionCallback中的。
具体代码如下:
public class CCActionManager : SSActionManager, ISSActionCallback
{
public GenGameObject sceneController;
public CCGetOnTheBoat getonA;
public CCGetOffBoat getoffB;
public CCBoatMoving boatmovingC;
// Use this for initialization
protected void Start()
{
sceneController = (GenGameObject)SSDirector.getInstance().currentScenceController;
sceneController.actionManager = this;
}
// Update is called once per frame
protected new void Update()
{
if (Input.GetMouseButtonDown(0) && sceneController.game == 0)
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
if (hit.transform.tag == "Devil" || hit.transform.tag == "Priest")
{
if (hit.collider.gameObject == sceneController.boat[0] || hit.collider.gameObject == sceneController.boat[1])
{
if (hit.collider.gameObject == sceneController.boat[0])
{
getoffB = CCGetOffBoat.GetSSAction(0);
this.RunAction(hit.collider.gameObject, getoffB, this);
}
else
{
getoffB = CCGetOffBoat.GetSSAction(1);
this.RunAction(hit.collider.gameObject, getoffB, this);
}
}
else
{
getonA = CCGetOnTheBoat.GetSSAction();
this.RunAction(hit.collider.gameObject, getonA, this);
}
}
else if (hit.transform.tag == "Boat" && sceneController.boatCapacity != 2)
{
print(hit.transform.tag);
boatmovingC = CCBoatMoving.GetSSAction();
this.RunAction(hit.collider.gameObject, boatmovingC, this);
}
}
}
base.Update();
}
public void S