【问题标题】:Java: Enemy follow PlayerJava:敌人跟随玩家
【发布时间】:2014-08-04 22:26:02
【问题描述】:

我有一个敌人和一个玩家。我想要做的是让我的敌人在我的玩家移动时不断地跟随他。我有这样做的代码,但是地精的速度会根据我的角色相对于敌人的位置而有所不同:例如,当我在敌人的左侧(敌人的负面)上时,它会移动超级快并且在我的播放器中。然而,当我在右下角(敌人的正面)时,一切都很好。有什么想法吗?

这是我的敌人更新功能中的内容:

        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;

编辑:

        //x is the enemies (this x) and the same for y


        int MoveToX = Board.playerOne.getX();
        int MoveToY = Board.playerOne.getY();

        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);

我的新算法是这样的。但是我遇到了同样的问题,那就是我的敌人移动得和我一样快,而它对玩家不利。

【问题讨论】:

  • 你有这些非常方便的amountToMoveXamountToMoveY 变量。也许你可以启动你的调试器,看看它们的值是什么。您还应该检查其他相关变量的值。很可能其中一个不是你所期望的
  • 我认为这与类型转换有关。尝试使用 double 而不是 float 并有两个变量:deltaX 和 deltaY 而不是 (MoveToX - x) 和 (MoveToY - y)。
  • 请报告您使用的所有变量的类型。
  • 仅供参考,您可以将 Math.sqrt(Math.pow(MoveToX - x, 2) + Math.pow(MoveToY - y, 2)); 缩短为 Math.hypot(MoveToX - x, MoveToY - y),尽管这不会改变/解决您的问题。

标签: java


【解决方案1】:
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);

diffXdiffY 是从敌人到玩家的向量的分量。这样,您可以通过取矢量分量的反正切来计算角度。 Math.cos(angle) 是距离向量 <diffX, diffY>-> (cos^2(x) + sin^2(x) = 1) 的归一化 x 分量,乘以 speed 可以得出敌人在 x 方向上移动的速度。同样的规则适用于yMath.sin(angle)

【讨论】:

  • 我尝试了你上面的建议,但我仍然遇到上面解释的问题:当我对敌人不利时,它的移动速度与玩家一样快。
  • moveToX、x、moveToY、y的单位是什么?他们应该是ints 吗?
  • 据我所知,我认为它们不必是整数。它们只需要图形可读即可。是的,它们是整数,但我可以将它们更改为浮点数。
  • 我将它们更改为浮点数,但我仍然遇到同样的问题。
  • 我会调试程序,看看到底发生了什么。如果正确实施,此代码将起作用。我在我的另一个游戏中使用了完全相同的技术。如果x^2+y^2 不等于speed 的平方,那么你就有问题了。
猜你喜欢
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 2013-12-01
相关资源
最近更新 更多