Gamemaker studio2经验(4)——打字机效果

问题概述

在很多游戏中……算了实在不好意思写引言了,就直说啦。如果你是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党的话可以关注一下后续的文章,一口气看下来就可以上手同人游戏的制作辣!

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值