Grüsse,
Ich arbeite gerade an einem Weltraum Shooter, daß ich in Windows Forms programmiere.
Da das Formfenster einen speziellen Bereich hat in dem sich das Raumschiff bewegen soll, möchte ich, dass dieses diesen Bereich nicht verlassen kann.
Der Code funktioniert an sich. Allerdings nicht sauber. An der Stelle habe ich den Events Mouse_Leave und Mouse_Move gearbeitet. Evtl hat ja jemand einen besseren Vorschlag.
private void Form1_MouseLeave(object sender, EventArgs e)
{
if (this.PointToClient(Cursor.Position).X <= 30)
{
Cursor.Position = new Point(this.PointToClient(Cursor.Position).X + this.Width- 35,
this.PointToClient(Cursor.Position).Y + 130);
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
lock (_lock)
{
raumschiff.PosX = this.PointToClient(Cursor.Position).X;
raumschiff.PosY = this.PointToClient(Cursor.Position).Y;
raumschiff.HitboxRaum();
}
}
An sich wäre ich damit zufrieden. Wenn man den Mauszeiger versucht "leicht" aus dem Fenster zu schieben, springt er wieder zurück. Wenn es aber mit aller Gewalt probiere, springt er trotzdem raus. Also im Idealfall irgendwas, bei dem ich verhindern kann, dass er das Form verlässt.
Schalte doch einfach den Mauszeiger ab und handle die Koordinaten passend. Dann sieht man nicht mehr dass sie aus dem Fenster laufen.
Alternativ kannst Du auch "per Hand" die Maus-Position tracken und wenn sie das Fenster verlässt, immer wieder zur vorherigen Position im Fenster zurück setzen.
Bedenke aber:
Damit verursachst Du früher oder später Frustation beim Nutzer.
Wenn das aus anderen Gründen (z.B. weil der Nutzer eingesperrt sein soll) richtig ist, dann ist das aber egal 😄
PS:
Im Prinzip also das gleiche wie die Funktion, die Spook genannt hat.
Stellt sich nur die Frage, wie sich das verhält, wenn das Fenster die Position (durch Tasten-Kombinationen) ändert oder wenn das Fenster minimiert wird.
Das müsstest Du also auch abfangen.
NuGet Packages im Code auslesen
lock Alternative für async/await
Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.
Hab es getestet und es läuft. Zwar auch nicht 100%, aber besser als mein Code.
Wieder was dazu gelernt.
Kurzes Update:
Die Cursor.Clip Funktion funktioniert besonders gut mit selbst erstellten Grenzen und etwas weniger gut wenn es sich tatsächlich um die Grenze der Form handelt.
Die Clip Eigenschaft verlangt nach einer Size. Ich habe dafür einfach ein globales Rectangle erstellt mit meinen gewünschten Maßen und hab das einfach mit übergeben.
Jetzt läuft es wie geschmiert.
Vielleicht bin ich doch nicht zu blöd zum programmieren 😃