- g2i,
Bonjour à tous,
Je m’adresse à vous parce que je ne vois pas où j’ai pu me tromper dans mon code. L’objectif est de coder le déplacement d’un personnage à la manière d’un jeu Pokémon dans la troisième génération pour ceux qui connaissent, c’est-à-dire que lorsque le personnage se déplace d’une case à une autre adjacente, une animation sur ses jambes est montrée.
Le problème, c’est que mon code s’exécute de manière un peu bizarre. C’est-à-dire que lorsque je l’exécute, je n’obtiens que l’état final escompté, et lorsque je mets une pause de deux secondes, je n’obtiens que l’état initial. Les codes sont les suivants :
Main :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | package main; import maze.Maze; import maze.MazeReadingException; import ui.MainWindow; public class MainTest { public static void main(String[] args) throws MazeReadingException, InterruptedException { Maze maze = new Maze(); MainWindow window = new MainWindow("Projet JAVA"); maze.initFromTextFile("data/levels/labyrinthe.txt"); window.getAppModel().setDrawnBoxes(maze.getCaseMatrix()); window.setVisible(true); //Thread.sleep(2000); window.getAppModel().setCharXCharY(0, 0); window.getAppModel().setCharXCharY(0, 1); window.getAppModel().setCharXCharY(0, 2); window.getAppModel().setCharXCharY(0, 3); } } |
MainWindow est la classe créant ma fenêtre principale. Maze est une classe représentant le terrain, elle possède entre autres un attribut caseMatrix qui représente les cases du terrain. La méthode initFromTextFile sert à initialiser cet attribut à partir d’un fichier texte. AppModel est le modèle de mon application, qui possède comme attribut drawnBoxes qui représente les cases à dessiner. MainWindow possède comme content un panel qui contient deux JPanel, un pour les boutons, l’autre affichant le terrain. C’est celui-ci qui m’intéresse. Voici sa classe :
MainPanel :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package ui; import java.awt.Graphics; import javax.swing.JPanel; public class MazePanel extends JPanel { public static final long serialVersionUID = 201801142359L; private final MainWindow mainWindow; @Override protected void paintComponent(Graphics g) { mainWindow.getAppModel().paintBoxes(g); mainWindow.getAppModel().paintCharacter(g); } public void notifyForUpdate() { repaint(); } public MazePanel(MainWindow mainWindow) { super(); this.mainWindow = mainWindow; } } |
paintBoxes() affiche les cases contenues dans drawnBoxes et fonctionne a priori bien. En revanche, paintCharacter(), censée afficher les animations, ne fonctionne pas comme je le souhaite. Voici son code, contenu donc dans AppModel :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | public void paintCharacter(Graphics g) { try { String filePath = "data/sprites/"; filePath += departureCharacterBoy + direction + leftFoot + ".png"; Image img = ImageIO.read(new File(filePath)); if (direction.equals("Right")) { g.drawImage(img, 16*charX - 7, 16*charY - 3, null); } else if (direction.equals("Left")) { g.drawImage(img, 16*charX + 9, 16*charY - 3, null); } else if (direction.equals("Face")) { g.drawImage(img, 16*charX + 1, 16*charY + 5, null); } else { g.drawImage(img, 16*charX + 1, 16*charY - 11, null); } Thread.sleep(500); paintBoxes(g); filePath = "data/sprites/" + departureCharacterBoy + direction + ".png"; img = ImageIO.read(new File(filePath)); g.drawImage(img, 16*charX + 1, 16*charY - 3, null); Thread.sleep(500); } catch (Exception e) { e.printStackTrace(); } } |
Je voudrais donc que mon personnage se déplace de la moitié d’une case (une case étant un carré de 16x16 px) en une demi-seconde puis encore de la moitié en une demi-seconde également. Voici le code de la fonction setCharXCharY utilisée dans le main :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public void setCharXCharY(int charX, int charY) { if (this.charX > charX) { this.direction = "Left"; } else if (this.charX < charX) { this.direction = "Right"; } else if (this.charY > charY) { this.direction = "Back"; } else { this.direction = "Face"; } this.leftFoot = !leftFoot; this.charX = charX; this.charY = charY; setChanged(); notifyObservers(); } |
C’est la première fois que je demande de l’aide en Java, et je me rends compte que ça serait vraiment lourd de poster ici toutes les classes ici, mais d’un autre côté je ne vois vraiment d’où peut venir l’erreur, donc je suis désolé de la longueur du post. Je tiens à préciser que ce n’est absolument pas professionnel, donc si vous avez besoin du reste du code, des images ou du fichier .txt je n’aurai aucun problème à vous les donner.
Merci d’avance