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 user profile iconNarses: Code- durch Delphi-Tags ersetzt


Blackheart666 - Sa 03.01.09 19:41

Vieleicht solltest Du dir erst mal das anschauen
http://www.delphi-treff.de/tutorials/objectpascal/delphi-crashkurs/
denn an deinem Code sieht man schon das dir doch noch die Grundlagen fehlen.


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)  // Der linke Rand des Bildes befindet sich rechts vom linken Rand des Bereichs (also innerhalb)
    and (Bild.Top >= Bereich.Top)  // Der obere Rand des Bildes befindet sich unterhalb des oberen Randes des Bereichs
    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)) // linke, obere Ecke
    or ((Bild.Right <= Bereich.Right) and (Bild.Top >= Bereich.Top)) // rechte, obere Ecke
    or ... // rechte, untere Ecke
    or ... // linke, untere Ecke 
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;