智能巡逻兵
- 提交要求:
- 游戏设计要求:
- 创建一个地图和若干巡逻兵(使用动画);
- 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算;
- 巡逻兵碰撞到障碍物,则会自动选下一个点为目标;
- 巡逻兵在设定范围内感知到玩家,会自动追击玩家;
- 失去玩家目标后,继续巡逻;
- 计分:玩家每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束;
- 程序设计要求:
- 必须使用订阅与发布模式传消息
- subject:OnLostGoal
- Publisher: ?
- Subscriber: ?
- 工厂模式生产巡逻兵
- 必须使用订阅与发布模式传消息
本次作业要求是做一个智能巡逻兵的作业,下载的资源动画用上之后,游戏是参照一个师兄的做出来的,当然我做的是bug无穷的小游戏.......,主要还是在写的基础上添加了一些趣味性吧。
本次作业还要求用一种新学习的设计模式,订阅与发布模式,该模式也称为观察者模式,发布者和订阅者没有直接的耦合,是实现模型与视图分离的重要手段。
本次作业中的地图是自己参照着用正方体弄出来的,所以感觉可能是这个原因导致很多的bug
可以展示一下自己弄的小模型:
虽然说比较丑吧,但是毕竟还是自己做的
本次作业的UML图设计如下:
以下是一些主要代码,主要分为几个部分:
1.订阅与发布模式的部分,发布游戏结束和游戏得分的事件
GameEventManager的代码:
public class GameEventManager : MonoBehaviour
{
public delegate void GameScoreAction();
public static event GameScoreAction myGameScoreAction;
public delegate void GameOverAction();
public static event GameOverAction myGameOverAction;
private SceneController scene;
private bool isGameOver;
void Start()
{
scene = SceneController.getInstance();
scene.gameEventManager = this;
isGameOver = false;
}
//hero逃离巡逻兵,得分
public void getScore()
{
if (myGameScoreAction != null && !isGameOver)
{
myGameScoreAction();
}
}
//当巡逻兵捕捉到英雄,游戏结束
public void gameOver()
{
if (myGameOverAction != null)
{
isGameOver = true;
myGameOverAction();
}
}
public bool getGameState()
{
return isGameOver;
}
}
GameText的代码,程序就像搭积木一样,用的时候加上去,不用的时候就撤去,就像GameText中代码一样,需要加分的时候i就执行加分的事件,否则就执行游戏结束的事件:
public enum TextType { SCORE, GAMEOVER };
public class GameText : MonoBehaviour
{
private IGameState states;
private int score = 0;
private TextType textType = TextType.SCORE;
void Start()
{
states = SceneController.getInstance() as IGameState;
checkTheTypeOfText();
}
private void checkTheTypeOfText()
{
if (gameObject.name.Contains("Score"))
{
textType = TextType.SCORE;
}
else
{
textType = TextType.GAMEOVER;
}
}
void OnEnable()
{
GameEventManager.myGameScoreAction += gameScore;
GameEventManager.myGameOverAction += gameOver;
}
void OnDisable()
{
GameEventManager.myGameScoreAction -= gameScore;
GameEventManager.myGameOverAction -= gameOver;
}
//得分事件
void gameScore()
{
if (textType == TextType.SCORE)
{
int index = states.getIndexOfHero();
switch(index)
{
case 0:
score += 1;
break;
case 1:
score += 2;
break;
case 2:
score += 3;
break;
case 3:
score += 4;
break;
case 4:
score += 5;
break;
case 5:
score += 6;
break;
}
//score++;
this.gameObject.GetC