0

我正在编写一个塔防游戏,我的主要组件是一个划分为 40x40 字段(类字段的对象)的网格。当游戏开始时,会为每个生成物(这是一种特殊类型的字段)找到通往最近基地的最佳路线,并将其保存在其字段中int[] path,该字段表示怪物必须遵循的一系列方向才能到达基地。

我创建了一个线程,该线程有一个循环,它将每个怪物向前移动 1px 并distance在每次传递中增加它的字段。每次怪物移动时,我也会检查它是否没有踩到场地的中心。我这样做使用:

if ((monster.getDistance() % FIELD_SIZE /*which is 40*/) == 0)

当它返回 0 时,怪物会改变它的方向(读取从其生成字段路径到达的下一个字段的位置)。

这适用于每个敌人每次移动 1px 的情况。但我希望他们以不同的速度移动。我找到了2个解决方案:

  1. 在不同的线程中移动每个敌人。它的速度越高,Thread.sleep() 的持续时间就越短。
  2. 以不同的距离将它们循环移动。

我更喜欢 2. 解决方案,但不知道如何实现它。我的问题是大多数怪物永远不会踩到场地的中心,因此永远不会改变方向。如果怪物以 0.33 的速度移动,则覆盖的距离将是:0.33、0.66、0.99 (...) 39.63 (...) 40.13。所以它永远不会达到 40。如果我使用 ceil、round 或 floor,那么它将达到 40,但多次会导致我的应用程序出现异常。所以我的问题是如何实现以浮点值作为距离的移动,并提供它每次都达到 40 的倍数但每次检查一次?

4

2 回答 2

1

您可以使用毕达哥拉斯定理进行碰撞检测

Math.sqrt(Math.pow((monster.getX() - field.getX()), 2)
 + Math.pow((monster.getY() - field.getY()), 2)) <= field.getRadius()
于 2013-01-29T13:52:51.790 回答
0

您可以将新线程喂给怪物,然后在 run 方法中做您想做的事情。

public class MoveThread extends Thread{
private Monster myMonster;
public MoveThread(Monster m){
myMonster = m;
}

public void run(){
//do your stuff here
}

}
于 2013-01-29T13:45:45.837 回答