3.1文字框和选项
还记得模板分为几个角色,它们分别有什么样的功能吗?回顾一下:
- 舞台:切换背景和BGM
- main.:控制故事的流程
- story.:底部文字框和选项的显示
- 接口.示例:插入过场动画、小游戏等元素
现在,让我们开始制作!
首先,我们要弄明白,究竟是什么控制着文本框、背景、BGM在合适的时间切换到合适的状态?
是状态机。
程序中各个部分都会根据某一变量的变化,即状态机的变化,而作出相应的调整。
这样,我们只需改变状态机的状态(即变量的值),就可以随心所欲地控制程序。
状态机一般是这样写的:
此外,有一些点需要注意:
- 如果可以,尽量让你的程序在一旦改变状态时,就能立即执行新的程序,而不是卡在旧的程序中无法退出,比如按下退出游戏,游戏却无法及时退出,需要等待一段时间。
- 一旦用变量做状态机,就不要使用广播改变状态了,这是两种完全不同的控制方式。
现在,我们来编写用状态机控制story.的文字框和选项的部分。
在这里,设置变量“B.story.name”为状态机
当它的值包含“接口.”时:
舞台应该播放接口相关的内容,此时文字框和选项不显示;
当不包含“接口.”时:
如果状态中包含“:select”,则执行选项类状态的代码; 如果不包含“:select”,则执行剧情类状态的代码。
代码如下:
框架已经搭好,接下来我们需要填充其中具体状态内执行的代码。
考虑到之后诸如选择等情况下需要使用多个克隆体,我们先定义一个可以创建多个克隆体的方法。
知识点:克隆体
- 使用语句克隆 [自己 v] 可以创建克隆体。 克隆体生成后,它会运行 当作为克隆体启动时 下方的代码。
- 使用 删除此克隆体 可以删除克隆体。按下绿旗后,所有克隆体会被自动删除。
这个方法可以克隆多个某一种类的克隆体。参数kind为克隆体种类,#为克隆的克隆体数量。第一个克隆体的编号为 #start+1 的值,其余依次+1。
- 定义时注意勾选不刷新屏幕,让克隆体在一瞬间全部创建。
知识点:全局变量&私有变量
创建变量时,弹窗中可选择“适用于所有角色”(全局变量)和“仅适用于当前角色”(私有变量)
- 全局变量:在任何角色、克隆体中调用,返回的值都相同
- 私有变量:
- 只能在一个角色中使用
- 本体和克隆体间数据相互独立
- 克隆体私有变量的初始值为它被创建时本体的这个私有变量的值
变量命名规则
在本课程中,变量遵循如下命名规则:
变量名由一个主名与多个前/后缀组成,每个部分间由“.”隔开。 主名代表变量的用途,前/后缀限定变量的使用场景或说明变量特点。
例如变量“o.clo.#”中,主名为“#”,代表编号的意思;其余为前缀,“o”代表私有变量, “clo”代表克隆体专用。
小挑战:为克隆体编号
使用私有变量,我们可以:
- 分辨克隆体,让不同克隆体做完全不同的事情
- 将私有变量加入运算,让克隆体做相似但不同的事情
回到模板,让我们编写代码,在进入选项类状态时,克隆一些选项。
由于不清楚究竟有多少个选项,我们创建一个变量“e.d.select.num”,在未来让模板使用者把选项数赋值给它。
以此类推,编写进入选项类状态时克隆文字框的代码。
现在,你已经实现在合适的状态下克隆相应的克隆体的功能了。
不仅如此,你还会不断克隆,根本停不下来!!
原因分析:程序不断退回主循环,又重新进入状态分支。每次进入分支,都会克隆一次克隆体。
为了解决这个问题,你需要在状态发生改变前堵住线程。毕竟,状态不变时,不需要判断进入了什么状态。
状态机部分写完了,再来写克隆体。
搭建框架,根据克隆体种类,即o.clo.kind,执行不同程序。
先手搓几个选项,然后来写选项部分的代码。
暂时无法在飞书文档外展示此内容
你可以使用以下👇代码切换选项状态,试运行查看效果:
接下来做文字框。
暂时无法在飞书文档外展示此内容
- 后面不再演示制作造型的步骤
编写程序:
同样地,你可以使用下面的代码来试运行,测试错误:
到此,角色story.就制作完毕啦!
<iframe
width="100%"
height="800px"
scrolling="no"
src="https://www.ccw.site/embed?id=Oscar-novel/Oscar/lec03a&type=comment"
title="{Oscar的文字互动小说 03a}"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
scrolling="0"
></iframe>