【问题标题】:How to tell if an object is within a distance of another?如何判断一个物体是否在另一个距离内?
【发布时间】:2016-05-22 10:26:20
【问题描述】:

我有一个角色对象和一个史莱姆对象。角色可以移动,史莱姆使用下面的代码移动到玩家身边。

(player_obj 是角色)

phy_position_x += sign(player_obj.x - x) * 0.2;
phy_position_y += sign(player_obj.y - y) * 0.2;

我怎样才能让史莱姆在所有距离都不会移动到角色身上?如何设置史莱姆开始向角色移动的半径?

是否有这样的 if 语句:

if slime_obj.x < 20 to player.obj.x and slime_obj.y < 20 to player_obj.y {}

【问题讨论】:

    标签: game-maker gml


    【解决方案1】:

    要做到这一点相当简单,您只需使用the distance formula 计算距离。您可以在 GML 中使用point_distance 函数。它看起来像这样:

    if (point_distance(x, y, obj_player.x, obj_player.y) < r) {
        //Move towards the player
    }
    

    其中“r”是您希望敌人跟随玩家进入的圆的半径。

    更多信息,可以看这里:http://docs.yoyogames.com/source/dadiospice/002_reference/maths/vector%20functions/point_distance.html

    不过,这计算起来相当昂贵(对于 CPU),因为它使用平方根函数。尽管对此的补救措施相当简单。您将编写以下脚本(我将其命名为 point_distance_squared,但您可以随意命名):

    ///point_distance_squared(x1, y1, x2, y2)
    var x1 = argument[0];
    var y1 = argument[1];
    var x2 = argument[2];
    var y2 = argument[3];
    return (pow(pow(x2, 2) - pow(x1, 2), 2) + pow(pow(y2, 2) - pow(y1, 2), 2));
    

    然后代码几乎相同,除了您需要将半径平方,它看起来像这样:

    if (point_distance_squared(x, y, obj_player.x, obj_player.y) < (r * r)) {
        //Mode towards the player
    }
    

    【讨论】:

    • 您的脚本使用曼哈顿距离而不是欧几里得距离,因此它会检测到正方形而不是圆形内的玩家。您应该先将 xy 增量平方,然后再将它们相加以获得平方欧几里得距离。
    • 谢谢。我总是犯这个错误。我已经对其进行了编辑以解决该问题。这也会引发错误,因为您必须将参数定义为局部变量。
    猜你喜欢
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    相关资源
    最近更新 更多