GameMaker Studio 2

创建于:2017-04-19

创建人: dougen

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

简单的对话框体(上)

Linpean 2017-09-24

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

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

Image title以下是文本教程



设置游戏帧数

在option设置里设置游戏的运行帧数为60.


绘制需要的对话框背景

创建大小为W:400-H100的精灵,并使用绘图工具,将其涂成纯黑色

Image title

创建对话框体文本对象

在对象的draw事件进行对话框的绘制

Image title


创建一个房间room

并设置房间的大小参数和背景颜色

Image title

此时将对象拖动至房间任意一处就能看到效果了,但对话框的还需要继续优化。

添加触发事件,文本换行等等。


 设置字体

GMS2里的字体可以在font里面创建,但是对于想要使用整个中文字库的用户,这里提供一种不同于博主的方法,从外部导入Included Files文件。

Image title

添加字体

Image title

在绘制文字之前,设置字体

Image title


使用draw_text_ext来处理文本换行

第4个参数为行间距,第5个为换行的宽度

Image title

然后在create处理化需要的参数

Image title

运行游戏可以看到换行的效果



添加触发事件,来创建对话框

创建玩家player对象来检测鼠标点击事件,在指定的Text层级中创建对话框


将player对象拖到房间中,运行游戏,点击鼠标左键,就能看到点击效果了



将触发事件更改为碰撞触发

先创建对象所需要的精灵

Image title

然后创建obj_susan对象,并依次为两个对象指定精灵,然后创建碰撞事件代码来创建对话框

注意place_meeting只用在非精确碰撞遮罩下才会返回true

Image title

Image title

运行游戏即可看到效果:player碰到susan会创建一个对话框

Image title


解决每帧创建实例的错误

这是一个很常见的错误,新手常常不加选择和判断在step和draw这类每帧都会被执行的事件创建实例,而旧的实例又没有被销毁,运行一段时间后,游戏就会奔溃。

先把创建的实例的索引赋值给变量myTextBox

Image title

然后在draw事件中,绘制实例的id

Image title

运行游戏就会看到实例在不断的增加,即不断的被创建。

Image title

所以在创建实例时,通过是先检测要创建的实例存在,如果存在就不需要再创建了

并且注意在销毁实例时,也需要检测实例是否存在,避免引用不存在的实例,引起游戏崩溃

Image title

值得注意的是,在销毁实例后,记得将引用的变量设为noone,否则myTextBox仍然为实例的索引号,下次检测到碰撞时,检测变量不为空,就不会创建对话框了。

Image title


使人物具有自己的对话文本

我们现在创建的文本就是在obj_TextBox的create事件中初始化好的,但实际上我们希望NPC是具有自己的对话文本的,表达自己的情绪和性格,而obj_TextBox只负责对话框的形式和表现,所以在创建对话框时,使用NPC的文本重新给对话框的文本进行赋值

Image title

这样一来,控制player与susan碰撞,对话框使用就是susan的对话文本“Hello I'm Susan”

Image title



关于更多的模块化对话,优化对话框体的表现,将在下节中继续。


近期喜欢的会员

 
顺子 2017-09-24

忍不住要申请一发转载~介绍的是相当详细了

 
Linpean 2017-09-24

顺子 拾人牙慧,尽管转 XD

 
顺子 2017-09-25

Linpean 有知乎账号么?要是有的话可以直接用投稿功能你自己发~投到GMS手札就行了,不然的话就只能代发了……虽然这专栏也并没有什么人关注orz

 
Linpean 2017-09-25

代发好了 = =

 
顺子 2017-09-25

Linpean ok~另外这个视频我之前在B站也转过,翻不了墙的同学也可以去这里看https://www.bilibili.com/video/av12120494/

 
wx09y 2017-09-25

问个问题,我看说明文档里有/n换行,可是我试了“111/n11”不好使啊,想手动换行该怎么做?

另外,我写的draw_text_ext(x,y,text,10,30)为什么换行没效果,该多长还是多长

 
Linpean 2017-09-25

Image title

Image title

是有用的哦,事实是你用错了转义字符,是右斜杠,你用的左斜杠,还有ext的换行是受scale和宽度影响,你确定是不是你的参数设置错误

 
顺子 2017-09-25

话说我记得好像draw_text_ext()是强制单行显示的方法,不能用转义符换行,要手动换行的话要用draw_text()吧……

 
Linpean 2017-09-25

顺子 但事实上ext也是可以的,上面的效果也是用ext进行绘制的

 
顺子 2017-09-25

Linpean 晚上我试试看,因为刚好前天也有朋友问我这个问题,他就是用ext方法换行不能,最后用draw_text才搞定

 
wx09y 2017-09-25

Linpean 我试了一下,发现直接输入就好使,从ini或者csv读取文件后\n就无效了,啥原理。

 
顺子 2017-09-25

Linpean 确实是可以的,之前看文档的时候误会了……果然学艺不精~

 
顺子 2017-09-25

Linpean 又测试了一下,好像ext的方法下跟设置的单行文本最大长度有关系,如果这个长度设置的很长就会出现不换行的情况

 
ikonon 2018-06-03

顺子 每次显示文本的时候都会卡一下。。不知道为什么

 
顺子 2018-06-05

ikonon 直接试一下这个妹子的对话系统,我用下来好像没什么问题

https://friendlycosmonaut.itch.io/dialoguesystem

 
ikonon 2018-06-06

顺子 我试试看 :)

 
ImSans 2018-12-23

大佬,这个是必须打空格才能换行吗?没有自动换行(判断每行最大宽度)的说法吗?

 

加入 indienova

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