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 :
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;
		}
	}
Il en résultera l'affichage suivant si je laisse la touche flèche haut appuyée:
Citation Envoyé par Console
pressed
released
pressed
released
pressed
released
Comment puis-je remédier au problème sans toucher à la configuration de Linux ?

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 :
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;
	}
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.


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