應該在java程序中的遊戲循環始終運行在事件派發線程中嗎? 由於我的鍵盤記錄器在AWT事件線程中運行,我希望鍵盤事件在與其餘遊戲相同的線程中處理,以避免基於線程的錯誤。 如果我不在事件線程中運行遊戲循環,我可以使用ArrayBlockingQueue將事件處理程序的事件發送到遊戲循環?有更好的解決方案嗎? 謝謝遊戲循環 - 線程
也許是這樣的?
ConcurrentLinkedQueue<AWTEvent> eventQueue = new ConcurrentLinkedQueue<AWTEvent>();
JFrame frame = new JFrame() {
@override
protected void processEvent(AWTEvent e) {
if(e instanceof InputEvent) eventQueue.add(e);
else super.processEvent(e);
}
}
//game loop
while(true) {
while(!eventQueue.isEmpty()) frame.super.processEvent(eventQueue.poll());
...
}
編輯:謝謝,我想我現在知道如何做到這一點。我會做這樣的
import java.util.concurrent.ConcurrentLinkedQueue;
import java.awt.AWTEvent;
import java.awt.Dimension;
import java.awt.event.*;
import javax.swing.*;
public class QueueTest {
static ConcurrentLinkedQueue<AWTEvent> eventQueue = new ConcurrentLinkedQueue<AWTEvent>();
public static void main(String[] args) {
final JPanel panel = new JPanel() {
@Override
protected void processEvent(AWTEvent e) {
eventQueue.add(e);
}
{
enableEvents( AWTEvent.MOUSE_EVENT_MASK
| AWTEvent.MOUSE_MOTION_EVENT_MASK
| AWTEvent.KEY_EVENT_MASK);
}
};
final JFrame frame = new JFrame();
frame.addComponentListener(new ComponentAdapter() {
@Override
public void componentShown(ComponentEvent e) {
panel.requestFocusInWindow();
}
});
frame.add(panel);
panel.setPreferredSize(new Dimension(800,600));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
while(true) {
while(!eventQueue.isEmpty()) System.out.println(eventQueue.poll()+"\n");
}
}
}
其實,我決定不告訴OP同樣的事情,因爲我沒有在遊戲編程方面的經驗。但我認爲可以肯定地說,他不能將「遊戲循環」放在事件隊列中,希望沒有人會與此爭論。 – arcy 2012-03-10 03:51:07