问题概述
在很多游戏中……算了实在不好意思写引言了,就直说啦。如果你是UT粉,想用gm搞搞UT的同人作品但是又无从下手,那么请看过来。
对于RPG类游戏,文字交流系统是不可或缺的,但是gm的文字系统……实在有些一言难尽,那没办法,谁让gm是真爱呢,既然发现问题那就卯足全力去解决它。
解决方案
首先我们来看一看什么是打字机。
熟悉吧!其实就是传统的文本对话框,它需要有:一个文本框,规整的文本格式,自动换行功能,逐字输出效果,按快捷键迅速显示完成功能。这就是一个打字机效果需要实现的所有内容。
现在我们分条来解决:
1、文本框
美工的事就不多讲了,因为我也是个究极美术渣T^T 不过网上关于文本框的UI还是蛮多的,随便下一个就好了。(图中的对话框是直接在gm里画的)
2、文本
由于文本是一个整体,因此我们可以新建一个对象:obj_word。代码如下:
obj_word—create
n=0; //是否说过话了,视作布尔值
allstrings=""; //字符串整体
strings=""; //已经输出的字符串
timer=0; //计时器1,用于控制字符输出的时间间隔
timer2=10; //计时器2,为了防止连按Z导致的bug,下文会讲
i=1; //当前字符下标
m=0; //是否已经结束显示文本了,视作布尔值
这些变量已经用注释解释了,重点放在step中
obj_word—step
if(n==0)
{
//if(duixiang==1)
{
//sound_play(snd_spicall);
switch(talk)
{
case 1:allstrings="Purple soul will be more charming.Isn't it?";break;
case 2:allstrings="Honey, I can't see you like violence so much.";break;
case 3:allstrings="Oh dear, are you ready for this spider feast?";break;
case 4:allstrings="It's funny how you struggle.";break;
case 5:allstrings="It's like bribing me. Don't be silly.";break;
case 7:allstrings="You want to pity me? It's interesting. It looks like I have to do my best.";break;
}
}
n=1;
}
timer+=1;
timer2-=1;
if(timer mod 10&&string_length(strings)<string_length(allstrings)&&m==0)
{
strings=string_copy(allstrings,0,i);
i+=1;
}
if(m==1) strings=allstrings;
if(keyboard_check_released(ord('Z'))&&m==0&&timer2<0)m=1;
if(keyboard_check_pressed(ord('Z'))&&string_length(strings)=string_length(allstrings))
{
/*zhuren.close=1;
global.began+=1;*/
instance_destroy();
}
首先开头判断n=0?是用来检测这段对话是否显示过了,避免出现一句话无限重复的情况。下面的talk存储了要说的话。
随后我们开始更新计时器。计时器timer1一直++,每10帧显示一个字符。计时器timer2初始值为10,每帧减1,表示着在本对象在创建的时候你连按Z是没有用的,只有timer2被减到0了你才能继续按Z。这样避免了你按Z跳过上一段对话的同时由于连按效应导致下一段对话也被跳过。
下面介绍一个字符串复制函数:
string_copy(str,begin,end)
表示对str字符串从下标为begin到下标为end进行复制。由于每10帧i会加一,我们复制的长度也会每10帧增加一个长度,那么就可以显示出“打字”的效果了。
最后一步是Z键快进,我们需要关注m这个布尔值。当我们按下Z的时候,m从0转向1,表示着字符串应该从增长阶段进入完结阶段,那么根据
if(m==1) strings=allstrings;
这段代码,我们就可以瞬间完成整段字符串的复制。
最后,假如字符串的复制工作已经完成,如果再按Z,就结束这段对话。具体是关闭对话框还是进入下一段对话则由设计者来决定。
obj_word—draw
draw_set_font(font3);
draw_text_ext(x+50,y-35,strings,-1,275);
最后就是绘制阶段了,需要介绍一些这个函数:
draw_text_ext(x,y,str,sep,w);
其中x和y用来描述绘制起点的坐标,str是要绘制的字符串,sep表示行间距,w表示每一行能容忍的字符长度。一旦超出这个长度,那么文本就会自动换行。
到此打字机效果就制作完成了。其实过程相当简洁,只是用到了一些特殊的函数,当然如果你是UT党的话可以关注一下后续的文章,一口气看下来就可以上手同人游戏的制作辣!