检查值是否在某个数字的范围内

Check if value is within range of a certain number

本文关键字:数字 范围内 是否 检查      更新时间:2023-09-26

我正在做一个游戏,玩家通过点击地图上的一个点来移动。然后,我使用一个函数来计算到点击点的角度,从而将它们发送到该点击点的轨迹上。

var angle = player.angleToPoint(new me.Vector2d(e.gameX, e.gameY));
player.vel.set(Math.cos(angle) * 2, -Math.sin(angle) * 2);

这行得通。

问题是,我希望玩家在到达该点击点后停止移动并更改为"站立"动画。点击点和播放器的位置以小数形式给出:

log(clickPointX + " , " + clickPointY + ", " +

player.x + ", " + player.y) 给出:

2491.830945558739 , 627.4212034383954, 4894.160772981247, 813.5879189245883

在我的更新函数中,我想检查它是否相等,但速度增量大小永远不会允许它相等。如果我检查 <= 或>=,

    if (player.x == clickPointX && player.y == clickPointY) {
        player.vel.x = 0;
        player.vel.y = 0;
        player.setCurrentAnimation("stand");        
    }
    else {
        if (!player.isCurrentAnimation("walk")) {
            player.setCurrentAnimation("walk");
        }           
    }

这似乎行不通。有没有更好的方法来检查玩家是否已到达点击点位置?也许检查玩家的位置是否在点击位置的范围内?

当(在您的示例中)玩家一次移动 2 个像素时,您可以检查播放器是否在目标的 2 个像素范围内。如果精度对您很重要,那么您可能需要添加一些内容,以便玩家在下一步中移动到确切的像素位置(尽管由于浮点数的存储和操作方式,坐标仍然不太可能完全相同,而只是与最接近的整数相同)。

var xdist = player.x - clickPointx, 
    ydist = player.y - clickPointy,
    sqDist = xdist * xdist + ydist * ydist;
if (sqDist >= .25 && sqDist < 4) { // close but not quite there
    player.vel.x = -xdist;       // cover the remaining distance in the next step
    player.vel.y = -ydist;
} else if (sqDist < .25) {         // close enough to stop
    player.vel.x = 0;
    player.vel.y = 0;
}

或者,使用 parseInt 检查整数坐标是否相同。

if (parseInt(player.x, 10) == parseInt(clickPointx, 10) 
    && parseInt(player.y, 10) == parseInt(clickPointy, 10)) {
    player.vel.x = 0;
    player.vel.y = 0;
} else if(Math.pow(player.x - clickPointx, 2) 
          + Math.pow(player.y - clickPointy, 2) < 4) {
    player.vel.x = clickPointx - player.x;
    player.vel.y = clickPointy - player.y;
}

您的玩家几乎永远不会准确地降落在点击点上,所以我会检查玩家 X 和点击 X 之间的差异,以及玩家 Y 和点击 Y 之间的差异是否都小于玩家移动的速度。因此,如果它是 X += 5 和 Y += 10,那么这些是您应该在邻近检查中使用的值。

当玩家在范围内时,您可以选择将他调整到点击点的确切位置,除非这对您的游戏无关紧要。

考虑将所有值包装在parseInt(val, 10)中。如果您在 HTML5 画布上绘图,十进制值可能会触发消除锯齿并导致图像模糊,这可能不是您想要的。