java为游戏正确绑定密钥
当按下上、下、左、右键时,我试图上、下、左、右移动一个矩形。我很困惑,为什么游戏开始时,关键侦听器不再侦听..即gameloop启动时。在开始游戏或按下“开始”键之前,监听器会工作,即它会打印“上压”System.out.println(“上压”);但是当游戏通过点击开始按钮开始时,监听器就不再工作了。为什么会这样?谢谢你的帮助java为游戏正确绑定密钥,java,swing,game-engine,key-bindings,Java,Swing,Game Engine,Key Bindings,当按下上、下、左、右键时,我试图上、下、左、右移动一个矩形。我很困惑,为什么游戏开始时,关键侦听器不再侦听..即gameloop启动时。在开始游戏或按下“开始”键之前,监听器会工作,即它会打印“上压”System.out.println(“上压”);但是当游戏通过点击开始按钮开始时,监听器就不再工作了。为什么会这样?谢谢你的帮助 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Game
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class GameLoopTest extends JFrame implements ActionListener
{
private GamePanel gamePanel = new GamePanel();
private JButton startButton = new JButton("Start");
private JButton quitButton = new JButton("Quit");
private JButton pauseButton = new JButton("Pause");
private boolean running = false;
private boolean paused = false;
private int fps = 60;
private int frameCount = 0;
public GameLoopTest()
{
super("Fixed Timestep Game Loop Test");
Container cp = getContentPane();
cp.setLayout(new BorderLayout());
JPanel p = new JPanel();
p.setLayout(new GridLayout(1,2));
p.add(startButton);
p.add(pauseButton);
p.add(quitButton);
cp.add(gamePanel, BorderLayout.CENTER);
cp.add(p, BorderLayout.SOUTH);
setSize(1000, 700);
startButton.addActionListener(this);
quitButton.addActionListener(this);
pauseButton.addActionListener(this);
Action handle_up_action_pressed = new AbstractAction(){
public void actionPerformed(ActionEvent e){
gamePanel.up_pressed= true;
System.out.println("up pressed");
}
};
Action handle_up_action_released = new AbstractAction(){
public void actionPerformed(ActionEvent e){
gamePanel.up_pressed= false;
}
};
Action handle_down_action_pressed = new AbstractAction(){
public void actionPerformed(ActionEvent e){
gamePanel.down_pressed= true;
}
};
Action handle_down_action_released = new AbstractAction(){
public void actionPerformed(ActionEvent e){
gamePanel.down_pressed= false;
}
};
Action handle_left_action_pressed = new AbstractAction(){
public void actionPerformed(ActionEvent e){
gamePanel.left_pressed= true;
}
};
Action handle_left_action_released = new AbstractAction(){
public void actionPerformed(ActionEvent e){
gamePanel.left_pressed= false;
}
};
Action handle_right_action_pressed = new AbstractAction(){
public void actionPerformed(ActionEvent e){
gamePanel.right_pressed= true;
}
};
Action handle_right_action_released = new AbstractAction(){
public void actionPerformed(ActionEvent e){
gamePanel.right_pressed= false;
}
};
gamePanel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "handle_up_pressed");
gamePanel.getActionMap().put("handle_up_pressed", handle_up_action_pressed);
gamePanel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, true), "handle_up_released");
gamePanel.getActionMap().put("handle_up_released", handle_up_action_released);
gamePanel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, false), "handle_down_pressed");
gamePanel.getActionMap().put("handle_down_pressed", handle_down_action_pressed);
gamePanel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, true), "handle_down_released");
gamePanel.getActionMap().put("handle_down_released", handle_down_action_released);
gamePanel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, false), "handle_left_pressed");
gamePanel.getActionMap().put("handle_left_pressed", handle_left_action_pressed);
gamePanel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, true), "handle_left_released");
gamePanel.getActionMap().put("handle_left_released", handle_left_action_released);
gamePanel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false), "handle_right_pressed");
gamePanel.getActionMap().put("handle_right_pressed", handle_right_action_pressed);
gamePanel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, true), "handle_right_released");
gamePanel.getActionMap().put("handle_right_released", handle_right_action_released);
}
public static void main(String[] args)
{
GameLoopTest glt = new GameLoopTest();
glt.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
Object s = e.getSource();
if (s == startButton)
{
running = !running;
if (running)
{
startButton.setText("Stop");
runGameLoop();
}
else
{
startButton.setText("Start");
}
}
else if (s == pauseButton)
{
paused = !paused;
if (paused)
{
pauseButton.setText("Unpause");
}
else
{
pauseButton.setText("Pause");
}
}
else if (s == quitButton)
{
System.exit(0);
}
}
//Starts a new thread and runs the game loop in it.
public void runGameLoop()
{
Thread loop = new Thread()
{
public void run()
{
gameLoop();
}
};
loop.start();
}
您正在侦听器上运行游戏,因此在游戏停止运行之前不会处理更多事件,并将焦点设置为JPanel,例如InputMap inMap=getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);谢谢mKorbel!JComponent.WHEN_IN_FOCUSED_WINDOW解决了这个问题。但是,为什么?默认的焦点设置是什么?@Darkhogg在监听器上运行游戏是什么意思?你能澄清一下吗?