Mir stellt sich die Frage, ob das Ereignis ausgelöst werden soll, wenn sich das Spielerobjekt komplett im gewünschten Bereich befindet oder ob es ausreicht, wenn es diesen lediglich schneidet.
Im ersten Fall sähe das so aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| Top/Left ################### # # # ############ # # #-----> Bild # #---------> Bereich # ############ # # # ################### Buttom/Right |
Wie man an der Skizze ersehen kann, muss man lediglich prüfen, ob sich die Ecken links oben und rechts unten des Bildes innerhalb des Bereichs befinden. Der Test sähe dann so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| if (Bild.Left >= Bereich.Left) and (Bild.Top >= Bereich.Top) and (Bild.Right <= Bereich.Right) and (Bild.Buttom <= Bereich.Buttom) then begin writeln('Har har! Ihr seid in meine Falle getappt. Nun werde ich Euch fressen.'); antagonist.eat(hero); gameover(); end; |
Die Eigenschaften Buttom (unten) und Right (rechts) wurden vom TRect ausgeliehen (unit Types). Wenn Du wirklich mit TImages arbeiten willst, gibt es stattdessen width und height:
Delphi-Quelltext
1: 2:
| Right := Left + Width; Buttom := Top + Height; |
Wenn sich der Bereich und das Bild lediglich schneiden sollen, um ein Ereignis auszulösen, sieht das zum Beispiel so aus:
Quelltext
1: 2: 3: 4: 5: 6:
| #################--------> Bereich # # # ############ # # | #---> Bild ######## #--------------| # ############ |
Hierbei muss man nur nachweisen, dass sich eine Ecke innerhalb des Bereichs befindet (vorausgesetzt, es handelt sich bei dem Bild um ein Viereck):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| if ((Bild.Left >= Bereich.Left) and (Bild.Top >= Bereich.Top)) or ((Bild.Right <= Bereich.Right) and (Bild.Top >= Bereich.Top)) or ... or ... then begin end; |
Die Kollisionsabfrage würde ich in eine Funktion bzw. Methode auslagern, etwa so:
Delphi-Quelltext
1: 2: 3: 4:
| function isOverlapping(const image: TImage; const area: TRect): boolean; begin end; |