In einem Spiel, das ich gerade mache, muss ich immer den x- und y-Wert der Maus haben, relativ zum JPanel. Das bedeutet, dass ich die Werte jedes Mal aktualisieren muss, wenn die Methode paintComponent aufgerufen wird. Ich habe mouseMoved() und mouseDragged() verwendet, aber jetzt, da ich die Grafiken selbst übersetze, muss ich sie ständig aktualisieren. Haben Maus-Listener eine Methode, um einfach die x- und y-Werte Ihrer Maus zu erhalten, ohne eine Methode erstellen zu müssen?Wie wird die x- und y-Position einer Maus relativ zu einer JPanel ständig aktualisiert, ohne dass ein Ereignis erforderlich ist?
Antwort
Die Maushörer erhalten eine MouseEvent
, aus der Sie die Position der Maus abrufen können.
class MyMouseListener extends MouseMotionAdapter {
@Overrride
public void mouseDragged(MouseEvent e) {
int mouse_x = e.getX();
int mouse_y = e.getY();
// ... use mouse_x & mouse_y
}
}
Hinweis: Sie sollten diese Mausposition speichern, wenn Sie es in der #paint(Graphics g)
Methode benötigen. Während Sie möglicherweise die Mausposition während eines Anrufs auf dem Windows-Betriebssystem #paint(Graphics g)
abfragen können, habe ich unter Mac OS "Lock-up" erlebt. Speichern Sie die Mausposition im Maus-Listener und verwenden Sie die gespeicherte Position in Ihrer Malmethode.
Das Problem ist in meiner Situation, dass ich den Mausort bekommen muss, ohne dass die Maus irgendwas macht. Ich mache ein Spiel, das den Mauszeiger als einen Weg verwendet, um Feinde zu zielen, und das Fliegen nach links oder rechts bewirkt, dass die gesamte Grafik den umgekehrten Weg übersetzt, was bedeutet, wenn Sie die Maus halten, aber nicht bewegen und zielen Wenn Sie mit den Tasten nach links oder rechts steuern, werden die Werte für x und y nicht aktualisiert. –
Durch das Übersetzen der Grafiken wird die Position der Maus nicht verändert. Sie müssen die [inverse Transformation] anwenden (https://docs.oracle.com/javase/geom/AffineTransform.html#inverseTransform%28java.awt.geom.Point2D,%20java .awt.geom.Point2D% 29) zur Maus/Bildschirm-Koordinate, um es in Ihr Modellkoordinatensystem zu konvertieren. – AJNeufeld
Ich habe schon. Das Zielsystem funktioniert in allen Situationen, außer wenn der Spieler straft (sich nach links und rechts bewegt), während der Cursor auf eine Stelle gerichtet bleibt.Dies liegt daran, dass, obwohl sich die Maus relativ zum Bildschirm bewegt, keine tatsächliche Bewegung erkannt wird (oder Ziehen oder Klicken), daher war der x-Wert, der beim ersten Klick aufgezeichnet wurde, das neueste Update. Ich möchte es ständig im Laufe des Programms aktualisieren, nicht nur wenn es verschoben oder gezogen wird. –
Sie können MouseInfo.getPointerInfo() versuchen. GetLocation(). Es wird die Mauszeigerposition relativ zu Ihrem Bildschirm zurückgeben. Mehr über PointerInfo
Beispielcode:
PointerInfo relative = MouseInfo.getPointerInfo();
Point coord = relative.getLocation();
int x = (int) coord.getX();
int y = (int) coord.getY();
Ich bin mir bewusst, dass Sie sagen, Sie Ihre eigene Methode für diesen gefunden, aber nur eine Lösung als Antwort zu geben.
haben irgendeine Form von Aimer
class
, die mit der Einnahme der On-Screen-Angeboten Point
und es zu Ihrem Spiel Koordinatensystem umzuwandeln, und geben, die zu Ihrem MouseListener
zu aktualisieren, wenn die Maus bewegt wird. Dies wird dann immer den aktuellen Bildschirm Point
der Maus behalten, aber die zugrundeliegende Konvertierung zu Ihren In-Game-Koordinaten wird anderswo behandelt.
Etwas wie folgt aus:
public class AimingMouseListener extends MouseAdapter {
private final Aimer aimer;
public AimingMouseListener(Aimer aimer) {
super();
this.aimer = aimer;
}
@Override
public void mouseMoved(final MouseEvent e) {
aimer.setCurrentMousePoint(e.getPoint());
}
}
Es gibt auf jeden Fall Möglichkeiten dies zu tun (implementieren Sie Ihre eigene 'MouseListener', die die Position auf einem' mouseMoved' Ereignis zu einer Variablen speichert und liefert einen Accessor); aber ich würde gerne mehr Informationen darüber hören, warum Sie ständig updaten müssen, da das nicht direkt von dem kommt, was Sie beschreiben. – user2478398
@ user2478398 Stellen Sie sich dies wie ein Pokemon-Spiel vor, bei dem der Spieler immer in der Mitte ist, aber das alles um den Spieler bewegt sich, wenn er geht. Mein Spiel sieht ähnlich aus, außer dass du schießen kannst. Die Kugeln gehen zur Maus. Wenn der Spieler beschließt, seinen Cursor auf einer Stelle zu halten, ohne ihn zu bewegen, und mit den Pfeiltasten strafe, funktioniert das Zielsystem nicht, da die x- und y-Koordinate beim ersten Klick alt sind. –