# Maus an Fedenkreuz heften



## mmhhh (29. Nov 2012)

Ich möchte eine First Person Anwendung mit einem Fadenkreuz programmieren, und will die Sichtbarkeit der Maus an und ausswitchen und die Bewegungen direkt übertragen.
Wie ich einen Maus listener mache weis ich, aber nicht wie ich die maus un-/sichtbar mache die position der maus nach dem auslesen wieder in die bild mitte setze(natürlich unsichtbar)

Danke schonmal im voraus.


----------



## dayaftereh (29. Nov 2012)

Also auf einer Swing Komponente kannst du die Maus so versteken: java - How to hide cursor in a Swing application? - Stack Overflow

Und für das Bewegen der Mause würde ich mir mal die Klasse : Robot (Java Platform SE 7 ) Ansehen.


----------



## mmhhh (29. Nov 2012)

wenn ich das tue, mit der robot klasse, wird dann auch der MouseMotionListener aktiviert, weil sonst bräuchte ich eine andere methode


----------



## dayaftereh (29. Nov 2012)

Also du nutzt eine JFrame um dort dein Spiel zu zeichnen? wenn Ja, dann kannst du an das JFrame deinen MouseMotionListener adden! Wenn nein, schaum mal hier: How to get Mouse Position even if it is not within our application?

Also der Robot ist nur für das Bewegen bzw Clicken zuständig.


----------



## mmhhh (29. Nov 2012)

Ich will ja nicht die position finden, sondern versetzen, ohne das es der MousListener merkt


----------



## dayaftereh (29. Nov 2012)

Ok, ich glaube ich habe nicht verstanden was du vorhast. Also du willst selbst eine First-Person Anwendung machen, bei der keinen Mouse-Cursor gibt? Doch dann willst du selbst die Mouse in die Mitte Bewegen? verstehe ich irgend wie nicht?


----------



## D4rkscr43m (29. Nov 2012)

Maus befindet sich an Bildschirmmitte, der Spieler bewegt die Maus, MausMotionListener wird ausgelöst, Bildausschnitt für das Spiel verschiebt sich entsprechend der Bewegung, Maus wird wieder auf den Bildschirmmittelpunkt gesetz (hier soll der MausMotionListener nicht aufgerufen werden)

So hab ichs verstanden. Dann würde ich einfach überprüfen, ob das Ziel der Mausbewegung der Bildschirmmittelpunkt ist.


----------



## dayaftereh (29. Nov 2012)

Oder einfach ein Flag für den MausMotionListener setzen ob er jetzt Aktive oder Inaktive ist!


----------



## mmhhh (29. Nov 2012)

D4rkscr43m hat gesagt.:


> Maus befindet sich an Bildschirmmitte, der Spieler bewegt die Maus, MausMotionListener wird ausgelöst, Bildausschnitt für das Spiel verschiebt sich entsprechend der Bewegung, Maus wird wieder auf den Bildschirmmittelpunkt gesetz (hier soll der MausMotionListener nicht aufgerufen werden)...
> .



genau das meinte ich


----------



## mmhhh (29. Nov 2012)

Ich finde keine funktion für das deaktivieren des MouseMotionListeners, weis jemand, wie ich die aufrufe?
(danke schonmal für alles)


----------



## D4rkscr43m (29. Nov 2012)

```
((Component)e.getSource()).removeMouseMotionListener(this);
```


----------



## dayaftereh (29. Nov 2012)

Hey, könntest natürlich den MouseMotionListener einfach löschen und dann wieder hinzufügen.

```
Component#addMouseListener()
Component#removeMouseListener()
```

Oder du machst dir ein Flag wie folgt:


```
boolean flag = false || true
Component#addMouseListener(new MouseMotionListener() {
   public void mouseMoved(MouseEvent e) {
      if(!flag){
         return;
      }
      // Do Logic
   }
});
```


----------



## trääät (29. Nov 2012)

würde hier auch zum FLAG raten ...

der listener wird ausgelöst in dem die maus bewegt wird ... nun lässt du im listener den code ablaufen der für die veränderung des blickwinkels sorgt ... togglest das flag (was natürlich im listener selbst zu erst geprüft wird) und setzt die maus in die mitte und togglest das flag wieder ...
beim zweiten mal wird also der code im listener ignoriert da ihn das flag von abhält diesen auszuführen ...

ansonsten mal in gaming-foren nachfragen wie es unter normalen ego-"shootern" gemacht wird


----------



## dayaftereh (29. Nov 2012)

Ich weiß nicht wie deine Architektur ist, aber wenn du je ein Game-Loop hast, dann aktualisiert du nur die Mouse-Position mit dem MouseMotionListener und das verschieben passiert in der eigentlichen Update-Methode deines Game-Loops und musst du dann dein Flag platzieren.

Ich glaube auch das wenn du den MouseMotionListener  immer entfernst und dann wieder hinzufügst, verbrauchst du mehr Rechenleistung bzw, ist langsamer, da intern die Methoden Synchronisiert sind und du jedes mal auf eine Sperre Triffst.


----------



## mmhhh (29. Nov 2012)

ja, glaube ich auch, und ich habe eine game loop, aber wie soll ich es dann machen, dass er es nicht regestriert?


----------



## dayaftereh (29. Nov 2012)

Ich würde es so machen, eine boolean die vor dem Verschieben der Mouse-Positon auf *true* gesetzt wird, dann verschiebst du deine Mouse-Position mit der Klasse Robot und setzt dann die boolean wieder auf *false*. In deinem Game-Loop verschiebst du den Viewport nur wenn die boolean auf false gesetzt ist.


----------



## mmhhh (29. Nov 2012)

ah, ok danke klingt logisch, ich werds mal ausprobieren, wenns nicht klappt werd ich mich wieder melden, danke für alles


----------

