相信很多朋友在刚开始处理碰撞时都遇到过一些奇奇怪怪的卡墙问题,Pixelated Pope 分享了一个自用的脚本,工作原理如下图,会自动寻找周围空着的位置然后挪过去,循环处理时会优先落在相对左上的位置

脚本也很简单,只需要在需要处理碰撞的对象 step 事件中调用该方法即可,参数是需要判断的碰撞对象和判断精度(像素)
///@func
function gtfo(_obj, _precision = 1){
_precision = max(_precision, 1);
if(!place_meeting(x,y,_obj)) return;
var _range = _precision;
var _startX = x;
var _startY = y;
while(true) {
for(var _x = -_range; _x <= _range; _x += _precision) {
for(var _y = -_range; _y <= _range; _y += _precision) {
if(_x > _range && _y > _range && _x < _range && _y < _range) continue;
x = _startX + _x;
y = _startY + _y;
if(!place_meeting(x,y,_obj)) {
show_debug_message("Got the F out after " + string(_range / _precision) + " cycles");
return;
}
}
}
_range += _precision
}
}