个人用的在GMS2里面的对话框系统
骨折好少女
2017-07-28
成品
制作目标
我们看一下成品
首先讲好 文字绘制的效果都是直接使用这个 自定义绘图脚本 而达成的
这个脚本我考虑使用的使用的功能部分是
字体变色
绘制精灵
修改字体
其余的部分我并不去考虑
对话框是根据文字的长度向前推进 对话有逐渐打字的效果
没有考虑限制文本框的长宽 有我自己全程手打文本 添加#号进行分行
没有考虑长文本的下翻滚阅览方式
本次的对话框的单位是32像素 绘制的字体是 32像素 对话框素材也是32像素
前期准备
文本用的csv (记得保存为u-8格式)
自定义绘图脚本
对自定义绘图脚本做些手脚
csv一打开其实就是个拿英文句号分割开内容的文档 如果在正文中也英文句号,我所使用的自定义绘图脚本就毫无疑问得爆炸了,所以我替换为了一个低频的符号。GMS2正版一个
随时翻阅的GMS2帮助手册
差点忘记补充的素材 "自己娶个好听的名字_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)
(转发自:原日志地址)
骨折好少女
2017-07-28
想了想 还是写成分享 而不是教程的性质 这东西当教程还不被人打?
又完善了一遍……更清晰了!
太牛啦!我想认识文章主人:)
(卧槽,我说了什么奇怪的话= =)