该教程尽量用较直白且详细的语气去说明如何制作一个日期检测的方法,可以将当前现实时间的的时间保存为变量,如何运用到游戏里

  就假设我们需要制作一个生日祝福的功能,玩家可以设置自己的生日,当现实时间与玩家在游戏内设置的日期相同时则触发生日剧情。需要做出这一步功能,我们需要三个步骤:

    1.获取现实时间
    2.让玩家设置生日
    3.校对两者

一、获取现实时间

  TyranoScript的普通语法是不支持这一点的,所以我们需要用到**函数(Function)**。

  我们都知道,TyranoScript本身是基于JavaScript所开发的游戏引擎,但他有着自己的一套语法,那我们能不能在TyranoScript里使用JavaScript本身的代码和语法吗?答案是可以的,也就是上面所说的函数。

  TyranoScript的函数与Python之类编程语言不同,TyranoScript的函数只有一个功能,就是在TyranoScript中使用JavaScript的语法与代码,很多TyranoScript本身做不到的功能,都可以通过JavaScript来实现,那么下面就让我们来看这段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[iscript]
var now = new Date(); // 创建Date对象并赋值给now变量
var year = now.getFullYear(); // 获取当前年份并存储到year变量里
var month = now.getMonth() + 1; // 获取当前月份并存储到month变量里
var day = now.getDate(); // 获取当前日期并存储到day变量里
var hours = now.getHours(); // 获取当前小时并存储到hours变量里
var minutes = now.getMinutes(); // 获取当前分数并存储到minutes变量里
var seconds = now.getSeconds(); //获取当前秒数并存储到seconds

//===============================================

TYRANO.kag.ftag.startTag("eval", { exp: "sf.year=" + year }); //将year变量的内容赋给sf.year变量
TYRANO.kag.ftag.startTag("eval", { exp: "sf.month=" + month }); //将month变量的内容赋给sf.month变量
TYRANO.kag.ftag.startTag("eval", { exp: "sf.day=" + day }); //将day变量的内容赋给sf.day变量
TYRANO.kag.ftag.startTag("eval", { exp: "sf.hours=" + hours }); //将hours变量的内容赋给sf.hours变量
TYRANO.kag.ftag.startTag("eval", { exp: "sf.minutes=" + minutes }); //将minutes变量的内容赋给sf.minutes变量
TYRANO.kag.ftag.startTag("eval", { exp: "sf.seconds=" + seconds }); //将seconds变量的内容赋给sf.seconds变量
[endscript]

  如代码块所示,这块代码就是最主要的内容,还是蛮简单了,上半部分的代码负责获取当前各个时间,包括年份,月份,日期以及时分秒,然后存储到对应的变量里,但要注意,目前的变量是JavaScript的变量,并不是TyranoScript变量,所以我们还专门写了下半部分的代码,可以将JavaScript代码的值赋给TyranoScript的变量。

  例如,当前时间是2025年11月28日19时02分20秒,那么经过这些代码以后,这些变量的值就会是:

  sf.year=2025,sf.month=11,sf.day=28,sf.hours=19,sf.minutes=02,sf.seconds=20

  而sf这种变量类型已经在以前的教程中讲过了,这里不再赘述,当然如果你想把变量改成别的名字和类型,比如f.awa之类的,也是没问题,只要作用正确并且你能够记住这个变量干什么用的,随便叫什么都可以。

  只需要把上述代码写到first.ks,亦或是title.ks/title_screen.ks这种游戏启动必定会加载的文件里,那么每次启动游戏都可以获取到当前游戏启动的时间。

二、让玩家设置生日

  第二步就是让玩家设置生日,这一步的方法很多,最方便的是写几个输入框用于获取玩家生日。

  这一步只需要用到edit标签即可

1
[edit name="*sf.api*" length=100 width=450 left=170 top=165]

  这里的name参数内容用于写你要赋值的变量,比如我这里写了sf.api,那么当玩家在输入框里输入任何字符后并提交后,那么玩家写的内容就会给这个sf.api,length用于设置输入框高度,width设置输入框宽度,left和top分别设置输入框的xy轴坐标。

  另外还有几个没写到的,maxchars可以设置输入框可输入最大长度,size可以设置输入的字大小,color可以设置输入的文字颜色(使用html颜色代码)。

  你可以多设置几个输入框并提示让玩家在不同的输入框里写入自己的出生年月日之类的。

  另外,输入框在输入完字后需要专门的提交标签,看下述代码

1
2
3
4
5
6
7
8
9
*config
[button graphic="number/1/02.png" x="500" y="500" target="*commit2"]

[edit name="sf.api" length=100 width=450 left=170 top=165]

[s]

*commit2
[commit][jump target="*config"]

  第一个button标签设置了一个转跳到commit2的功能,而commit2只有一个功能,那就是commit标签,然后转跳回来。

  commit标签只有一个功能,就是将当前屏幕中显示的所有输入框的内容全都提交给对应的name。比如上述代码中,我edit要提交的变量是sf.api,那么假设玩家在输入框输入了“123456789”,不管按什么按键,都是无法提交的,也就是sf.api的内容依旧是空的,只有使用commit标签,才能够将输入的内容提交给对应的变量。所以我专门写了一个按钮,用于使用commit提交输入框的内容。

三、比对变量

  这一步其实没啥好说的,也很简单。

  你只要专门写一个语句用于比较当前显示日期和玩家设置的生日一不一样就可以了。

  假设我用第一步的函数获取到了当前日期,然后又用第二部的输入框获取到了玩家的出生年月日,分别设置为f.year,f.month,f.day,那么我就可以这样

1
2
3
[if exp="sf.year==f.year && sf.month==f.month && sf.day==f.day"]
[jump target="*awa" storage="birthday.ks"]
[endif]

  第一步就是比较两边变量的值一不一样,如果一样就跳转到专门的剧情文件里,当然你要精准到时分秒的话,那就在后面继续加上sf.hours之类的比对即可,用&&分开即可。