gpt4 book ai didi

Java 光滑;延迟后运行命令而不循环;

转载 作者:太空宇宙 更新时间:2023-11-04 11:45:07 27 4
gpt4 key购买 nike

我正在用 Java slick 编写游戏,我想添加消息管理。应该有一个 ArrayList,其中包含所有尚未发送的消息。每 2 秒应显示列表中的下一项。

我的逻辑:

在更新方法中,应显示第一条消息。 2 秒后该项目将被删除。

我的问题是仅显示第一个,而其他则不显示。当我调试时,我注意到在这 2 秒之后,计时器继续删除第一个项目,没有 2 秒的中断。

请你帮我找出问题所在或者更好的逻辑。

这是我的一些编码。

将消息放入队列的方法

public static void showMessage(String message){
msgHandler.addMessage(message);
}

渲染方法

public void render(GameContainer gameContainer, Graphics g) throws SlickException {
msgHandler.getCurrentMessage().displayMessage(g);
if(msgHandler.isTimerCompleted()){
msgHandler.next();
}
}

消息管理器类

public class MessageHandler {
private ArrayList<Message> messages;
private int duration = 2000;
private Timer timer = new Timer();
private boolean isTimerCompleted = true;

public MessageHandler() {
messages = new ArrayList<>();
}

public void next() {

isTimerCompleted = false;
timer.schedule(new TimerTask() {
@Override
public void run() {
if (messages.size() > 0) {
messages.remove(0);
}
System.out.println("test");
}
}, duration);
isTimerCompleted = true;
}

public Message getCurrentMessage() {
if (messages.size() > 0)
return messages.get(0);
return new Message("");
}

public void addMessage(String message, int x, int y) {
messages.add(new Message(message, x, y));
}

public void addMessage(String message) {
messages.add(new Message(message));
}
}

最佳答案

您似乎想使用一个循环计时器,如下例所示。此外,timer.schedule 在计时器结束之前不会暂停执行,相反,当时间限制到达时,计时器的 run() 部分就会被执行。目前,isTimerCompleted = true;将在您创建计时器后立即执行。

timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// Your database code here
}
}, 2*60*1000, 2*60*1000);

这里有一个很好的概述: https://stackoverflow.com/a/4044793/1320066

编辑:

更清楚地说,“isTimerCompleted = true”在创建计时器任务后立即执行,因此您可以有效地不断创建新的计时器任务。尝试移动“isTimerCompleted = true;”到“public void run() { .. }”代码块内部。

有关所发生情况的示例,请尝试运行这段简单的代码来查看语句的执行顺序:

import java.util.TimerTask;
import java.util.Timer;

public class TimerSchedule {

public Timer timer = new Timer();

public void TestTimerSchedule() {
System.out.println("Before timer.schedule");
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("TimerTask");
}
}, 2000);

System.out.println("After timer.schedule");
}

}

输出:

Before timer.schedule
After timer.schedule
TimerTask

关于Java 光滑;延迟后运行命令而不循环;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42426451/

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