Java 如何调整在二维运动场上移动的对象的速度?

Java 如何调整在二维运动场上移动的对象的速度?,java,Java,我正在写一个塔防游戏,我的主要组件是一个划分为40x40个字段的网格(类字段的一个对象)。当游戏开始时,会为每个产卵(这是一种特殊类型的场)找到最接近基地的路径,并保存在其场int[]path,该场代表怪物到达基地必须遵循的一系列方向 我已经创建了一个线程,它有一个循环,可以将每个怪物向前移动1px,并在每次传递中增加其场距离。每次怪物移动时,我也会检查它是否没有踩到场地的中心。我使用以下方法进行操作: if ((monster.getDistance() % FIELD_SIZE /*whic

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

我已经创建了一个线程,它有一个循环,可以将每个怪物向前移动1px,并在每次传递中增加其场距离。每次怪物移动时,我也会检查它是否没有踩到场地的中心。我使用以下方法进行操作:

if ((monster.getDistance() % FIELD_SIZE /*which is 40*/) == 0)
当它返回0时,怪物改变其方向(读取从其繁殖场路径到达的下一个场的位置)

当每个敌人每次移动1px时,此功能有效。但我希望它们以不同的速度移动。我找到了两种解决方案:

  • 用不同的思路移动每个敌人。它的速度越高,线程的持续时间就越短
  • 以不同的距离循环移动它们

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

    您可以向新线程提供monster,并在run方法中对其执行所需操作

    public class MoveThread extends Thread{
    private Monster myMonster;
    public MoveThread(Monster m){
    myMonster = m;
    }
    
    public void run(){
    //do your stuff here
    }
    
    }
    

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

    Math.sqrt(Math.pow((monster.getX() - field.getX()), 2)
     + Math.pow((monster.getY() - field.getY()), 2)) <= field.getRadius()
    
    Math.sqrt(Math.pow((monster.getX()-field.getX()),2)
    
    +Math.pow((monster.getY()-field.getY()),2))AFAIU(这是“不多”)我会检查距离是否在39.5和40.5之间(例如),如果在39.5和40.5之间,则确定这是..限制。我需要找到一种方法,提供无论敌人的速度如何,它都将始终移动到40值,并且只移动一次。为了更快地获得更好的帮助,我不知道是否需要任何代码,因为我的问题与一些技术问题不符。这更像是一道数学题。我能解释我的问题的最短时间就是找到一种方法,不管敌人的速度如何,它的距离总是以40倍的值移动。因此,它可能移动0.33,但必须踩在40、80、120等位置。