2012-05-13 11 views
9

Ich entwickle einen Ego-Shooter in Java und möchte Steuerelemente implementieren, bei denen die Bewegung der Maus den Player dreht. Allerdings kann ich in Java nur Mauskoordinaten erhalten, indem ich MouseListener Ereignisse verwende, so dass die Koordinaten nicht mehr geändert werden, sobald der Mauszeiger die Monitorkante verlässt und ich die Ansicht des Spielers nicht mehr drehen kann.Mausposition in Java

Irgendwelche Tipps/Vorschläge, wie man das macht? Vielen Dank.

+0

.. aber Sie wissen auch, dass die Maus _isn't_ bewegende, nicht wahr? – sarnold

+0

@sarnold: Ich denke, der Punkt ist, dass die * Maus * könnte immer noch bewegen, aber der * Cursor * ist nicht. –

+0

@GregHewgill: genau! – user1391664

Antwort

3

In einigen Spielen wird bei jedem Mausbewegungsereignis der Cursor zurück in die Mitte des Bildschirms bewegt, und die Ansicht bewegt sich mit der entsprechenden Größe und Richtung des Mausereignisses. Sie können diesen Vektor erhalten, indem Sie den Offset der Cursorposition zur Mitte des Bildschirms berechnen, bevor Sie den Cursor zentrieren. Um den Cursor zurück in die Bildschirmmitte zu bewegen, können Sie die Klasse java.awt.Robot verwenden.

Da Sie einen Ego-Shooter erstellen, möchten Sie wahrscheinlich den zentrierten Cursor ausblenden und Ihr eigenes Fadenkreuz zeichnen, auf das der Spieler zielen möchte. Dazu gehört auch, dass der Cursor auf der laufenden Summe aller früheren Mausbewegungsereignisse basiert.

Wenn Sie ein Verhalten erzielen möchten, bei dem sich die Ansicht relativ zur Startposition der Maus fortbewegt (auch wenn die Maus nicht mehr bewegt wird), können Sie eine Bewegungssumme aller vorherigen Mausbewegungsvektoren beibehalten und verschieben die Ansicht entsprechend einmal pro Frame. Dies gilt jedoch eher für einen Flugsimulator als für einen Ego-Shooter.

+0

Es passiert einfach, ich habe genau dasselbe getan, während ich auf eine Antwort wartete. Ich wusste nicht, dass Spiele es so gemacht haben. Danke – user1391664

+0

Tolles Zeug, Gern geschehen! Dies wird normalerweise als Maus/Cursor/Zeigersperre bezeichnet. – AerandiR

3

Ich versuchte mit einer java.awt.Robot, wie AerandiR suggeriert, aber es gab ein paar Probleme, die ich lief, und es ist möglich, dass andere Leute in sie auch laufen werden, so werde ich erarbeiten.

Wenn es Ihr Ziel ist, den Cursor in einer Position zu halten (vorzugsweise in der Mitte des Bildschirms), sollten Sie am Ende Ihrer mouseMoved() Methode so etwas wie robot.mouseMove(width/2, height/2); aufrufen. Bei dieser Implementierung wird die Maus jedes Mal, wenn die Maus aus der Mitte verschoben wird, wieder in die Mitte zurückbewegt.

Wenn jedoch die Robot die Maus neu zentriert, wird der Spieler wieder dorthin zurückkehren, wo er war. In der Tat wird der Spieler zwischen der ursprünglichen Position und einer gedrehten Position stottern.

Um dies zu beheben, definieren Sie den Abstand von der Mitte, anstatt zu definieren, wie weit Ihr Player den Unterschied zwischen der Position der Maus und ihrem aktuellen Standort aktiviert.

Wie so: turnAmountX += e.getX() - width/2;

Wenn nun die Robot Wieder Zentren der Maus, wird e.getX() - width/2 immer Null ergeben.

Recap:

void mouseMoved(MouseEvent e) { 
     turnAmountX += e.getX() - width/2; 
     turnAmountY += e.getY() - height/2; 
     robot.mouseMove(this.getLocationOnScreen().x + width/2, 
      this.getLocationOnScreen().y + height/2; 
    } 
+0

Danke! Dies war die zusätzliche Information, die ich brauchte und nirgends finden konnte. Genie. – LucidObscurity

Verwandte Themen