一、准备图片
不论最终需要多长多宽的框,都只需要画一个九宫格模板。
可以看到,每一个小格都是正方形(在这里是8x8)。其中上/下/左/右边缘的图块都应该能和同样的边缘图块完美拼接,因为增加长宽的原理就是复制粘贴边缘格然后拼在一起。
二、代码
nine_slice_box(sprite, x1, y1, x2, y2)
参数说明:
sprite:对话框精灵(sprite)
(x1, y1):对话框左上角坐标
(x2, y2):对话框右下角坐标
首先把参数用本地变量存好。
var spr = argument0;
var _size = sprite_get_width(spr) / 3; // 每个小格的边长
var _x1 = argument1; // 下划线用于表明这个变量只用于这个脚本
var _y1 = argument2;
var _x2 = argument3;
var _y2 = argument4;
var _w = _x2 - _x1; // 用于绘制的长宽
var _h = _y2 - _y1;
var _columns = _w div _size; // 整数列(向下取整)
var _rows = _h div _size;
然后绘制边角:
draw_sprite_part(spr, 0, 0, 0, _size, _size, _x1, _y1); // 右上角
draw_sprite_part(spr, 0, _size*2, 0, _size, _size, _x1+(_columns*_size), _y1); // 右下角
draw_sprite_part(spr, 0, 0, _size*2, _size, _size, _x1, _y1+(_rows*_size)); // 左下角
draw_sprite_part(spr, 0, _size*2, _size*2, _size, _size, _x1+(_columns*_size), _y1+(_rows*_size)); // 右下角
绘制边缘:
for (var i = 1; i < _rows; i++) {
draw_sprite_part(spr, 0, 0, _size, _size, _size, _x1, _y1+(i*_size)); // 左边缘
draw_sprite_part(spr, 0, _size*2, _size, _size, _size, _x1+(_columns*_size), _y1+(i*_size)); // 右边缘
}
// 上下边缘同理
绘制中间部分:
for (var i = 1; i < _columns; i++) {
for (var j = 1; j < _rows; j++) {
draw_sprite_part(spr, 0, _size, _size, _size, _size, _x1+(i*_size), _y1+(j*_size));
}
}
最后创建一个物体,在draw事件中调用该脚本即可。
但是这个脚本还不是真正意义上可以随意地改变对话框的长宽。因为这两行:
var _columns = _w div _size; // 整数列(向下取整)
var _rows = _h div _size;
而绘制时我们使用的是_columns和_rows,而不是_w和_h,所以对话框的长宽一定是小格边长的整数倍(该例中为8),比如8、16、80,而不会是83(此时会绘制为80)。
三、改进
以上的写法其实是保证了对话框边缘的最小拼接单位是一个小格,如果小格里有比较复杂的花纹细节(在例子里是那一个小点),不会出现细节显示不全的情况;但如果想要真正意义上随意改变长宽,我们可以牺牲细节,将最小拼接单位缩小到一行或一列像素,也就是蓝色框选出来的部分。中间块则只需要复制一个像素点进行拼接。
nine_slice_box(sprite, x1, y1, x2, y2)
参数说明同上。
还是先用变量存储好参数,然后绘制。
draw_sprite_part_ext(spr, 0, _size, _size, 1, 1, _x1+_size, _y1+_size, _w-(_size*2), _h-(_size*2), c_white, 1); // 中间
draw_sprite_part(spr, 0, _size*2, 0, _size, _size, _x1+_w-_size, _y1); // 右上角
draw_sprite_part(spr, 0, 0, _size*2, _size, _size, _x1, _y1+_h-_size); // 左下角
//...
draw_sprite_part_ext(spr, 0, _size*2, _size, _size, 1, _x1+_w-_size, _y1+_size, 1, _h-(_size*2), c_white, 1); // 右边缘
draw_sprite_part_ext(spr, 0, _size, 0, 1, _size, _x1+_size, _y1, _w-(_size*2), 1, c_white, 1); // 上边缘
//...
这样就可以随便调整长宽啦。
————————
昨天的笔记今天补上。原理不难理解,就是坐标比较难算。
在游戏里应该很少有需要动态调整对话框大小的情况,但这样框的大小就不需要美工来控制了,用处还是挺大的。
暂无关于此日志的评论。