与上次一的作业相比,动作分离版就是通过把原来由对象自己实现的动作交给一个专门的处理器来处理。
那么在角色和船的类中需要增加一个返回自身的函数,以及在移动的时候不直接移动,而是返回一个移动的向量,如下。
public GameObject getGameObject() { return boat; }
public Vector3 BoatMoveToPosition()
{
boat_sign = -boat_sign;
if (boat_sign == -1)
{
return new Vector3(-1.4F, -4, -3);
}
else
{
return new Vector3(38, -4, -3);
}
}
在动作管理中器中,首先定义动作的完成返回函数,用于告知动作完成。
接着就是一个动作管理类,在该类中,建立一个函数用来接受游戏对象和所要执行的动作,然后将该动作加入动作类表中,而当一个动作完成后就执行下一个动作。
同时由于动作是连贯的,就需要一个动作组合器来将小的动作组合起来,完成后返回,处理下一个动作组。
在魔鬼与牧师中,动作由角色移动到船上,船移动,角色从船移动到岸上这三个动作。
主要的代码框架就是参考老师所给的优秀博客。
最后的裁判类则是将原来在控制端的check()函数独立出来,改为一个可以接受开始和结束陆地以及船的类,通过和check()函数一样的逻辑,返回游戏结果。
public class judge
{
public int result;
public judge()
{
result = 0;
}
public void game_result(LandModel start_land, LandModel end_land, BoatModel boat)
{
int start_priest = (start_land.GetRoleNum())[0];
int start_devil = (start_land.GetRoleNum())[1];
int end_priest = (end_land.GetRoleNum())[0];
int end_devil = (end_land.GetRoleNum())[1];
if (end_priest + end_devil == 6)//获胜
{
result = 2;
}
else
{
int[] boat_role_num = boat.GetRoleNumber();
if (boat.GetBoatSign() == 1)
{
start_priest += boat_role_num[0];
start_devil += boat_role_num[1];
}
else
{
end_priest += boat_role_num[0];
end_devil += boat_role_num[1];
}
if (start_priest > 0 && start_priest < start_devil)
{
result = 1;
}
else if (end_priest > 0 && end_priest < end_devil)
{
result = 1;
}
else
result = 0;
}
}