Entwickler-Ecke

Multimedia / Grafik - Kollision und Reaktion


Lord_Lore - Mo 16.11.09 22:30
Titel: Kollision und Reaktion
Hi, neu und schon am nerven, aber für irgendwas müssen Foren ja gut sein ;)

Hier mein Problem:

Ich habe zwei Bilder, von denen ich eins durch Tastendruck bewegen kann. Das Andere steht im Raum und macht nichts.
Wenn ich nun das bewegliche Bild gegen das unbewegliche steuere, nimmt das Programm die Kollision nicht wahr, wie gewünscht.
Also die erste Frage: Wie Funktioniert überhaupt eine Kollisionsabfrage in Delphi? Ich bin davon ausgegangen, dass ich einfach überprüfen lassen kann, ob die rechte Seite von Image1 gleich der linken Seite von Image2 ist. Mein Programm ist da allerding anderer Meinung...


Da ich befürchte, dass ich später vor dem Problem stehen werde hier gleich die zweite Frage:
Wie ist es machbar, dass das bewegliche Bild sich nicht weiter in Richtung des Objektes mit dem es kollidiert ist bewegt. Prinzipiell müste ich hierzu denke ich entweder den Tastendruck iggnorieren lassen, sobald eine Kollision stattfindet oder das bewegliche Bild "binden". Letztres halte ich für ziemlich unklug, da ich mich dann ja gar nicht mehr bewegen könnte (ich bin gerne bereit, mich vom Gegenteil überzeugen zu lassen), also suche ich eine Möglichkeit, den Tastendruck zu iggnorieren.

Für Hilfe jeder Art wäre ich dankbar ;)

Lord Lore


curtiss - Di 17.11.09 08:45

also vorerst hi und willkommen ^^

zum nächsten: dein bisheriger code wäre natürlich hilfreich um dir ansätze zu liefern..
nun denn

wegen kollision, du hast nur die werte top und left ein kollision prüfst du demnach ob

XAchse =
(BildA.top + BildA.höhe) >= BildB.top
(BildA.top + BildA.höhe) <= BildB.top + BildB.höhe

YAchse =
(BildA.left + BildA.Breite) >= BildB.left
(BildA.left + BildA.Breite) <= BildB.left + BildB.Breite

Es ist noch früh von daher kein gewähr ^^

wegen bild nicht weiterbewegen, du musst die prüfung auf kollision natürlich innerhalb der methode durchführen wo du das bild bewegst. Du weist ja wohinn das bild sich laut user bewegen soll. diese X/Y Kombination musst du prüfen ob es erlaubt ist (keine kollision) oder eben nicht (kollision) und in abhängigkeit davon die bewegung durchführen oder nich


Lord_Lore - Di 17.11.09 15:39

Soweit schonmal danke. Jetzt nimmt das Programm schonmal Kollisionen wahr, allerdings kann ich mich absolut nicht in Richtung des Objektes, mit dem ich kollidieren würde bewegen, will sagen: wenn das statische Bild links von mir ist, ist eine Bewegung nach Links unmöglich.

Der Code sieht so aus

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
if key=Vk_up then
 begin
 if (image3.top)>=image2.top+image2.Height
 then label1.Caption:='kollision'
 else
 z:=1;
  timer3.Enabled:=true;
  timer4.Enabled:=true;
 end;
if key=Vk_down then
 begin
 if (image3.top + image3.Height) <= image2.top + image2.Height
 then label1.Caption:='kollision'
 else
  z:=3;
  timer3.Enabled:=true;
  timer4.Enabled:=true;
 end;
if key=Vk_left then
 begin
 if (image3.left)>= image2.Left-image2.Width
 then  label1.caption:='kollision'
 else
  z:=2;
  timer3.Enabled:=true;
  timer4.Enabled:=true;
 end;
if key=Vk_right then
 begin
 if (image3.left-image3.width)<=image2.left
 then label1.caption:='Kollision'
 else
  z:=4;
  timer3.Enabled:=true;
  timer4.Enabled:=true;
 end;


und an anderer Stelle


Delphi-Quelltext
1:
2:
3:
4:
if z=1 then image3.Top:=image3.top-2;
if z=3 then image3.Top:=image3.top+2;
if z=2 then image3.left:=image3.left-2;
if z=4 then image3.left:=image3.left+2;


der Untere Teil, der ja die eigentlich Bewegung darstellt, ist an einen Timer gekoppelt, der auf die Bewegungsanimation zugeschnitten ist.


Edit: Bin gerade auf die Methode des Farbvergleiches gestoßen, was durchaus interessant klang, allerdings ist mir nicht ganz klar geworden, wie man auf einzelne Pixelfarben zugreifen kann. Wie immer bin ich für Hilfe und Kritk jeder Art und Weise dankbar


Lord Lore


FinnO - Di 17.11.09 17:07

Hinweis am Rande:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if BOOLEAN then
begin
  //Anweisungsblock
end
else
begin
  //Anweisungsblock II
end;


Flamefire - Di 17.11.09 17:51

ganz kurz: du hast ne logikfehler

nimm mal auf nem papier zahlenwerte und prüfe es
ansonsten steht die lösung schon im thread. du hast es nur falsch übernommen ;-)

mit pixelfarben ist nur am ende intressant, wenn es um teils transparente bereiche geht...


Lord_Lore - Di 17.11.09 18:59

Jo, Problem gelöst, danke an Alle, die so schnell und kompetent geholfen haben ;)


Lord Lore