我正在制作游戏,玩家通过点击地图上的某个点来移动。然后,我使用一个函数来计算点击点的角度,该点将轨迹发送到该点击点。
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");
}
}
这似乎不起作用。有没有更好的方法来检查玩家是否已到达点击位置?也许检查玩家的位置是否在点击位置的范围内?
答案 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画布,十进制值可能会触发消除锯齿并导致图像模糊,这可能不是您想要的。