零基础开发 era 游戏 #8 输入(互动)
INPUT系列命令捕获的输入都会自动保存到RESULT/RESULTS。
INPUT / INPUTS#
最普通的输入,INPUT 对应数值,INPUTS 对应字符串。
可以有默认值,当指定了默认值时,输入空值(直接回车)视为输入默认值。
使用 INPUTS 系命令输入字符串时,兼容宏命令的缩写语法 (字符串)*重复次数。
如果真的需要输入 () 半角圆括号本身,需要使用 \ 转义。
TINPUT / TINPUTS#
有时间限制的输入等待,TINPUT 对应数值,TINPUTS 对应字符串。
最多输入四个参数(带 * 的为必需项):
- * 「限时」:和
TWAIT一样单位为毫秒(ms)。 - * 「默认值」:倒计时结束时若仍然没有输入则视为输入此值。
- 「是否显示剩余时间」:如为非零数值,显示(默认);若为
0,则不显示。 - 「超时提示的信息」:若为空,则清除倒计时,继续执行后面的命令。
@SYSTEM_TITLE
CALL DEFUSE_A_BOMB
QUIT
@DEFUSE_A_BOMB
#DIM answer
answer = RAND:3
PRINTL 你要剪哪根线?
SETCOLORBYNAME Red
PRINTBUTTON "红色的线", 0
PRINT_SPACE 100
SETCOLORBYNAME Green
PRINTBUTTON "绿色的线", 1
PRINT_SPACE 100
SETCOLORBYNAME Blue
PRINTBUTTON "蓝色的线", 2
RESETCOLOR
TINPUT 9999, -1, 1, "倒计时结束,炸弹爆炸了!"
CLEARLINE 1
IF RESULT == answer
PRINTL 你成功拆除了炸弹!
PRINTL 获得成就「拆弹专家」。
ELSEIF RESULT != -1
PRINTL 你剪错了线,炸弹提前爆炸了!
PRINTL 无人幸存。
ELSE
PRINTL 无人幸存。
ENDIFONEINPUT / ONEINPUTS#
只接受 一个字符 的输入,得到后立即执行(无需回车确认)。
- 使用粘贴(Ctrl+V)等方式一次性输入多个字符时,只取第一个字符。
- 类似
INPUT/INPUTS,可以指定输入空值(直接回车)时应用的默认值。
当ONEINPUT输入负值,或ONEINPUTS指定了空字符串时,参数会失效,与没有输入值的行为相同。 - 对
ONEINPUT输入非数字字符(包括空值)时,会要求重新输入。 - 理论上 和
INPUT/INPUTS一样支持宏命令(./macro.txt)。
TONEINPUT / TONEINPUTS#
参数及作用和 TINPUT / TINPUTS 相同。
可以视为 ONE 版的 TINPUT / TINPUTS。
INPUTMOUSEKEY#
断句是 INPUT-MOUSE-KEY,捕获鼠标 / 键盘输入的命令。
支持输入一个参数作为时间限制,当值 <= 0 时视为「不限制超时」。
这个命令可以捕获到 ONEINPUT 等命令检测不到的操作,比如方向键、PageUp 等。
由于其广泛的捕获范围,因此 Esc、右键、宏命令等功能都会失效。
@SYSTEM_TITLE
$INPUT_LOOP
INPUTMOUSEKEY 2000
PRINTSL ANALYSE_INPUT()
GOTO INPUT_LOOP
@ANALYSE_INPUT
#FUNCTIONS
#DIMS res
SELECTCASE RESULT:0
CASE 1
res = 鼠标点击({RESULT:0})
CASE 2
res = 鼠标滚轮({RESULT:0})
CASE 3
res = 键盘按键({RESULT:0})
CASEELSE
res = 等待输入超时
ENDSELECT
IF RESULT:0 == 2
res += @" 滚动位移({RESULT:1})"
ELSEIF RESULT:0 < 4
SELECTCASE RESULT:1
CASE 0x100000
res += @" 鼠标左键({RESULT:1})"
CASE 0x200000
res += @" 鼠标右键({RESULT:1})"
CASE 0x400000
res += @" 鼠标中键({RESULT:1})"
CASE 0x800000
res += @" 鼠标侧键1({RESULT:1})"
CASE 0x1000000
res += @" 鼠标侧键2({RESULT:1})"
CASEELSE
; 枚举值来自 https://docs.microsoft.com/ZH-CN/dotnet/api/system.windows.forms.keys
res += @" 键位({RESULT:1})"
ENDSELECT
ENDIF
IF RESULT:0 < 3
res += @" 屏幕座标({RESULT:2}, {RESULT:3})"
SELECTCASE RESULT:4
CASE -1
res += @" 未获取到颜色({RESULT:4})"
CASEELSE
; 由 CBGSETBMAPG 命令决定 格式为 0xAARRGGBB
res += @" 获取到颜色(0x%TOLOWER(TOSTR(RESULT:4, "X8"))%)"
ENDSELECT
ENDIF
RETURNF resFORCEWAIT#
游玩小 Tips:
- 按住鼠标右键不放,可以快速跳过不需要判定具体输入的
WAIT命令。- 在游戏根目录编辑
./macro.txt可以自定义「宏命令」,F1 等键位调用。
而 FORCEWAIT 是 右键 和 宏命令(预设的组合键)都无法跳过的强制等待。
执行到这个命令的时候会解除上述的「
一般用于关键的主线选择肢。
TWAIT#
顾名思义,带有延时的 WAIT 命令。
需要两个 数值 参数 —— 第一个为「等待的时间」;第二个为「是否强制等待」。
- 「启用强制等待(不等于
0)」:无论有没有输入,必须等到设定的延时结束。 - 「禁用强制等待(等于
0)」:只要检查到有输入就跳过等待,继续执行下去。
PRINTFORML %GETTIMES()% 你开始闭关 TWAIT 5000, 1 PRINTFORML %GETTIMES()% 10 年(5 秒)后
WAITANYKEY#
ONE 版本的 WAIT,鼠标点击也算。