Autor Beitrag
sexysith
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 03.01.09 19:10 
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?

www.delphi-forum.de/...ght=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?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: Sa 03.01.09 19:41 
Vieleicht solltest Du dir erst mal das anschauen
www.delphi-treff.de/...al/delphi-crashkurs/
denn an deinem Code sieht man schon das dir doch noch die Grundlagen fehlen.

_________________
Blackheart666
Der Irrsinn ist bei Einzelnen etwas Seltenes, - aber bei Gruppen, Parteien, Völkern, Zeiten die Regel. (Friedrich Nietzsche)
sexysith Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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
Hält's aus hier
Beiträge: 15

Kubuntu 8.04, Debian lenny, Windows XP, Windows Vista
Delphi 2009, C++, Python, Lua
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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:
ausblenden 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:
ausblenden 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):
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
function isOverlapping(const image: TImage; const area: TRect): boolean;
begin
  {...}
end;