Max*_*sle 1 java swing keylistener key-bindings java-canvas
我正在编写一个类似炸弹人的游戏,但我的 KeyListener 有问题。
\n\n问题是,当游戏运行时,KeyListener 不会响应,但是当它不运行时,它会执行我告诉他的操作。
\n\n这是我的代码
\n\npublic class direction extends Canvas implements KeyListener {\n\nstatic float bmx = 35;\nstatic float bmy = 35;\nstatic float v = 0.03f;\n\npublic static BufferStrategy strategie;\npublic static BufferedImage image;\n\npublic direction() { //pas s\xc3\xbbr de ce que \xc3\xa7a fait\n GraphicsEnvironment ge = //on m\'a dit de le mettre \n GraphicsEnvironment.getLocalGraphicsEnvironment(); //le programme marche tr\xc3\xa8s bien sans\n GraphicsDevice gd = ge.getDefaultScreenDevice();\n GraphicsConfiguration gc = gd.getDefaultConfiguration();\n image = gc.createCompatibleImage(700, 700);\n setSize(700, 700);\n\n}\n\n static boolean gauche;\n static boolean droite;\n static boolean haut;\n static boolean bas;\n\n\n public void keyPressed(KeyEvent e) {\n\n if (e.getKeyCode() == KeyEvent.VK_LEFT) {\n gauche = true;\n }\n if (e.getKeyCode() == KeyEvent.VK_RIGHT) {\n droite = true;\n System.out.println("lal");\n }\n if (e.getKeyCode() == KeyEvent.VK_DOWN) {\n bas = true;\n }\n if (e.getKeyCode() == KeyEvent.VK_UP) {\n haut = true;\n }\n }\n public void keyReleased(KeyEvent e) {\n if (e.getKeyCode() == KeyEvent.VK_LEFT) {\n gauche = false;\n }\n if (e.getKeyCode() == KeyEvent.VK_RIGHT) {\n droite = false;\n }\n if (e.getKeyCode() == KeyEvent.VK_DOWN) {\n bas = false;\n }\n if (e.getKeyCode() == KeyEvent.VK_UP) {\n haut = false;\n }\n }\n public void keyTyped(KeyEvent e) {\n }\n\n\npublic static void draw(){\n\n Graphics2D g = (Graphics2D) strategie.getDrawGraphics();\n\n for(int ligne= 0 ; ligne < board.gridHauteur; ligne++){\n for(int colonne= 0 ; colonne < board.gridLargeur ; colonne++){\n\n switch (board.plateau1[ligne][colonne]) {\n case 0 : g.setColor(Color.lightGray);\n g.fillRect( 30*ligne, 30*colonne , 30, 30);\n break;\n case 1 : g.setColor(Color.black); //dessine et donne la propri\xc3\xa9t\xc3\xa9 \'BLOCKED\' \xc3\xa0 certains bloques\n g.fillRect( 30*ligne, 30*colonne , 30, 30);\n board.plateau1[ligne][colonne] = board.BLOCKED;\n break;\n case 2 : g.setColor(Color.darkGray);\n g.fillRect( 30*ligne, 30*colonne , 30, 30);\n board.plateau1[ligne][colonne] = board.BLOCKED;\n break;\n }\n }\n }\n g.setColor(Color.red);\n g.fillRect((int)bmx, (int)bmy, 20, 20); //dessine le "joueur"\n strategie.show();\n}\n\npublic static void run() {\n\n long dernierTempsLoop = System.currentTimeMillis(); // avec cette ligne, nous demandons un t0\n\n while(true) {\n\n long delta = (System.currentTimeMillis() - dernierTempsLoop); // puis, \xc3\xa0 chaque nouvel boucle\n dernierTempsLoop = System.currentTimeMillis(); //nous calculons le temps que la \n //boucle \xc3\xa0 mise pour s\'effectuer\n\n for (int i=0;i<delta / 5;i++) {\n logic(5); //permet d\'appeler \xc3\xa0 ce qu\'il y ait peu de mouvements si la boucle est rapide\n } // et plus de mouvements si elle est plus lente ce qui garantit une vitesse constante\n // quelle que soit le temps que la boucle met pour s\'effectuer\n if ((delta % 5) != 0) {\n logic(delta % 5);\n }\n\n draw(); //dessine le terrain et le rectangle\n\n try { Thread.sleep(10); } catch (Exception e) {}; //permet au programme de ne pas "surchauffer"\n }\nRun Code Online (Sandbox Code Playgroud)\n\n}\n}
\n\n然后
\n\npublic board()\n{\n super("Bomberman");\n setSize(fenLargeur,fenHauteur);\n g = new direction();\n g.setFocusable(true);\n\n setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\n getContentPane().setBackground(Color.BLACK);\n\n JPanel content = new JPanel();\n content.setLayout(new BorderLayout());\n content.add(g, BorderLayout.CENTER);\n g.addKeyListener(g); // <=== c\'est CA qui me pose probl\xc3\xa8me\n setContentPane(content);\n setVisible(true);\n\n\n g.createBufferStrategy(2);\n Bm.direction.strategie = g.getBufferStrategy();\n\n}`\nRun Code Online (Sandbox Code Playgroud)\n\n和...
\n\ndispose();\n board b = new board();\n b.g.createBufferStrategy(2);\n direction.strategie = b.g.getBufferStrategy();\n\n direction.run();\nRun Code Online (Sandbox Code Playgroud)\n\n我希望我能理解,并感谢您的阅读。
\n我认为你的问题可能是在绘制完你可能需要做的所有事情之后:
g.setFocusable(true);
g.requestFocusInWindow();
Run Code Online (Sandbox Code Playgroud)
不仅 :
g.setFocusable(true);
Run Code Online (Sandbox Code Playgroud)