Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Bild Berührt Bild abfragen
sexysith - Sa 03.01.09 19:10
Titel: Bild Berührt Bild abfragen
Hallo,
ich bin grade bei meinem 2ten kleinen Projekt und habe da ein kleines Problem.
Ich möchte gerne, dass wenn ein Bildfeld (es soll einen Feuerball darstellen) Meine Figur, die ich Steuere (Ebenfalls ein Bildfeld), berührt etwas passiert. Was ist eigentlich egal. Es geht um die Abfrage, wie kann ich das machen?
http://www.delphi-forum.de/viewtopic.php?t=47000&highlight=kolisionsabfrage
Habe mal was gesucht, das hier gefunden, aber leider nicht verstanden. Kann mir wer das vielleicht mal erklären? Oder eghts noch anders? Ich möchte keine Engine einbauen.
Und nochwas, ich möchte, ... Wenn Mein Bild an einer Stelle ist, soll etwas passieren. Wie mach ich das?
Delphi-Quelltext
1: 2: 3: 4:
| If Image1.left = 100 and If Image1.top = 100 then begin xxx end; |
Danke euch schonmal im vorraus!
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
sexysith - So 04.01.09 17:43
Danke für den Link, habe da mal gelesen abeer es stellt sich mir imemrnoch die Frage, wie ich die Position festlege. Es soll aber nicht nur eine bestimmte Position sein, sonder ein kleiner berreich.
lincore - Mo 05.01.09 18:29
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; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!