2017-08-30 3 views
0

Essayer de faire un jeu RPG simple avec une caméra aérienne. Quand je suis allé mettre en œuvre un MouseMotionListener, qui n'est pas la première fois que j'utilisé un MouseMotionListener, il semble que le mousedMoved MouseEvent ne se est ce qu'on appelle une fois alors simple ne semble pas fonctionner plus. Je suis coincé là-dessus depuis un bon bout de temps et toutes mes recherches me mènent à des impasses.L'événement mouseMoved ne semble être appelé qu'une seule fois

J'ai une boucle de jeu complète avec des méthodes de tick et de rendu. Mais comme vous le voyez dans le code ci-dessous, dans la classe de manipulation de la souris (Le bit de bas du code) Renvoie un nombre qui augmente de un chaque fois que la souris se déplace (Dans la méthode tick, j'imprime la valeur du nombre) et il devrait également imprimer sur la console les coordonnées x et y de la souris. Lorsque vous exécutez le programme, le nombre est égal à un et il imprime les coordonnées de la souris une seule fois. Un exemple serait la sortie de la console ressemblera à quelque chose comme ceci:

124 82 
1 

Ou si ma souris ne planant JFrame quand le programme lance ça va ressembler à ceci:

0 

Voici mon méthode init pour ma boucle de jeu:

private void init() { 
    display = new Display("Operation Blood Bath: Alpha 0_5.0", 800, 600); 
    game = new Game(); 
    Assets.init(); 
} 

Voici ma classe d'affichage qui est appelée dans la méthode init:

public class Display { 

private JFrame frame; 
private Canvas canvas; 

public Display(String title, int width, int height) { 
    frame = new JFrame(title); 
    frame.setSize(width, height); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setResizable(false); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 

    canvas = new Canvas(); 
    canvas.setPreferredSize(new Dimension(width, height)); 
    canvas.setMaximumSize(new Dimension(width, height)); 
    canvas.setMinimumSize(new Dimension(width, height)); 
    canvas.setFocusable(false); 

    frame.add(canvas); 
    frame.addMouseMotionListener(new MouseMotionHandling()); 
    frame.pack(); 
} 

public Canvas getCanvas() { 
    return canvas; 
} 

public JFrame getFrame() { 
    return frame; 
} 

} 

La méthode tique:

private void tick() { 
    game.tick(); 
    System.out.println(MouseMotionHandling.HELLO()); 
} 

Voici la classe de manipulation de la souris qui est appelée dans la classe d'affichage:

public class MouseMotionHandling implements MouseMotionListener { 

private static int number = 0; 

@Override 
public void mouseDragged(MouseEvent arg0) { 

} 

@Override 
public void mouseMoved(MouseEvent arg0) { 
    System.out.println(arg0.getX() + " " + arg0.getY()); 
    number++; 
} 

public static int HELLO() { 
    return number; 
} 

} 

Où vais-je travailler ici?

Répondre

1

Le problème est que votre canvas remplit complètement le volet de contenu du JFrame et capture ainsi tous les événements de la souris. La solution la plus simple consiste à ajouter votre écouteur de souris au canvas au lieu du frame. En ce qui concerne les raisons pour lesquelles vous recevez un seul événement de souris sur votre image, je pense que cela doit être dû à des problèmes de synchronisation dans la création des différents composants.

+0

Préfet travaillé! Merci beaucoup. – HuffelPuff