| Autor |
Beitrag |
Stread
      
Beiträge: 188
Win 7
Delphi XE
|
Verfasst: 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
      
Beiträge: 128
Erhaltene Danke: 32
Win 7
Delphi 7 Pers., C# (VS 2010 Express)
|
Verfasst: 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 |
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: 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 
      
Beiträge: 188
Win 7
Delphi XE
|
Verfasst: 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.
Zuletzt bearbeitet von Stread am Mi 14.07.10 16:12, insgesamt 1-mal bearbeitet
|
|
Xion
      

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)
|
Verfasst: Mi 14.07.10 16:04
_________________ 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 
      
Beiträge: 188
Win 7
Delphi XE
|
Verfasst: 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
      
Beiträge: 128
Erhaltene Danke: 32
Win 7
Delphi 7 Pers., C# (VS 2010 Express)
|
Verfasst: Mi 14.07.10 17:14
| Zitat: | | TRect enthält kein Element namens Width. |
Aber es gibt ein TRect.Right. 
|
|
Xion
      

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)
|
Verfasst: Mi 14.07.10 18:01
 mein Fehler, jo, Right muss es heißen
Stundenplans 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 Stundenplans Code und lass dich nicht weiter verwirren/aufhalten
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 
_________________ 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)
|
|