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

时间:2015-01-24 00:23:17

标签: javascript html5 game-engine

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

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 个答案:

答案 0 :(得分:1)

作为(在您的示例中),玩家每次移动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;
}

答案 1 :(得分:0)

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

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

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