Kollisionserkennung 2D

HI,

Ich möchte mit der Maus einen Kreis bewegen. Über das Netzwerk können dann auch andere User dem Game beitreten. D.h. es bewegen sich mehrer Kreise am Bildschirm. Nun soll eine Kollision erkannt werden und die zwei kollidierende Kreise sollen dann nicht ineinander fahren können, d.h. sie sollen voneinander sozusagen abprallen. Die Kollisionserkennung mit "abprallen" funktioniert schon mal aber nur mit statischen Objekte (Koordinaten im vorhinein bekannt) aber wie funktioniert das mit nicht statischen Objekten (Koordinante nicht bekannt, änder sich ständig) Hoffe ihr habt mein Problem verstanden und ihr könnt mir helfen!!!

Link zum Programm-Code:

PROGRAMM
Danke Im Voraus

MfG the.mole
 
du musst die koordinaten der dynamischen objekte halt irgendwie auslesen. ich mein wenn du das objekt nach jeder bewegung neu zeichnest, müssen ja irgendwo diese koordinaten gespeichert sein.
danach sollte kollisionserkennenung wohl genau wie bei den statischen objekten funktionieren.
 
Hi !

du kannst es z.b so machen (vb)

for i =0 to kreisanzahl
abstand = kreis(i).x - kreis(i+1).x
if abstand < 0 then
-abstand
end if
if abstand < kreisradius*2 then 'hab das mal 2 vergessen
kollision
end if
next i

so in der richtung...
das gleiche noch mit der y koordinate und schon hat man ne kollisionserkennung für kreise
achso das funktioniert so aber nur wenn die kreise gleichgroß sind ... sonst musst du es noch ein bisschen anpassen


MfG ehy_key
 
Code:
for i =0 to kreisanzahl
abstand = kreis(i).x - kreis(i+1).x
if abstand < 0 then
-abstand
end if
if abstand < kreisradius*2 then 'hab das mal 2 vergessen
kollision
end if
next i

aber so wie ich das verstehe, funktioniert die methode doch nur, wenn die kreise auf der selben höhe sind, da ja die variable abstand nur den waagrecheten abstand bezeichnet. wenn sie also "verschoben" sind, muss das ja nicht mehr stimmen..
kann sein dass ich jetz nen denkfehler drin hab, aber ich wuerd den richtigen abstand (den diagonalen) abstand ueber den satz des pythagoras errechnen, und diesen dann mit 2*r vergleichen und darauf meine kollision erhalten.. werd mal noch n bild dazu machen damit man sich bissl auskennt was ich mein, zu erklären bin ich zu blöd..
 
du hast wohl das überlesen

"das gleiche noch mit der y koordinate und schon hat man ne kollisionserkennung für kreise"

vollkommen richtig man kann auch ein "dreieck" drauß machen und die hypothenuse ausrechnen und hat so die entfernung

würde dann z.b so aussehen

for i =0 to kreisanzahl
abstand = Sqr((kreis(i).x - kreis(i+1).x) ^ 2 + (kreis(i).y - kreis(i+1).y) ^ 2 )
if abstand < kreisradius*2 then
kollision
end if
next i
 
nö hab ich nich ueberlesen, hab nur gedacht es stimmt trotzdem net. naja mittlerweile hab ichs eingesehen, beim versuch, das ganze in ner grafik zu veranschaulichen bin ich drauf gekommen dass ich mal wieder mist geredet hab =) aber wenn ich das so anschau, isses ja von der code-länge auch ziemlich reduziert, also wars vielleicht doch net mal soo schlecht...
 
Die Kollisionserkennung funktioniert ja schon, aber meine Frage war ja eigentlich wie mann es schafft das man mit den Kreisen nicht ineinanderfahren kann.

Richtig:

Nan282013.direkt.jpg


Falsch:

Jeri625311.direkt.jpg


Hoffe ihr habt verstanden was ich meine!!!

Vielen dank schon mal im Voraus

MFG
 
Original von heinzelJacKy
nö hab ich nich ueberlesen, hab nur gedacht es stimmt trotzdem net. naja mittlerweile hab ichs eingesehen, beim versuch, das ganze in ner grafik zu veranschaulichen bin ich drauf gekommen dass ich mal wieder mist geredet hab =) aber wenn ich das so anschau, isses ja von der code-länge auch ziemlich reduziert, also wars vielleicht doch net mal soo schlecht...

ja deine idee ist von der code länge besser ... :D

MfG ehy_key


@the.mole

naja bei kollision ebend die koordinaten auf den alten wert legen bevor ein kreis bewegt wurde, das schaffst du in dem du immer vor einer bewegung die koordinaten der kreise in variablen lädst und dann einfach bei einer kollision die kreise mit den alten werten belegst...

MfG ehy_key
 
Zurück
Oben