第十一章 地图动作与地图事件(Map Action and Map Event)
我们已经有了剧本,而且可以运行剧本,但我们还缺少对地图的操作控制。
我们这一章来完成地图上的操作,地图的操作将全部由MapAction
控制。
十二 完善地图信息与测试(Perfect MapEventInfo and Testing)
我们来测试我们的成果。
1 完善地图信息(Perfect MapEventInfo)
首先,我们先来完善一下地图信息。
我们之前将所有的地图事件都放在了一起,在这里,我们将地图开始和地图结束的事件分开。
1.1 地图开始事件(Map Start Event)
这个事件是在读取地图时触发的。且它没有条件,是直接触发,且只触发一次。
我们在CanTrigger
中,让它直接返回true
,这样就直接屏蔽了条件。
我们单独建立一个类:
using System;
namespace DR.Book.SRPG_Dev.ScriptManagement
{
[Serializable]
public class MapEventNoCondition : MapEvent
{
public override bool CanTrigger(MapAction action)
{
if (!onlyonce)
{
onlyonce = true;
}
return true;
}
}
}
1.2 地图结束事件(Map End Event)
这个事件是在地图结束时触发的。无论它触发什么事件,在结尾都应该触发WinResult
或者是LoseResult
,同样它们只能触发一次。
所以这个事件,我们添加它们:
using System;
using System.Collections;
using System.Xml.Serialization;
namespace DR.Book.SRPG_Dev.ScriptManagement
{
[Serializable]
public class MapEventWinLose : MapEvent
{
[XmlElement("WinResult", typeof(WinResult))]
[XmlElement("LoseResult", typeof(LoseResult))]
public Result resultTrigger;
public override bool CanTrigger(MapAction action)
{
if (!onlyonce)
{
onlyonce = true;
}
return base.CanTrigger(action);
}
public override IEnumerator Trigger(MapAction action, Action<MapEvent> onTriggered = null, Action<string> onError = null)
{
// 触发过了
if (isTriggered)
{
yield break;
}
// 是否满足所有触发条件
if (!CanTrigger(action))
{
yield break;
}
// 触发事件
if (triggers != null && triggers.Count != 0)
{
int i = 0;
while (i < triggers.Count)
{
Result trigger = triggers[i++];
if (trigger == null)
{
continue;
}
if (!trigger.Trigger(action))
{
if (onError != null)
{
onError(string.Format("MapEvent {0} -> Event Trigger error.", id));
}