试想的功能:
1.鼠标左键按住对话框边缘可以拖动改变大小;
2.鼠标左键按住对话框中间可以拖动改变位置;
3.与对话框的大小适配的滑动条;
4.与内容长度适配的滑动按钮长度;
这么一写好像有点看不懂了。其实就是浏览器网页右边那个滑动条的功能。
一、改变对话框的大小和位置
在SS的教程里,只做到了可以随鼠标位置改变大小(但是无法固定)。我来自己改造下。
1.改变大小
在obj_9slice的create事件里添加以下变量
size = sprite_get_width(spr_9slice_simple) / 3; // 九宫格每格边长,用于判断鼠标点击位置 crt_w = size*3; // 当前宽度 crt_h = size*3; // 当前长度 changing = false; // 是否正在改变大小
step事件里面判断鼠标点击的位置,并设置对应changing的值
// 如果按下鼠标左键 if (mouse_check_button_pressed(mb_left)) { // 若鼠标位置不在中间部分,但在框内(也就是在边缘部分) if (!point_in_rectangle(mouse_x, mouse_y, x+size, y+size, x+crt_w-size, y+crt_h-size) and point_in_rectangle(mouse_x, mouse_y, x, y, x+crt_w, y+crt_h)) { changing = true; } } // 若鼠标不在按下状态 if (!mouse_check_button(mb_left)) { changing = false; }
然后在draw事件调用上次教程里的脚本函数就可以了,并动态保存下当前的对话框大小。
// 若正在改变大小 if (changing) { var crt_size = nine_slice_box_stretch(spr_9slice_simple, x, y, mouse_x, mouse_y); //噢对了,我给脚本函数加了个返回值 crt_w = crt_size[0]; crt_h = crt_size[1]; } else { nine_slice_box_stretch(spr_9slice_simple, x, y, x+crt_w, y+crt_h); }
效果如下(我限制了最小长宽,所以不会出现画反出去的情况):
2.改变位置
要随鼠标移动改变对话框位置,就要保存鼠标坐标和对话框坐标的相对值。
create事件里加入变量:
moving = false; // 是否正在移动位置 rltv_x = 0; // 进入移动模式时,鼠标相对于框的位置 rltv_y = 0;
step事件改一下:
// 若鼠标位置在框中间部分 if (point_in_rectangle(mouse_x, mouse_y, x+size, y+size, x+crt_w-size, y+crt_h-size)) { moving = true; rltv_x = mouse_x - x; rltv_y = mouse_y - y; } // 然后再判断是否在边缘...
同时如果正在移动的话,要动态改变框的坐标。
// 若正在移动 if (moving) { x = mouse_x-rltv_x; y = mouse_y-rltv_y; }
效果如下:
hmmm你可以看到,当点击右上角的时候,会出现高度突然变成最小的情况。
用最笨的办法对每个边缘进行了分别判断,就不写了。现在的问题是按下左键的时候大小会有突然变化(因为绘制时直接使用了鼠标位置),而且向右方和下方移动时没法固定。一部分原因是绘制函数以左上角为原点开始作画的。折腾了半天没弄好,先将就一下。
暂无关于此日志的评论。