我正在用Java slick编写游戏,并且想添加消息管理。应该有一个ArrayList,其中包含所有尚未发送的消息。每2秒应显示列表中的下一项。
我的逻辑:
在更新方法中,应该显示第一条消息。 2秒钟后,该项目将被删除。
我的问题是仅显示第一个,而其他则不显示。当我进行调试时,我注意到在这2秒钟之后,计时器会继续删除第一项,而不会中断2秒钟。
请您能帮我找到问题或更好的逻辑。
这是我的一些编码。
Mothode将消息放入队列
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”,因此您可以有效地连续创建新的TimerTasks。尝试移动“ 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