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 end else begin 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!