Bonjour à tous,
Dans le cadre d'un projet je dois réaliser un jeu Mario bross en java (d'ici Dimanche prochain) et suis actuellement confronté à deux problèmes que je ne parviens pas à résoudre malgré quelques recherches sur le net.
Problème 1 :
J'ai remarqué que lorsque je laissais la touche flèche droite du clavier appuyée, mon KeyListener alternait les appels à keyPressed() et à keyReleased() et ce uniquement sous Linux. Sous Windows, ce problème ne se pose pas.
Exemple :
Il en résultera l'affichage suivant si je laisse la touche flèche haut appuyée:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class KeyboardListener implements KeyListener { public KeyboardListener() {} @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); switch(keyCode) { case KeyEvent.VK_UP: System.out.println("pressed"); break; } } @Override public void keyReleased(KeyEvent e) { int keyCode = e.getKeyCode(); switch(keyCode) { case KeyEvent.VK_UP: System.out.println("released"); break; } }
Comment puis-je remédier au problème sans toucher à la configuration de Linux ?Envoyé par Console
Problème 2 :
Dans mon programme Mario, tous les éléments peuvent être considérés comme des rectangles (que j'appelle "box"). Chaque objet a donc pour attribut sa propre box. Pour déterminer si un rectangle collisionne un autre, j'appelle la méthode intersects de Rectangle de java.awt.geom.Rectangle2D.
Le problème est que mon programme ne détecte que parfois qu'il va il y avoir collision..
J'ai l'impression que intersects ne détecte une intersection que si la bordure des deux rectangles se superposent à une unité de longueur près
Le code en question :
Quand j'avance vers la droite, Mario s'arrête parfois exactement contre un bloc (un des ICollidable element contenus dans map), ne détecte parfois la future intersection que trop tard ou jamais et traverse alors le bloc.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public List<ICollidable> getElementsRight(Rectangle box, int step) { // box est le Rectangle de Mario List<ICollidable> obstacles = new ArrayList<ICollidable>(); Rectangle copyBox = new Rectangle(box); // Je copie la box de Mairo pour ne pas translater l'originale et translate la copie pour vérifier qu'il n'y aura pas de collision à l'endroit que doit atteindre Mario. copyBox.translate(step, 0); // step est le déplacement que s'apprête à faire Mario vers la droite. for (ICollidable element : map) { // map est une liste contenant tous les éléments de la carte. Rectangle elemBox = element.getBox(); if (copyBox.intersects(elemBox) && !box.equals(elemBox)) { // c'est ici que réside le problème obstacles.add(element); // je construis une liste des obstacles } } return obstacles; }
Toute aide est la bienvenue (sachant qu'il me reste peu de temps pour finaliser ce programme), que ce soit pour corriger ma manière de programmer ou pour me donner la solution à mes problèmes.
Merci de m'avoir lu, en espérant un peu d'aide![]()
Partager