能用钱解决的问题都不是问题——写在最前面
问题的出现
在利用krkr开发游戏的过程中,出现了当时我无法解决的问题。
在说明问题之前,先介绍关于游戏的主流程,这里用几张流程图简单介绍。
最简单的文字游戏结构:(不规范的流程图,只是做参考)
举个具体的栗子:今天起来就已经12点了,中午要吃什么呢?
- 选项一 食堂
- 选项二 外卖
- 选项三 不吃
那么当玩家点击不同选项后:
- 选项一 在食堂买到了便宜的菜,吃得真饱。
- 选项二 点了外卖,没几分钟就送到了,吃饱了。
- 选项三 算了不吃了,再开一局dota。
以上就是不靠谱的最基本的文字游戏结构。
是不是有点像编程里面的条件语句?那么,文字游戏也一定有循环语句。
举个栗子:老师问 3x^2 + 4x + 1 = 0 的解是?
- 选项一:不知道
- 选项二:x = -1 x = -1/3
当玩家点击后:
- 选项一:什么?不知道?再考虑一下,我再问一遍。
- 选项二:回答正确,坐下。
以上也是个不靠谱的基本的文字游戏结构。
编程通过条件语句和循环语句的组合,能创造出各种程序,文字游戏也一样。
复杂的文字游戏(不考虑掺杂其他要素)从其流程上看,将会是复杂的树状结构
那么逆转式游戏的流程怎么样呢?
直观上看是这样的:
但是如果细分着看,侦探模式和法庭模式也是包含了大量的文字的。
逆转裁判式推理游戏的主结构,在我理解上,可以如下划分。
这里可能需要玩过这款游戏,才能够理解我的说法
- 文字描述:指单纯的图像和文字显示(也可以没有文字只有图像)
- 调查:给予若干个调查点,玩家点击后会跳至一段文字描述
- 对话:出现若干个文字选项,点击后跳至一段文字描述
- 移动:出现若干个文字选项,点击后更改图片等
- 威慑:点击后跳转相应的一段 文字
- 指证:出现证据的按钮,点击后跳转一段文字
也就是说,上述的过程中,都可以利用基础的文字游戏套路来满足。
主体由N个文字描述组合,通过选项(包括文字按钮和图片按钮)
相互间联系起来的,而且krkr具有的跳转功能,非常适合制作这样的游戏。
然而……我忘记了游戏的证据系统。
证据系统
证据系统指的证据的查看,也就是玩家可以随时查看证据。
这个系统从设计上来讲是容易的,无非是文字和图片的显示。
- 显示若干个图片按钮
- 当玩家点击或者鼠标悬停 显示相对应的信息
也就是可以视为一个特殊的选项(krkr里有系统菜单这一说),选项跳转至相应的脚本。
krkr是一个脚本式游戏引擎,也就是说一切的流程都是事先安排好的。
虽然逆转的游戏的剧情,本身就是设计好的,玩家能找到的证据总数是有限的,且是事先安排好的。
同时,剧情的走向也是安排好的,不能真的随心所欲的调查。
那我完全可以先设计好全部的证据,阶段性地开放给玩家查看信息。
- 比如:根据游戏进度,玩家最终会获得8个证据。
- 证据系统就是打开后,显示这8个证据的图片按钮,并且要链接好按钮的跳转脚本。
- 为了不穿帮(不全部显示出来),我利用一个bool型数组 flag[] 控制是否显示。
- 游戏一开始,flag[] 均为false。
- 随着游戏剧情进行,比如点击了某一个调查点,可以将 flag[1] = true;
- 当玩家点击了查看证据后,调取 flag[] 如果是 true 则执行图片按钮的显示,反之不显示。
- 这么做就可以出现【证据增加了】的假象。
但是,上面的情况仅适用于,玩家没有任何自由行动。
有一点是自由的,就是在调查阶段的证据收集中,证据获取的先后顺序是不确定的。
在游戏中,玩家可以先和证人对话获取证词,也可以先调查现场获取证据。
- 所以加入我事先设计好了8个证据,通过数组控制是否显示。
- 那么很有可能,玩家先获取了证据2,再获取证据1。
- 当获取证据2后点击了证据列表,就会发现1号证据空着。
这就是事先设计好的弊端之一,当然解决的方法不是没有。
也就是用所谓的动态添加,从数据角度来说,实现这一点非常容易。
- 比如依旧是使用数组 flag[],同时我需要一个int型的变量x,记录我已获取的证据总数。
- 玩家先找到了新的证据(2号证据)时候 x = x+1; flag[x] = true;
- 这样就可以解决1号空着,2号显示的问题了。
- 但是不要忘记了,此时的1号证据上,显示的图片和信息依旧是1号的。
- 这是因为我是先将所有的证据,按照我的预想,安排好了位置。
那么一切推倒重来,我不能将证据脚本事先写好(实际上是可行的),而是要动态添加。
对当时的我来说,这怎么能动态添加呢?图片都是事先准备好的,文字信息也是要我写好的。
P.S. krkr的脚本语言类似:打开 image1 图片 放在 图层1 的 x = 100 y = 100 点击后跳转到 xxx.ks 文件执行语句
(有点忘记了krkr的ks脚本写法了,大概就这么个意思)
所以当时就坑在这里了……
好吧,其实现在回过头想想,解决方法是有的 Orz……
krkr有提供这一类的功能,甚至还有dictionary可以使用。
解决方案比如:我建立一个证据的数据库,利用唯一的ID作为索引,
我依旧可以先写好所有的证据点击后要执行的脚本,
安排好证据图片(按照特定的命名规则命名,比如 zhengju1.jpg)数字为ID
同样,我可以开一个字符串数组 info[],里面储存证据的简介。
在证据系统这一块,我开一个数组 evidence[],用于储存玩家获得的证据的ID。
在动态显示的时候,做如下动作即可
- 对于 x 号位置的证据,调取 evidence[x] 获取证据的唯一ID
- 根据 ID 调取 info[ID],创造要显示的图片名 "zhengju" + ID + ".jpg"
- 创造点击后跳转的目标字符串 "zhengju" + ID + ".ks"(作用就是点击后执行 zhengjux.ks 内的语句)
- 同时计算出图片应该摆放的位置, positon_x = 100 * x + 20; position_y = 20 * x +1
- 那么这样所有的东西都是动态的,应该就没有问题了。
P.S. 其实当时也是想到这一点了,但是实际的结果是失败的。
(未完待续)
暂无关于此日志的评论。