Autor Beitrag
Stread
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Mi 14.07.10 11:58 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128
Erhaltene Danke: 32

Win 7
Delphi 7 Pers., C# (VS 2010 Express)
BeitragVerfasst: Mi 14.07.10 12:20 
Zitat:
Aber das Shape ist ja nicht nur ein Punkt.

Und was ist mit:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mi 14.07.10 12:57 
Dazu kann man sich auch mal die Funktion PtInRect anschauen:
docwiki.embarcadero....CL/de/Types.PtInRect

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

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Mi 14.07.10 15:49 
Bei
ausblenden 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
ausblenden Quelltext
1:
 E2010 Inkompatible Typen: 'TRect' und 'TShape'					




Edit: Die Idee von Stundenplan hat funktioniert.


Zuletzt bearbeitet von Stread am Mi 14.07.10 16:12, insgesamt 1-mal bearbeitet
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 14.07.10 16:04 
Ja du müsstest das Shape erst in ein Rect umpacken:
ausblenden 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)
ausblenden 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

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)


Zuletzt bearbeitet von Xion am Mi 14.07.10 18:02, insgesamt 1-mal bearbeitet
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128
Erhaltene Danke: 32

Win 7
Delphi 7 Pers., C# (VS 2010 Express)
BeitragVerfasst: Mi 14.07.10 17:14 
Zitat:
TRect enthält kein Element namens Width.

Aber es gibt ein TRect.Right. :wink:
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: 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:

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)