第十一章 地图动作与地图事件(Map Action and Map Event)
我们已经有了剧本,而且可以运行剧本,但我们还缺少对地图的操作控制。
我们这一章来完成地图上的操作,地图的操作将全部由MapAction
控制。
文章目录
十 NPC操作(NPC Control)
自动化操作NPC是SRPG游戏必须有的。
我们使用的是MapAction
中Update
方法来执行这些。
1 准备工作(Preparation)
我们需要对NPC逐个操作,这就需要一个变量来告知MapAction
,我们进行到了哪里。
添加字段:
private int m_NpcIndex = 0;
而在切换阵营时,我们需要将下标重置:
/// <summary>
/// 转换回合
/// </summary>
protected void NextTurn()
{
// 重置npc下标
npcIndex = 0;
// 省略其它代码
}
而在Update
中,就如同我们的输入一样,必须满足以下条件:
-
阵营不能是玩家;
-
地图不能播放动画;
-
地图不能执行事件。
所以,我们的基本方法:
/// <summary>
/// 每帧刷新
/// </summary>
/// <returns></returns>
public override bool Update()
{
// 省略MapScenarioAction操作
if (turn != AttitudeTowards.Player)
{
if (mapStatus == MapStatus.Animation
|| mapStatus == MapStatus.Event
|| mapStatus == MapStatus.Menu || mapStatus == MapStatus.SubMenu)
{
return true;
}
// TODO 具体NPC操作
return true;
}
return false;
}
我们对每个NPC进行的操作无外乎“移动”与“其它行动”;而“其它行动”又包含“攻击”、“对话”等等。这取决于我们的AI。我们目前并没有对AI进行编写,所以暂只考虑“移动”与“攻击”
首先,我们先建立两个空的方法:
/// <summary>
/// NPC移动,
/// </summary>
/// <param name="npc"></param>
/// <returns></returns>
public void NpcMove(MapClass npc)
{
// TODO
}
/// <summary>
/// NPC攻击
/// </summary>
/// <param name="npc"></param>
public void NpcAttack(MapClass npc)
{
// TODO
}
2 每帧动作(Update)
要让NPC进行行动,必须先有NPC,所以我们要先获取它。
同时,如果阵营所有NPC行动结束,则要下一个阵营。
在Update
方法中,获取NPC:
// 获取npc
List<MapClass> units;
if (!m_UnitDict.TryGetValue(turn, out units) || npcIndex >= units.Count)
{
NextTurn();
return true;
}
MapClass unit = units[npcIndex];
其次,我们让光标追随NPC(这在以后运动摄像机时,让摄像机跟随光标即可)。
// 光标跟随
if (map.mouseCursor.cellPosition != unit.cellPosition)
{
MoveCursorCommand(unit.cellPosition, 0.5f);
return true;
}
最后,是我们NPC的行动,初步行动是移动,规定使用MapStatus.AttackCursor
来表示是否攻击。
注意:在玩家时,MapStatus.AttackCursor
表示是否显示攻击范围;而在NPC时,表示移动后是否对目标进行攻击。你也可以不使用它,而单独建立一个变量表示NPC的行动。
即NPC行动:
// npc移动
if (mapStatus != MapStatus.AttackCursor)