Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 游戏中的步速调节_Java_Math_Game Physics - Fatal编程技术网

Java 游戏中的步速调节

Java 游戏中的步速调节,java,math,game-physics,Java,Math,Game Physics,我正在开发一个游戏,我需要创建一个方法来创建一个动作。它需要做的是获取xy和targetxy值,并创建一个float[],其中的移动定义为特定时间。移动将在一定数量的帧内每帧使用一次,直到在特定时间内到达目标。这是我到目前为止所拥有的 public void calculateRoute(int time) { if(x > tx){ movement[0] = -((x - tx) / time); }else if(x < tx){

我正在开发一个游戏,我需要创建一个方法来创建一个动作。它需要做的是获取
xy
targetxy
值,并创建一个
float[]
,其中的移动定义为特定时间。移动将在一定数量的帧内每帧使用一次,直到在特定时间内到达目标。这是我到目前为止所拥有的

public void calculateRoute(int time) {
    if(x > tx){
        movement[0] = -((x - tx) / time);
    }else if(x < tx){
        movement[0] = ((tx - x) / time);
    }else if(x == tx){
        movement[0] = 0;
    }

    if(y > ty){
        movement[1] = -((y - ty) / time);
    }else if(y < ty){
        movement[1] = ((ty - y) / time);
    }else if(y == ty){
        movement[1] = 0;
    }
}
public void计算器输出(整数时间){
如果(x>tx){
移动[0]=-((x-tx)/时间);
}否则如果(xty){
运动[1]=-((y-ty)/时间;
}else if(y
问题是,距离目标越远,移动越快。我想让运动调节到一定的速度,但仍然达到它的目标。基本上,我需要计算
时间
变量,使其速度始终相同,无论距离如何。我尝试将移动设置为1,但它会错过目标,因为
x
可能是500,而
y
可能是700。它最终将是
x=700,y=700
。感谢您的帮助!:)


还有一些示例代码会很好

需要考虑的一些事情:

  • 在当今的多核、多任务计算机中,您无法可靠地预测每个渲染帧或每个逻辑/物理/AI更新之间将花费多少时间
  • 正如您在解决方案中发现的那样,速度计算是基于距离的,当它需要每单位时间移动一些单位时(可能是像素/秒,或块/秒-任何在游戏中有意义的度量单位)
  • 当你在你的世界里移动物体时,最好测量自上次移动物体以来经过的时间,然后将经过的时间乘以你的速度,因为
    speed*time=distance moved
  • 如果您使用的是游戏引擎,这将是一个非常好的主意,因为这是一个已解决的问题,它们将提供某种“delta”时间,告诉您自上次逻辑/物理/AI更新以来经过了多少时间。您可以使用该值

    • ,这是当今流行的游戏引擎
    • ,但这一概念在任何游戏/游戏引擎中都是相同的

    也许你所问的是:

    • a点a和点B之间的距离
    • 每一步的固定距离我们称之为
      stepSize
    您希望在
    浮点[]
    中有:

    移动
    距离所需的每一步一个元素,一次一个
    步长。因此:

    stepSize = speed / 60.0;   // 60 fps
    stepCount = distance / stepSize;
    
    然后是一个从0到步长计数-1的for循环,在每一步上移动步长距离


    我不知道在这种情况下,你需要一个float[]做什么。如果你的步幅大小不能平均分配你需要行驶的距离,并且在最后一步你有点超出了目标,那么在最后一步,只需将(x,y)设置为目标(x,y)

    时间并不重要。我只想用不同的斜边来计算运动。运动是像素/帧,我的游戏被调整为60帧,但是因为#1,你不能做像素/帧。你永远也得不到每秒60帧。若你们还并没有发现这一点,那个么你们最终会因为帧定时的细微变化而产生抖动。没有人能始终获得60.0 fps(每帧16.6ms)。您将获得抖动,如
    [16.5,13.0,20.2,16.4,…]
    等,其中您可能在1000毫秒内渲染总共60帧,但每帧之间的时间不一致。这是一个基本的、常见的但不正确的假设,“抖动”对我来说并不重要。我使用的是纳米计时器,帧之间的时间足够一致,因为我考虑了增量时间。纳米计时器不会消除抖动。抖动是由于无法知道代码何时实际执行造成的,因为它运行的线程是由操作系统调度的,而不是直接由您控制的。