From 7d3533fc59fdb32d5fce08a49e396cb8ed9500f0 Mon Sep 17 00:00:00 2001 From: Augier Yoann <yoann.augier@etu.univ-amu.fr> Date: Mon, 13 Nov 2023 14:07:56 +0100 Subject: [PATCH] Correction fonctionnement des keylistenner pour MacOS, Linux et Windows --- src/main/java/engine/Kernel.java | 113 ++++++++++++++++++++------- src/main/java/pong/PongApp.java | 8 +- src/main/java/sprint2_demo/Grid.java | 2 +- 3 files changed, 91 insertions(+), 32 deletions(-) diff --git a/src/main/java/engine/Kernel.java b/src/main/java/engine/Kernel.java index 0426885..b5c0922 100644 --- a/src/main/java/engine/Kernel.java +++ b/src/main/java/engine/Kernel.java @@ -10,6 +10,7 @@ import pong.PongObject; import pong.PongRacket; import javax.swing.*; +import java.awt.event.ActionEvent; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -42,12 +43,12 @@ public class Kernel { pongObjectEntityHashMap = physicEngine.pongObjectEntityHashMap; this.update(); - this.setKeysListeners((JPanel) this.graphicEngine.getContentPane()); + this.setKeysAndKeyReleasedListeners((JPanel) this.graphicEngine.getContentPane()); } /** * Start the game. Associate a Movable to each GameObject and draw them. - * + * * @throws IOException */ public void start() throws IOException { @@ -78,34 +79,92 @@ public class Kernel { /** * Listen to keyboard events. */ - public void setKeysListeners(JPanel mainPanel) { - mainPanel.addKeyListener(new java.awt.event.KeyAdapter() { - public void keyPressed(java.awt.event.KeyEvent evt) { - switch (evt.getKeyCode()) { - case java.awt.event.KeyEvent.VK_UP -> { - physicEngine.pongObjectEntityHashMap.get(gameObjects.get(0)).setSpeed(new Coordinates2D(0, -3)); } - case java.awt.event.KeyEvent.VK_DOWN -> { - pongObjectEntityHashMap.get(gameObjects.get(0)).setSpeed(new Coordinates2D(0, 3)); - } - case java.awt.event.KeyEvent.VK_Z -> { - pongObjectEntityHashMap.get(gameObjects.get(1)).setSpeed(new Coordinates2D(0, -3)); } - case java.awt.event.KeyEvent.VK_S -> { - pongObjectEntityHashMap.get(gameObjects.get(1)).setSpeed(new Coordinates2D(0, 3)); - } - } + public void setKeysAndKeyReleasedListeners(JPanel mainPanel) { + InputMap inputMap = mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); + ActionMap actionMap = mainPanel.getActionMap(); + + // Définir les actions pour les touches de pression + Action upAction = new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + physicEngine.pongObjectEntityHashMap.get(gameObjects.get(0)).setSpeed(new Coordinates2D(0, -3)); } + }; - public void keyReleased(java.awt.event.KeyEvent evt) { - switch (evt.getKeyCode()) { - case java.awt.event.KeyEvent.VK_UP, java.awt.event.KeyEvent.VK_DOWN -> { - pongObjectEntityHashMap.get(gameObjects.get(0)).setSpeed(new Coordinates2D(0, 0)); - } - case java.awt.event.KeyEvent.VK_Z, java.awt.event.KeyEvent.VK_S -> { - pongObjectEntityHashMap.get(gameObjects.get(1)).setSpeed(new Coordinates2D(0, 0)); - } - } + Action downAction = new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + physicEngine.pongObjectEntityHashMap.get(gameObjects.get(0)).setSpeed(new Coordinates2D(0, 3)); } - }); + }; + + Action zAction = new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + physicEngine.pongObjectEntityHashMap.get(gameObjects.get(1)).setSpeed(new Coordinates2D(0, -3)); + } + }; + + Action sAction = new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + physicEngine.pongObjectEntityHashMap.get(gameObjects.get(1)).setSpeed(new Coordinates2D(0, 3)); + } + }; + + // Mapper les touches de pression aux actions + inputMap.put(KeyStroke.getKeyStroke("UP"), "upAction"); + inputMap.put(KeyStroke.getKeyStroke("DOWN"), "downAction"); + inputMap.put(KeyStroke.getKeyStroke("pressed Z"), "zAction"); + inputMap.put(KeyStroke.getKeyStroke("pressed S"), "sAction"); + + // Mapper les actions aux méthodes correspondantes + actionMap.put("upAction", upAction); + actionMap.put("downAction", downAction); + actionMap.put("zAction", zAction); + actionMap.put("sAction", sAction); + + // Définir les actions pour les touches de relâchement + Action upReleaseAction = new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + physicEngine.pongObjectEntityHashMap.get(gameObjects.get(0)).setSpeed(new Coordinates2D(0, 0)); + } + }; + + Action downReleaseAction = new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + physicEngine.pongObjectEntityHashMap.get(gameObjects.get(0)).setSpeed(new Coordinates2D(0, 0)); + } + }; + + Action zReleaseAction = new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + physicEngine.pongObjectEntityHashMap.get(gameObjects.get(1)).setSpeed(new Coordinates2D(0, 0)); + } + }; + + Action sReleaseAction = new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + physicEngine.pongObjectEntityHashMap.get(gameObjects.get(1)).setSpeed(new Coordinates2D(0, 0)); + } + }; + + // Mapper les touches de relâchement aux actions + inputMap.put(KeyStroke.getKeyStroke("released UP"), "upReleaseAction"); + inputMap.put(KeyStroke.getKeyStroke("released DOWN"), "downReleaseAction"); + inputMap.put(KeyStroke.getKeyStroke("released Z"), "zReleaseAction"); + inputMap.put(KeyStroke.getKeyStroke("released S"), "sReleaseAction"); + + // Mapper les actions aux méthodes correspondantes pour le relâchement + actionMap.put("upReleaseAction", upReleaseAction); + actionMap.put("downReleaseAction", downReleaseAction); + actionMap.put("zReleaseAction", zReleaseAction); + actionMap.put("sReleaseAction", sReleaseAction); + mainPanel.setFocusable(true); } diff --git a/src/main/java/pong/PongApp.java b/src/main/java/pong/PongApp.java index c87c3ab..7981f82 100644 --- a/src/main/java/pong/PongApp.java +++ b/src/main/java/pong/PongApp.java @@ -32,15 +32,15 @@ public class PongApp { String son = "src/main/resources/Sound/son.wav"; Sound.playMusic(son); - PongRacket leftRacket = new PongRacket("Left racket", "src/main/resources/pong/raquette.png", new Coordinates2D(widthDiff + 5, 100), racketWidth, racketHeight); + PongRacket leftRacket = new PongRacket("Left racket", "src/main/resources/pong/raquette.png", new Coordinates2D(widthDiff + 5, height/2 - racketHeight/2), racketWidth, racketHeight); components.add(leftRacket); - PongRacket rightRacket = new PongRacket("Right racket", "src/main/resources/pong/raquette.png", new Coordinates2D(rectWidth + widthDiff - 5 - racketWidth, 100), racketWidth, racketHeight); + PongRacket rightRacket = new PongRacket("Right racket", "src/main/resources/pong/raquette.png", new Coordinates2D(rectWidth + widthDiff - 5 - racketWidth, height/2 - racketHeight/2), racketWidth, racketHeight); components.add(rightRacket); // TODO: Add rackets - //PongBall pongBall = new PongBall("Ball", "src/main/resources/pong/ball.png", new Coordinates2D(width/2, height/2), ballWidth, ballWidth); - PongBall pongBall = new PongBall("Ball", "src/main/resources/sprint2_demo/asteroid.png", new Coordinates2D(width/2, height/2), ballWidth, ballWidth); + PongBall pongBall = new PongBall("Ball", "src/main/resources/pong/ball.png", new Coordinates2D(width/2, height/2), ballWidth, ballWidth); + //PongBall pongBall = new PongBall("Ball", "src/main/resources/sprint2_demo/asteroid.png", new Coordinates2D(width/2, height/2), ballWidth, ballWidth); components.add(pongBall); Kernel kernel = new Kernel("Pong", width, height, components); diff --git a/src/main/java/sprint2_demo/Grid.java b/src/main/java/sprint2_demo/Grid.java index ff4f3bf..1229641 100644 --- a/src/main/java/sprint2_demo/Grid.java +++ b/src/main/java/sprint2_demo/Grid.java @@ -45,7 +45,7 @@ public class Grid extends JFrame { try { kernel.start(); // Start the kernel - kernel.setKeysListeners(playerPanel); // Set keys listeners + kernel.setKeysAndKeyReleasedListeners(playerPanel); // Set keys listeners revalidate(); } catch (IOException e) { throw new RuntimeException(e); -- GitLab