首先,博主感到非常高兴,就在很久以前,博主就想写一个属于自己的脚本引擎,哪怕功能再简单也好,只要能跑起来就行了,直到今天,博主终于向这个梦想迈出了第一步,将脚本引擎的雏形给做了出来,因为这个脚本系统属于 nkCEngine 的一部分,所以博主将其命名为 nkScript,nkScript 是一门基于命令的语言,没有复杂的函数调用,没有复杂的循环语句,它拥有的,是简单的数值运算语句、条件跳转语句、无条件跳转语句、命令语句,等等;nkScript 的开发目标主要是用于制作简单的文字冒险游戏,就是那种只需要通过点击鼠标,就可以游玩整个游戏的那种游戏;
脚本系统分为两个重要组件,分别是编译器(nkScript Compiler)与播放器(nkScript Player),编译器负责将开发者易于阅读与编写的文本形式的脚本文件,转换为二进制中间码形式,而脚本播放器则加载中间码数据,并进行解释,同时将脚本中的命令以图形的形式呈现出来,还要配合用户的输入,来进行脚本执行与调度(比方说点击鼠标,显示下一句对白);
我们先来看一段简短的脚本代码:
text "欢迎使用 nkScriptPlayer 脚本播放器\n我们将为你演示脚本播放器的基本功能,请点击鼠标左键" text "我们来试着加载并显示背景图" load bg "CGDATA/title001.bmp" text "现在,试着在画面左边加载一个立绘" load left "CGDATA/MEGU111.BMP" text "很好,试着在画面右边再加载一个立绘" load right "CGDATA/SINO113.BMP" text "接下来,我要删除全部图像" unload all text "喔~~一片漆黑,什么都看不到!!" text "点击鼠标结束程序哦"
上述脚本代码基本上不言自明,只有三种命令,第一种是 text 命令,用于显示指定文本,第二种是 load 命令,用于加载指定图像文件,并将其显示在屏幕指定位置,第三种是 unload 命令,用户从屏幕中移除指定位置的图像,并且将图像资源从内存中释放;
运行效果如下图所示:
接下来,我要演示一下数值计算的功能,但是,仅仅数值运算,并没有任何作用,在文字冒险游戏中,数值往往必须配合条件判断与跳转语句,才能发挥真正的效用,比方说创建一个变量 LoopCount,初始化为 0,然后为 LoopCount 增加 1,如果发现 LoopCount 小于 3,则跳转到指定的文本指令,显示提示文本,然后跳转到头部重新执行,如果 LoopCount 等于 3,则结束脚本的运行;
为了实现上述效果,我们可以编写出下面脚本:
set LoopCount = 0 :LabelStart calc LoopCount + 1 if LoopCount == 1 LabelRunFirst if LoopCount == 2 LabelRunSecond if LoopCount == 3 LabelEnd :LabelRunFirst text "游戏第一次运行呢" goto LabelStart :LabelRunSecond text "游戏第二次运行了哦" goto LabelStart :LabelEnd text "点击鼠标结束程序哦"
代码应该不会很难看懂,如果你稍微有一点点 Windows 系统下的命令行使用经验,或者编写 bat 文件的经验,那么读懂上面脚本应该易如反掌,首先,在脚本的开头,使用 set 命令创建一个变量 LoopCount,并将其初始值设置为 0,用于记录脚本已经重复运行多少次,然后马上为 LoopCount 加 1,随后对 LoopCount 的值进行判断,如果为 1,则显示对话 1,如果为 2,则显示对话 2,如果为 3,则直接跳转到脚本末尾,显示退出提示文本,最终程序退出,运行效果如下所示:
运行结果并没有什么令人感到惊讶的地方,相反,【容易使用】就是这款脚本系统的最大特点,因为脚本最终是交由脚本编写人员进行编写,程序开发者不会进行过多的干涉,这样子,可以让编写游戏故事的人员可以随时随地测试自己的构思与想法;
最后,放出脚本引擎的可执行程序文件,大家可以下载回来后,通过编辑 main.txt 文件,然后使用 nkScriptCompiler.exe 进行编译,如果成功生成了 main.nse 文件,则可以使用 nkScriptPlayer.exe 进行运行,编写好的脚本保存好后,只需要直接双击 nkScriptCompiler.exe 就会自行编译,然后直接双击 nkScriptPlayer.exe 就会自动运行脚本,点击鼠标左键可以与脚本进行人机交互:
http://pan.baidu.com/s/1jHL8yZc
-- 2016-10-17 By NekoDev cnblogs
-- 原创技术文章,转载请注明出处,并保证内容的完整性