Java 爪哇:敌人跟随玩家
我有一个敌人和一个球员。我要做的是让我的敌人在我的玩家移动时不断地跟随他。我有这样做的代码,但地精的速度是不同的,这取决于我的角色相对于敌人的位置:例如,当我站在敌人的左边,敌人的反面时,它移动得非常快,并且在我的玩家中。然而,当我情绪低落,面对敌人时,一切都很好。有什么想法吗 以下是我的敌人更新功能:Java 爪哇:敌人跟随玩家,java,Java,我有一个敌人和一个球员。我要做的是让我的敌人在我的玩家移动时不断地跟随他。我有这样做的代码,但地精的速度是不同的,这取决于我的角色相对于敌人的位置:例如,当我站在敌人的左边,敌人的反面时,它移动得非常快,并且在我的玩家中。然而,当我情绪低落,面对敌人时,一切都很好。有什么想法吗 以下是我的敌人更新功能: MoveToX = Board.playerOne.getX(); MoveToY = Board.playerOne.getY(); floa
MoveToX = Board.playerOne.getX();
MoveToY = Board.playerOne.getY();
float distance = (float) Math.sqrt(Math.pow(MoveToX - x, 2) + Math.pow(MoveToY - y, 2));
amountToMoveX = (((MoveToX - x) / distance) * speed);
amountToMoveY = (((MoveToY - y) / distance) * speed);
x+= amountToMoveX;
y += amountToMoveY;
编辑:
我的新算法是这样的。然而我也遇到了同样的问题,那就是我的敌人移动得和我一样快,而这对球员来说是负面的
int diffX = moveToX - x;
int diffY = moveToY - y;
float angle = (float)Math.atan2(diffY, diffX);
x += speed * Math.cos(angle);
y += speed * Math.sin(angle);
diffX和diffY是从敌人到玩家的向量的组成部分。这样,可以通过取向量分量的反正切来计算角度。Math.cosangle是距离向量的标准化x分量->cos^2x+sin^2x=1,将其乘以速度,即可得出敌人在x方向移动的速度。同样的规则也适用于y和Math.sinangle。您有这些非常方便的amountToMoveX和amounttomovy变量。也许你可以启动调试器,看看它们的值是什么。您还应该检查其他相关变量的值。很可能其中一个不是你所期望的,而是你认为它与类型铸造有关。尝试使用double而不是float,并有两个变量:deltaX和deltaY而不是MoveToX-x和MoveToY-y。请报告您使用的所有变量的类型。仅供参考,您可以缩短Math.sqrtMath.powMoveToX-x,2+Math.powMoveToY-y,2;对数学来说,moveToX-x,MoveToY-y,虽然这不会改变/解决你的问题。我尝试了你上面的建议,但我仍然得到了我上面解释的问题:当我对敌人不利时,它的移动速度和玩家一样快。moveToX,x,MoveToY和y的单位是什么?它们应该是整数吗?据我所知,我认为它们不一定是整数。它们只需要通过图形可读即可。是的,它们是整数,但我可以将它们更改为浮点数。我将它们更改为浮点数,但仍然会遇到相同的问题。我会调试程序以查看到底发生了什么。如果实现正确,此代码可以工作。我在我的另一个游戏中使用了完全相同的技术。如果x^2+y^2不等于速度的平方,则存在问题。
int diffX = moveToX - x;
int diffY = moveToY - y;
float angle = (float)Math.atan2(diffY, diffX);
x += speed * Math.cos(angle);
y += speed * Math.sin(angle);