Entwickler-Ecke

Multimedia / Grafik - Kollision von 2 Images


ploRa - Mo 31.01.05 18:32
Titel: Kollision von 2 Images
Es mag sein, dass es schon genügend Threads von diesen Thema gibt aber ich kann mit keinem so wirklich was anfangen.

Also es geht um folgendes.

Es fallen von oben mehrere Labels herunter und unten muss ich die mit einem Image einfangen.
Also muss ich eine abfrage erstellen wann die Labels das Image erreichen aber ich weiß nciht wie ?

Kann mir da jmd. helfen ?

Thx


matze.de - Mo 31.01.05 18:36

was nutzt du denn für eine grafikoberföläche? DX, DelphiX, OPGL....?

mfg matze


Delete - Mo 31.01.05 18:46

Mit folgender Abfrage prüfst du, ob das Label1 mit Image1 kollidiert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
if  ((label1.top + label1.height >= image1.top) and 
     (label1.top <= image1.top+image1.height))
    and ((label1.left+label1.width>=image1.left) and
         (label1.left <= image1.left+image1.width))
    then
      Collision;


P.S.: Schlagt mich nicht wegen der Formatierung. Ich hab immer keinen Plan, wie man solch eine Abfrage gut strukturiert darstellt.


Marc Walter - Mo 31.01.05 19:29

du kannst auch einfach intersectrect benutzen


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
...
var schnittmenge, label, image: TRect;
begin
  label := Rect(Label1.left,Label1.Top,
                Label1.left+Label1.Width,Label1.Top+Label1.Height);
  image := Rect(Image1.Left, Image1.Top,
                Image1.Left+Image1.Width,Image1.Top+Image1.Height);
  if intersectrect(Schnittmenge, label, image) then kollision;
end;
...


sieht auf den ersten Blick fast komplizierter aus, ist aber um einiges geschickter, da du, da du ja viele labels hast per intersectrect ne for-schleife draus machen kannst (wenn du dazu z.b noch arrays nimmst).

Dieses Thema gab es übrigens schon öfters. kannst ja mal Delphi-Suche nehmen :lol:


Marc Walter - Mo 31.01.05 19:31

mir fällt grad auf, dass man label ja gar nicht als Variablennamen nehmen darf :oops:
nimm halt einfach n anderen namen


ploRa - Di 01.02.05 14:27

Ich wollt nur sagen das dieser thread geschlossen werden kann !
Und mich bedanken da es mir sehr weiter geholfen hat


matze.de - Di 01.02.05 15:42

guck mal oben bei dem thread gibt es ein häkchen-button klick da einmal drauf und dann weiß jeder,dass die frage beantwortet ist :)

mfg matze


Karlson - Di 01.02.05 15:57

Marc Walter hat folgendes geschrieben:
du kannst auch einfach intersectrect benutzen


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
...
var schnittmenge, label, image: TRect;
begin
  label := Rect(Label1.left,Label1.Top,
                Label1.left+Label1.Width,Label1.Top+Label1.Height);
  image := Rect(Image1.Left, Image1.Top,
                Image1.Left+Image1.Width,Image1.Top+Image1.Height);
  if intersectrect(Schnittmenge, label, image) then kollision;
end;
...


sieht auf den ersten Blick fast komplizierter aus, ist aber um einiges geschickter, da du, da du ja viele labels hast per intersectrect ne for-schleife draus machen kannst (wenn du dazu z.b noch arrays nimmst).

Dieses Thema gab es übrigens schon öfters. kannst ja mal Delphi-Suche nehmen :lol:



sieht praktisch aus. Aber wie definiert sich Schnittmenge?


Marc Walter - Mi 02.02.05 15:06

schnittmenge is einfach n Rechteck, das den bereich, in dem sich die 2 Rechtecke schneiden, enthält.

ausgeschrieben wär das dann so : if intersectrect(...) = true then ...
aber das = true kann man weglassen.

falls du genauer was drüber wissen willst, kann ich dir leider nicht helfen.


Karlson - Mi 02.02.05 15:24

Zitat:

schnittmenge is einfach n Rechteck, das den bereich, in dem sich die 2 Rechtecke schneiden, enthält.


Jo habs mir jetzt man angeschaut.
ich zuerst dass man dort festlegen, wie gross der Schnittbereich sein soll, damit die vierecke als Intersected gelten.
aber da ein unintialisiertes TRect ja schonmal einen Bottom von ~400000 hat, kann das nicht stimmen.
ist also ein reiner out-parameter

Marc Walter hat folgendes geschrieben:

ausgeschrieben wär das dann so : if intersectrect(...) = true then ...

Danke, aber das weiss ich auch ;)

Zitat:

falls du genauer was drüber wissen willst, kann ich dir leider nicht helfen.


ne, ist ja jetzt eigentlich alles klar.

danke!