为iFVN增添深度:第三部分 - 制作自定义事件

0 点赞
iFVN - AVG文字游戏制作工具
转载

这是令人兴奋的部分!在这里,我们将了解如何根据指定的条件安排自定义事件。我们可以使用常规的Javascript来计算任何具有全局作用域的表达式。我们将创建一个事件生成函数,声明一个全局数组来存储事件,最后创建一个管理器函数来计算表达式、执行事件代码并移除已过期的事件。(当事件执行了指定次数后,该事件即视为过期。) 同步 对于涉及可见游戏元素或用户交互的事件,在iFVN中至少需要2个变量。这样我们就可以动态测试事件是否已激活,并根据需要停止或启动它。 代码: function CustomEvent(name, exprs, targetfn, max_occ=1) { this.name = name; this.exprs = exprs; // 一个或多个布尔表达式 this.target = targetfn; // 当表达式为真时执行的函数 this.count = max_occ; // 此事件在自动删除前可发生的次数 } var GlobalEvents = []; function GEventProc() // 事件管理器函数 { if (GlobalEvents.length <= 0) return; log(`发现${GlobalEvents.length}个事件...`); var e = 0; var xpr_str = 0; for (var evt = GlobalEvents.length-1; evt >= 0; evt--) { if(expr_test(GlobalEvents[evt]) == true) { // 所有条件都满足? var this_evt = GlobalEvents[evt]; eval(this_evt.target); // 执行脚本 if (this_evt.count >= 1) this_evt.count--; // 减少计数器 if (this_evt.count == 0) { e = GlobalEvents.splice(evt, 1)[0]; log(`因引用数为零,已删除${e.name}。`); } } } } function Rain() { RV.GameData.value[WEATHER_CHANGED]=true; RV.GameData.value[WEATHER]=1; } function ClearWeather() { RV.GameData.value[WEATHER_CHANGED]=false; RV.GameData.value[WEATHER]=0; } 现在我们需要修改我们的计时通用触发器,以检查天气变化:

并在初始化中添加以下代码行: var expr_time_test1 = "(seconds>1);(scene==44)"; var expr_time_test2 = "(seconds>11);(scene==44)"; GlobalEvents.push(new CustomEvent("rain start", expr_time_test1, "Rain()", 1)); GlobalEvents.push(new CustomEvent("rain stop", expr_time_test2, "ClearWeather()", 1));