PolygonBorder
介绍
在GMS2(2.3以上版本)中可用的多边形限制框
功能
以下列出了我实现的功能,但是你可以做更多拓展(如
示例4的圆框)
- 得到点与多边形框最近的位置(用于在出框后限制回框内)
使用
- 使用 instancecreatedepth或instancecreatelayer 创建一个框
为了方便描述,后文称该框为
poly
- poly.listVertex 为存储多边形的顶点的列表
- 例如
ds_list_add(poly.listVertex, [0, 0], [50, 50], [-50, 50])
即可向多边形添加
(0, 0)、
(50, 50)、
(-50, 50) 三个顶点
- 其他操作如删除顶点等就不再赘述,对 listVertex 进行操作即可
- 使用
poly.contains(x, y) 即可判断点是否在框内
poly.relativeContains(x, y) 差不多,不过传入的是相对多边形原点的坐标(较少用)
- 使用
poly.limit(x, y) 即可得到 (x, y) 离边框最近的位置
返回值是一个长度为2的数组,下标
0、1分别是结果的
x、y
``
javascript
//步事件(Step Event)
if(!poly.contains(x, y)) { //判断是否在内部
var pos = poly.limit(x, y); //如果不在内部则得到限制结果
x = pos[0];
y = pos[1];
}
`
- 对多边形框内部进行遮罩
- 当你需要用到遮罩时,需要在对顶点进行更改之后
调用 poly.updateDivide()
来更新多边形的三角剖分
- 为了使用遮罩,你需要创建一个表面(Surface),一般和屏幕大小一致
为了方便描述,后文称该表面为 **surf**
- 调用 poly.replaceSurfaceAlpha(surf)
即可使用遮罩(如[示例1](oDemo1)):
`
javascript
//绘制事件(Draw Event)
if(!surface_exists(surf)) //当surf凭空消失时重新创建
surf = surface_create(/* 宽 */, /* 高 */);
surface_set_target(surf); //设置在surf上绘制
draw_clear_alpha(c_black, 0); //清空表面
/*
这里写想要被遮罩的东西
*/
surface_reset_target(); //设置在屏幕上绘制
poly.replaceSurfaceAlpha(surf); //使用遮罩
drawSurfaceStrokeColor(surf, 0, 0, c_white); //把遮罩结果和框画出来
`
- 多边形框旋转
- 调整 **poly.rot** 即可调整旋转角度(顺时针)
- 调整 **poly.rotSpeed** 即可调整旋转的速度
如 poly.rotSpeed = 3;` 就是让框每步旋转3度
已知缺点
- 当在拐角移动时,可能穿过拐角(不会出框,原本是要绕过去)
- 只能限制点(对于较小的物体实际上也可以当成一个点)
- 使用多个框时,如果两个框有两条边比较近,但是没有合并在一起
玩家移动时也有可能跨越这两个多边形