游戏内中文输入

大家好,今天给大家介绍一下利用 GameMaker 自带函数进行游戏内中文输入的操作方式,在我看来这个方式的优缺点都非常明显

优点 缺点
简单易用 对话框样式简陋
跨平台兼容性好 弹出式对话框会中断游戏体验

所以,我觉得这是很适合入门使用的一个方法,或者在输入场景非常少,不想在这方面浪费太多精力的时候不失为一个可选项,但如果追求更好的输入体验,那就要另外想办法了。

话不多说我们言归正传。这个自带的输入对话框函数是

get_string_async(string, default);

其中的两个参数分别是对话框的提示文字和填入的默认值,大概样式如下


这是 HTML5 的弹窗

每个平台的对话框样式都会略有区别,这个在 B 站的视频里我有发录屏,确实长的都不怎么样,可能 Windows 那个弹窗是最体面的了,摊手。

说回 get_string_async(string, default) 这个函数,其实这个函数还有个双胞胎弟弟 get_string(string, default) ,这个函数同样是弹出对话框进行输入文字,但这个函数又有几点不同:

  • 仅支持 PC 平台
  • 弹出时游戏会被后台冻结等待弹窗返回值
  • 返回值就是输入的文本内容

而 get_string_async 是个异步函数,当对话框弹出时,游戏还会继续运行不受任何影响,并且这个函数返回的也不是文本内容,而是一串 key 值,GMS2 会把返回的内容存入一个默认的 ds map 数据结构中,你需要拿着返回的值去这个数据结构里查询才能得到实际的输入文本,这一点我们可以先看看官方文档的示例
首先我们在鼠标的点击事件里写下如下内容

msg = get_string_async("你叫什么名字","顺子");

这段代码会使得当鼠标点击时弹出一个对话框,询问“你叫什么名字”,并且在弹出的对话框中默认填上“顺子”这个名字,玩家可以随意修改,当玩家填好内容并点击确认后,对话框就会关闭,同时数据会被保存到上面所说的数据结构中——这个默认数据结构叫"*async_load*",而我们这段输入内容的索引 key 值则被保存到了变量 msg 中。
如果我们想要获得这段内容,就需要先创建一个 asynchronous Dialog 事件(下图第四项)

然后在这个事件里填入以下代码

var i_d = ds_map_find_value(async_load, "id");
if i_d == msg
   {
   if ds_map_find_value(async_load, "status")
      {
      if ds_map_find_value(async_load, "result") != ""
         {
         global.Name = ds_map_find_value(async_load, "result");
         }
      }
   }

上面这段代码其实就是先确认数据结构中有没有一个叫 msg 的 key 值,有的话就进一步查询其当前状态 status(玩家是否按了确认),如果是按了确认的状态再去检索返回的 result 是否为空,只要不为空那就把其中的内容读取出来,并赋值给了全局变量 global.Name ,这样我们输入的文本内容就被 global.Name 存起来了,我们只需要在使用的时候直接调用即可。

以上全部就是利用自带函数实现游戏内中文输入的方法了,应该说非常简单,但确实只是可用级别,是否在自己的游戏中使用这个方法就要各自权衡了,其实官方市场也有一个拼音输入法的收费插件(没错,有人在 GMS1.4 时代就用 GML 写了一套中文输入法),目前价格是 4.99 刀,自带虚拟键盘还支持词汇联想。

2019-11-06 12:57
Comments
Write a Comment