GameMaker Studio 2

创建于:2017-04-19

创建人: dougen

192 信息 1091 成员
游戏开发工具 GameMaker Studio 2 的讨论小组

[ 分享 ] 简单的对话框体(下)

Linpean 2017-10-29

该教程由油管上的妹子FriendlyCosmonaut原创,能翻墙的尽量看原版吧:Textbox Tutorial

代码托管在Github。实现的效果为:

Image title

其实基本的逻辑已经在简单的对话框体(上)实现了,这一节主要是

  • 将代码重构成可以复用,并且更加抽象模块化
  • 多页文本对话和跳过对话的功能
  • 打字效果(逐字出现的效果)
  • 然后美化下对话框的表现:外边框,字体变色

  

多页对话文本和跳过某页对话的功能

将obj_susan的step事件的对话文本,直接改成变量myText



然后在create事件使用list结构对该变量声明和赋值,这样我们不必直接去step事件一一修改对话文本,可以直接在create对myText变量直接修改,其他地方引用变量。

注意这里的声明方式,list[index] = strings。同样的index的值将作为我们对话框的页码来使用:第一段对话,第二段对话...

既然有了多段对话,那么在obj_textbox的draw事件内,也要分别连续绘制不同的页码的文本。

将Draw事件内的引用的text变量,改为text[page]


同样的,由于使用page变量,在create也对page变量进行声明和赋值

然后为obj_textbox添加step事件,并且进行按键检测,检测到了则跳过当前页的对话(即page变量增加1)。


运行游戏,按下空格键能看到如下效果

Image title

修正对话框对象的创建条件为,按下space时,并且与NPC对象(如obj_susan)发生碰撞.

在obj_susan的step事件内,添加if语句


修正page变量的大小会超过文本text(list)的“长度”,即你一直按下空格,当对话框显示完最后一句话后,就销毁该对话框对象。


然后设置creator.myTextbox变量为空。

为什么这么做?

因为在NPC对象创建实例时,会判断自己的myTextBox存不存在,一旦存在它就不会创建第二个了,这个必须将已经被销毁的myTextBox变量设置为空,这样当再次触发创建NPC对象的TextBox时,TextBox才会被创建出来。

首先在obj_Textbox中声明creator变量为noone。然后在创建obj_Textbox时,将obj_Textbox的text变量换成NPC自己的对话文本,并且设置该obj_Textbox的creator(创建者)为自己。

这样在最后,就可以通过creator索引,在obj_Textbox的step事件中,设置NPC对象的myTextBox变量为空了(是不是很魔法,这个骚操作,真是给跪了,这个油管妹子。)

这里有一个优化的操作,作者不希望,当出现最后一句话后,再次按下空格不是销毁文本对话框(obj_Textbox),然后又马上创建新一个文本对话框(obj_Textbox)出现第一句话,而是这一次的空格仅仅只是起到销毁文本框的作用,这里有个细节操作,就是我们不知道GameMakerStudio2的代码运行顺序


所以我们不在运行检测到space空格按下的这一帧中立即将myTextbox变量设置为空,而是使用计时器alarm(并且是NPC对象的alarm变量)来移除myTextbox,就会使得这一次空格按下仅仅只是销毁文本对话框,而不会立即创建新的文本对话框了。




打字效果(逐字出现的效果)

为了实现逐字出现的文本对话框的效果,这里的方式是对展现的文本的内容进行处理。

在obj_Textbox的step事件中,创建一个临时变量textPart,并使用string_copy()函数来从指定的位置,复制指定个数的字符成为新的文本。

 先在obj_Textbox的create事件中创建charCount变量(charCount每帧增加的数量可以作为逐字出现的速度来调节)


为了方便调试,查看结果,我们可以为obj_textbox对象添加draw_GUI事件,用显示当前绘制了多少个字符


运行游戏,即可触发对话,即可看到逐字出现的效果,但是可以看到左上的charCount数量在不断增加,没有达到本页对话的最大字符数时停下,这时比较消耗性能的。


为了修正这个问题

 





字体变色效果

在NPC对象(obj_susan)的create事件创建myname变量


再在对话框中,创建name变量


在创建对话框时,将NPC的名字变量赋值给对话框


然后修改绘制文本的代码


为了美观缘故,这里设置了水平边距和垂直边距,并且使姓名居中显示


运行游戏,即可看到效果。、





NPC对话模块化。

即创建一个可以对话的NPC父物体,其他NPC对象都从该对象继承。

在资源树上选中obj_susan,拿下<crtrl+d>快捷键复制一个对象,重命名为obj_parent_talking。

然后将其精灵设置为空。

接着将其create事件中的myName和myText变量都设置为空(这些内容将交给继承它的NPC对象来填充,毕竟不同的NPC有不同的名称,有不同的姓名)


然后对原来的NPC对象(obj_susan)进行处理


如果我们需要在继承obj_parent_talker的NPC对象另外表现出不同的属性,那么可以继续添加step事件,并在书写自己的属性代码前,添加继承函数event_inherited()


如此以来,我们就可以自由的创建更多的NPC了,只需要添加NPC自己的对话和姓名,而对话的逻辑和功能,都交给obj_parent_talker对象了。例如我们可以创建一个obj_bob对象,设置精灵,对话,姓名。


同时为了方便没有耐心看剧情的玩家,我们再添加一个小功能,在播放文字未完成时,再次按下空格,则将当前页的所有的文字全部显示出来。


运行游戏,则可以看到效果。



美化对话框

先获得对话框高度


再绘制一个包裹对话框外边缘的矩形边框


运行游戏,则可看到文章前贴出的效果图

Image title

到此,FriendlyCosmonaut妹子的对话系统教程完结了。

近期喜欢的会员

 
顺子 2017-10-30

下半集终于来了~我转去借花献佛咯!

 

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册