如何调整物体在2D运动场上移动的速度?

时间:2013-01-29 13:37:24

标签: java

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

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

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

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

当每个敌人每次移动1px时,这都有效。但我希望他们以不同的速度前进。我找到了2个解决方案:

  1. 将每个敌人移到另一个线程中。它的速度越高,Thread.sleep()持续时间越短。
  2. 以不同的距离循环移动它们。
  3. 我更喜欢2.解决方案,但不知道如何实现它。我的问题是,大多数人永远不会踩到田野的中心,因此永远不会改变方向。如果怪物以0.33的速度移动,则所覆盖的距离将为:0.33,0.66,0.99(...)39.63(...)40.13。所以它永远不会达到40.如果我会使用ceil,round或floor,那么它将达到40但是多次会导致我的应用程序中出现异常。所以我的问题是如何使用浮点值作为距离来实现移动,并提供每次检查时达到40的倍数,但每次检查只需一次?

2 个答案:

答案 0 :(得分:1)

你可以使用Pythagorus定理进行碰撞检测

Math.sqrt(Math.pow((monster.getX() - field.getX()), 2)
 + Math.pow((monster.getY() - field.getY()), 2)) <= field.getRadius()

答案 1 :(得分:0)

你可以为怪物提供新线程,并且在run方法中用它做你想做的事。

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

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

}