gpt4 book ai didi

java - java JOGL 中减慢对象移动

转载 作者:行者123 更新时间:2023-12-01 12:00:13 25 4
gpt4 key购买 nike

使用 Thread.sleep(milliseconds) 会将整个程序的执行延迟指定的毫秒。我的问题是如何在我的 java 代码中减慢(而不是延迟)从一个容器到另一个容器的对象移动(使用 JOGL - 从 Canvas 上下文实现),以便使移动明显,否则会发生得如此之快?

这是我解决这个问题的方法:

我使用Stack来表示每个容器上的对象数量。每当用户单击任一容器[source]时,容器Stack就会被弹出,直到它为空。同时将推送目标容器的Stack。对于每次迭代,都会重新绘制容器,其中包含由其相应的 Stack 大小表示的对象。

与此问题相关的代码的一部分:

public void moveObjects(Container source, Container destination) {
while (!source.stack.isEmpty()) {
destination.stack.push(destination.stack.size() + 1);
source.stack.pop();
//redraw both containers with their new amount of objects represnted using their stack size
}
}

public void moveObject(int source, int dest) {
while (!this.container[source].stack.isEmpty()) {
this.container[dest].stack.push(this.container[dest].stack.size() + 1);
this.container[source].stack.pop();
try {
Thread.sleep(100);
} catch (InterruptedException ie) {
// Handle exception here
}
}
}

我只能将物体从源头一一移动到目的地,但移动速度太快,肉眼无法察觉。我该如何解决这个问题?

最佳答案

如果我理解正确的话,您希望在屏幕上明显地移动多个对象,而不是瞬间发生这种情况。

正如您所注意到的,Thread.sleep(time) 是一个坏主意,因为它会卡住整个应用程序。

解决这个问题的方法是为您的更新逻辑提供耗时:

long lastTime = System.nanoTime();
while(running)
{
long now = System.nanoTime();
updateLogic(now-lastTime); //this handles your application updates
lastTime = now;
}

void updateLogic(long delta)
{
...
long movementTimespan +=delta
if(movementTimespan >= theTimeAfterWhichObjectsMove)
{
//move objects here
//...
movementTimespan -= theTimeAfterWhichObjectsMove;
}

//alternatively you could calculate how far the objects have moved directly from the delta to get a smooth animation instead of a jump
//e.g. if I want to move 300 units in 2s and delta is x I have to move y units now

}

这允许您跟踪自上次更新/帧以来的时间,如果您将其用于动画,它会使对象移动的速度独立于执行系统的速度。

关于java - java JOGL 中减慢对象移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28033324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com