Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Mausposition auf einem Shape


Stread - Mi 14.07.10 11:58
Titel: Mausposition auf einem Shape
Hi,

ich habe ein kleines Spiel programmiert. Man muss ein grünes Quadrat(Shape) mit der Maus berühren. Dann ändert es seine Position und man bekommt einen Punkt dazu. Ein rotes Quadrat hat eine sich ändernde zufällige Richtung.
Wenn die Maus das Rote Quadrat berührt, hat man verloren. Alles ist in einem Panel was eine feste Größe hat.

Da ist das Problem:
Ich habe beim Shape auf OnMouseEnter den Befehl. Wenn ich mit der Maus reingehe klappt es auch, aber wenn ich die Maus an einer stelle lasse und das Shape drübergeht, klappt es logischerweise nicht. Aber das ist ja nicht der Sinn des Spiels.

Wie bewerkstellige ich das nun?
Die Kooardinaten der Maus und des Shapes abfragen und schauen ob sie gleich sind? Aber das Shape ist ja nicht nur ein Punkt.


Danke

Stread


Stundenplan - Mi 14.07.10 12:20

Zitat:
Aber das Shape ist ja nicht nur ein Punkt.

Und was ist mit:

Delphi-Quelltext
1:
2:
3:
if ((MouseX > Shape.Left) and (MouseX < Shape.Left + Shape.Width)) 
  and ((MouseY > Shape.Top) and (MouseY < Shape.Top + Shape.Height)) then
  //Aktion


Nersgatt - Mi 14.07.10 12:57

Dazu kann man sich auch mal die Funktion PtInRect anschauen:
http://docwiki.embarcadero.com/VCL/de/Types.PtInRect

Für das Spielchen kannst Du einfach in einem Timer periodisch abfragen, ob die Maus im Shape ist und entsprechend reagieren.


Stread - Mi 14.07.10 15:49

Bei

Delphi-Quelltext
1:
2:
3:
if PtInRect (Shape1, Point(20,30))
then ShowMessage(' Shape1 20 30 is inside')
else ShowMessage(' Shape1 20 30 is outside');

erscheint

Quelltext
1:
 E2010 Inkompatible Typen: 'TRect' und 'TShape'                    




Edit: Die Idee von Stundenplan hat funktioniert.


Xion - Mi 14.07.10 16:04

Ja du müsstest das Shape erst in ein Rect umpacken:

Delphi-Quelltext
1:
2:
3:
4:
var R:TRect;

R.Left:=Shape.Left;
R.Width:=Shape.Width;


Besonders hübsch bei runden Shapes (geht das überhaupt? glaube schon)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var P: TPoint;

P:=Shape1.ScreenToClient(Mouse.CursorPos); //Mausposition auf Koordinaten des Shapes umrechnen
if ( abs(P.X+Shape1.Width/2)>Shape1.Width/2 )
and( abs(P.Y+Shape1.Height/2)>Shape1.Height/2 ) then
  //nicht im Rechteck vom Shape


Stread - Mi 14.07.10 16:39

Bei deinem ersten Code kommt in Zeile 4 : TRect enthält kein Element namens Width. Und nach dem kompilieren: Undeklarierter Bezeichner.

Ist Stundenplans Code nicht einfacher?


Stundenplan - Mi 14.07.10 17:14

Zitat:
TRect enthält kein Element namens Width.

Aber es gibt ein TRect.Right. :wink:


Xion - Mi 14.07.10 18:01

:oops: mein Fehler, jo, Right muss es heißen

user profile iconStundenplans Code ist sicher einfacher zu verstehen. Ich machs auch immer so. Es wäre aber möglich dass die PtInRect-Funktion schneller ist. Müsste man sich mal den Code dort angucken.

Fazit: Nehm user profile iconStundenplans Code und lass dich nicht weiter verwirren/aufhalten :lol:

Noch ne Anmerkung am Ende:
Mit OnMouseEnter hast du soweit ich weiß auch das tolle Problem, dass wenn ich die Maus-Taste drücke ich deinem roten Rechteck sowieso entkomme, da ich dann dieses Event nicht auslöse :mrgreen: