昨天,我不能确定Metroid块爬行动物如何躲过障碍,
但我自己找到了一种粗糙的解决方法,它可能不优雅,但它发挥作用并且动态
obj_crawler
创建
CREATE:
IMAGE_SPEED = 1;
MOVE_SPEED = 0.2;
//跟踪一个可复用的周边周期环绕最接近的连接 crawler-block 集群。
ZOOMER_TILE_SIZE = Sprite\_GetWidth(spr_crawler_block);
ZOOMER_TILE_MAP = {};
ZOOMER_CLUSTER_TILES = [];
ZOOMER_PATH = [];
ZOOMER_PATH_POINTS = [];
ZOOMER_PATH_INDEX = 0;
ZOOMER_PATH_PROGRESS = 0;
//沿边缘角落走直角路径可以以光滑的方式改变方向时平滑。
ZOOMER_CORNER_INSERT = MAX(1, ROUND(ZOOMER_TILE_SIZE * 0.125)); // 短直角路径在外部边缘
ZOOMERInner_CORNER_INSERT = MAX(ZOOMER_CORNER_INSERT + 1, ROUND(ZOOMER_TILE_SIZE * 0.25)); //内部角线
ZOOMER_PATH_REVISION = -1;
ZOOMER\_BUILD_PATH();
**步骤**
/// 蜘蛛爬行移动
// 只有当爬行动物块的拓扑结构发生变化或活动路径变得无效时才重建四角路径。
var crawler_block_revision = 0;
if (变量\_全局\_存在("crawler\_block\_revision"))
{
crawler_block_revision = 全局.crawler_block_revision;
}
if (crawler_block_revision != ZOOMER_PATH_REVISION || Array\_Length(ZOOMER_PATH_POINTS) < 2)
{
if (!ZOOMER\_BUILD_PATH())
{
实例\_销毁();
退出;
}
}
var point_count = Array\_Length(ZOOMER_PATH_POINTS);
if (point_count < 2)
{
实例\_销毁();
退出;
}
var remaining_distance = MAX(0.05, MOVE_SPEED);
while (remaining_distance > 0)
{
var point_a = ZOOMER_PATH_POINTS[ZOOMER_PATH_INDEX];
var point_b = ZOOMER_PATH_POINTS[(ZOOMER_PATH_INDEX + 1) MOD point_count];
var segment_length = Point\_Distance(point_a.x, point_a.y, point_b.x, point_b.y);
if (segment_length <= 0.0001)
{
ZOOMER_PATH_PROGRESS = 0;
ZOOMER_PATH_INDEX = (ZOOMER_PATH_INDEX + 1) MOD point_count;
继续;
}
var segment_remaining = segment_length - ZOOMER_PATH_PROGRESS;
if (segment_remaining <= 0.0001)
{
ZOOMER_PATH_PROGRESS = 0;
ZOOMER_PATH_INDEX = (ZOOMER_PATH_INDEX + 1) MOD point_count;
继续;
}
var step_distance = min(remaining_distance, segment_remaining);
ZOOMER_PATH_PROGRESS += step_distance;
remaining_distance -= step_distance;
if (ZOOMER_PATH_PROGRESS >= segment_length - 0.0001)
{
ZOOMER_PATH_PROGRESS = 0;
ZOOMER_PATH_INDEX = (ZOOMER_PATH_INDEX + 1) MOD point_count;
}
}
如果(!ZOOMER\_APPLY_PATH_POSE())
{
如果(!ZOOMER\_BUILD_PATH() || !ZOOMER\_APPLY_PATH_POSE())
{
实例\_销毁();
}
}
**描绘**
Draw_Self();
如果(!变量实例\_存在(id, "show_line")) show_line = false;
如果(键盘检查按下(ord(" T "))) show_line = !show_line;
如果(show_line)
{
FOR(var path_index_local = 0; path_index_local < Array\_Length(ZOOMER_PATH_POINTS); path_index_local++)
{
var point_a = ZOOMER_PATH_POINTS[path_index_local];
var point_b = ZOOMER_PATH_POINTS[(path_index_local + 1) MOD array\_length(ZOOMER_PATH_POINTS)];
如果(path_index_local == ZOOMER_PATH_INDEX)
{
draw_set_color(c_orange);
draw_line_width(point_a.x, point_a.y, point_b.x, point_b.y, 3);
}
else
{
draw_set_color(c_lime);
draw_line_width(point_a.x, point_a.y, point_b.x, point_b.y, 1);
}
}
}
obj_crawler_block
创建
CREATE:
// 跟踪 crawlersBlock 的拓扑结构变化,以便面部爬行动物可以只在块组合发生变化时重建。
如果(!变量\_全局\_存在("crawler_block_revision"))
{
全局.crawler_block_revision = 0;
}
全局.crawler_block_revision += 1;
**销毁**
DESTROY:
// 跟踪 crawlersBlock 的拓扑结构变化,以便面部爬行动物可以只在块组合发生变化时重建。
如果(!变量\_全局\_存在("crawler_block_revision"))
{
全局.crawler_block_revision = 0;
}
全局.crawler_block_revision += 1;
**步骤**
// FOR DEBUG 你可以用鼠标点击销毁
如果(鼠标按下的按钮(mb_left))实例\_销毁();
sc_block_crawler
这是魔术发生的地方
//用一个稳定的索引格式查找tile
function zoomer_tile_key(_tile_x, _tile_y)
{
return string(_tile_x) + "," + string(_tile_y);
}
//跟踪每个tile 的周边面
function zoomer_face_key(_tile_x, _tile_y, _mode)
{
return string(_tile_x) + "," + string(_tile_y) + "," + string(_mode);
}
//检查两点是否相同
function zoomer_points_match(_point_a, _point_b)
{
return (_point_a.x == _point_b.x && _point_a.y == _point_b.y);
}
//以某个距离从一个点沿线段偏移
function zoomer_point_toward(_from_point, _to_point, _distance)
{
var dx = _to_point.x - _from_point.x;
var dy = _to_point.y - _from_point.y;
var segment_length = Point\_Distance(_from_point.x, _from_point.y, _to_point.x, _to_point.y);
如果 (segment_length <= 0.0001)
{
return { x: _from_point.x, y: _from_point.y };
}
var step_distance = min(_distance, segment_length * 0.5);
回复 {
x: _from_point.x + dx / segment_length * step_distance,
y: _from_point.y + dy / segment_length * step_distance
};
}
//获得某个tile 的某个角点的坐标
function zoomer_get_corner_point(_tile_x, _tile_y, _corner_index)
{
var tile_left = _tile_x * ZOOMER_TILE_SIZE;
var tile_top = _tile_y * ZOOMER_TILE_SIZE;
转 (_corner_index)
{
卡塞 0
评论 (0)