个人用的在GMS2里面的对话框系统

作者:骨折好少女
2017-12-18
21 18 5

成品

制作目标

首先要说明的是,文字绘制的效果都是直接使用这个自定义绘图脚本达成的。

这个脚本我考虑使用的使用的功能部分是:

  • 字体变色
  • 绘制精灵
  • 修改字体

其余的部分我并不去考虑:

  • 对话框根据文字的长度向前推进 ,对话有逐渐打字的效果。
  • 没有考虑限制文本框的长宽,由我自己全程手打文本,添加#号进行分行。
  • 没有考虑长文本的下翻滚阅览方式。

本次的对话框的单位是32像素 绘制的字体是 32像素 对话框素材也是32像素 

前期准备

  1. 文本用的 csv (记得保存为 u-8格式)
  2. 自定义绘图脚本
  3. 对自定义绘图脚本做些手脚csv 一打开其实就是个拿英文句号分割开内容的文档 如果在正文中也英文句号,我所使用的自定义绘图脚本就毫无疑问得爆炸了,所以我替换为了一个低频的符号。
  4. GMS2正版一个
  5. 随时翻阅的 GMS2帮助手册
  6. 差点忘记补充的素材 “自己取个好听的名字 _strip10”(这样就能直接塞进工作区了)


触发事件

首先我这个对话框是独立 obj 我遇到 npc 并且场上没有另外的对话框 按上创建出对话框的实例

if (place_meeting(x,y,oParPlayer)) //npc 碰到主角
and keyboard_check_pressed(vk_up) //按下了上
and !instance_exists(oDialogueBox) //在场没有其他对话框
 {
global.Text = Text.csv//通过修改这个 global.Text 读取不同的文本
instance_create(x,y,oDialogueBox)//创建(记住这个是偷懒行为)
}

创建事件

讲对话文本 csv 的内容 做出一个 map 塞进一个 list 的感觉


var CSV = load_csv(global.Text);//读取文本
var CSVH = ds_grid_height(CSV);//获得文本的高度



TextList = ds_list_create()//这里就是讲文本塞入的地方

for (var i=1; i<CSVH; i+=1)//进行塞文本
{
   var Map = ds_map_create();
ds_map_add(Map,"Text",CSV[# 2,i])
ds_map_add(Map,"Name",CSV[# 1,i])
ds_map_add(Map,"No",i)
ds_list_add(TextList,Map)
};

count = 0;//缓冲
TextNo = 0;//缓冲

//对话框坐标
X= 720-96;
Y = 420;

步事件

var List = TextList[| TextNo]//对应那一句演出内容
var str = List[? "Text"]//对话文字部分

count += 1 count = min(count, string_length(str));

//逐渐播放时 按下确定全部显示
if (string_length(str) > count) and(keyboard_check_pressed(global.kAttack) or keyboard_check_pressed(vk_enter)) {

    count = string_length(str);
    //exit;
}

//逐渐播放结束后 下确定 下一句
if (string_length(str) = count) and(TextNo < ds_list_size(TextList) - 1) and(keyboard_check_pressed(global.kAttack) or keyboard_check_pressed(vk_enter))

{
    TextNo++;
    count = 0;
    //exit;
}
//都播放结束 关闭
if (string_length(str) = count) and(TextNo = ds_list_size(TextList) - 1) and(keyboard_check_pressed(global.kAttack) or keyboard_check_pressed(vk_enter))

{
    instance_destroy();
}

绘制 GUI 事件

根据文字的逐渐增多改变9宫格。

var List = TextList[| TextNo]
var str = List[? "Text"]


//用于得出绘制文字的长宽 塞进 Text 这个数组里面 [0]对话文本 不涉及[]内的文本 [1]文字长度 [2]文章高度 反正不是拿来看的
var Text = draw_text_custom( - 3200000000000000, -320000000000, string_typing_custom(str, count), 1)


var XX = X - (Text[1] div 32) * 32 + 32;
var YY = Y;
//******************************这部分绘制 9宫格**************//

var Dspr = 上面的素材
//1
draw_sprite(Dspr, 1, XX, YY)
//2
for (W = 1; W < (Text[1] div 32) + 2; W += 1) {
    draw_sprite(Dspr, 2, XX + W * 32, YY)
};
//3
draw_sprite(Dspr, 3, XX + W * 32, YY)

var YY = 32 + Y;

for (H = 0; H < (Text[2] div 32) + 1; H += 1) {
    //4
    draw_sprite(Dspr, 4, XX, YY + H * 32)
    //5
    for (W = 1; W < (Text[1] div 32) + 2; W += 1) {
        draw_sprite(Dspr, 5, XX + W * 32, YY + H * 32)
    };
    //6
    draw_sprite(Dspr, 6, XX + W * 32, YY + H * 32)
};

var YY = 64 + H * 32 - 32 + Y;
//7
draw_sprite(Dspr, 7, XX, YY)
//8
for (W = 1; W < (Text[1] div 32) + 2; W += 1) {
    draw_sprite(Dspr, 8, XX + W * 32, YY)
};
//9
draw_sprite(Dspr, 9, XX + W * 32, YY)

//0
draw_sprite(Dspr, 0, XX + (W) * 32, Y + (1) * 32)//就是那个尖角的玩意 因为他 全体变成了 32*64了


//***********************************格子绘制结束******//
var XX = X - (Text[1] div 32) * 32 + 32;//根据文本推前的部分
var YY = Y;

texture_set_interpolation(true)


//绘制文字咯
draw_set_color(c_white) ;
draw_set_font(global.Font)
draw_text_custom(XX + 32, YY + 32, string_typing_custom(str, count), 1)

销毁事件

反正是拿来善后的

ds_list_clear(TextList)


本文为用户投稿,不代表 indienova 观点。

近期点赞的会员

 分享这篇文章

骨折好少女 

空有想法 一人灵魂美工 人生短缺 沉迷杀马特游戏最终幻想 这样的人能当独立游戏制作人? 

您可能还会对这些文章感兴趣

参与此文章的讨论

  1. Oncle 2017-12-18

    高产啊

  2. ambedoz 2017-12-18

    一点补充:我的游戏也用到了load_csv(),我发现使用它造出来的ds_grid最好在销毁事件(Destroy Event)里用ds_grid_destroy()清除,不然很容易造成Memory Leak导致程序崩溃。

    • 骨折好少女 2017-12-18

      @ambedoz:不需要的ds 的确是要需要及时清理的
      好几个版本前的gms2 使用频率过高的话 游戏也会直接崩溃

  3. 无有时代 2018-03-07

    少女好可爱!

您需要登录或者注册后才能发表评论

登录/注册