Hilfe bei Pixelgenauer Kollision
-
Hi ich bräuchte eine Pixelgenaue Kollision ich hab bis jetzt nur eine BB Kollision jedoch ist das hier nicht so ganz gut.
Sieht so aus:int left1, left2; int right1, right2; int top1, top2; int bottom1, bottom2; left1 = Sprite1->GetXPos(); left2 = Sprite2->GetXPos(); right1 = Sprite1->GetXPos() + Sprite1->GetWidth(); right2 = Sprite2->GetXPos() + Sprite2->GetWidth(); top1 = Sprite1->GetYPos(); top2 = Sprite2->GetYPos(); bottom1 = Sprite1->GetYPos() + Sprite1->GetHeight(); bottom2 = Sprite2->GetYPos() + Sprite2->GetHeight(); if (bottom1 < top2) return(0); if (top1 > bottom2) return(0); if (right1 < left2) return(0); if (left1 > right2) return(0); return(1);Ich bräuchte also nun eine Pixelgenaue Kollisionsabfrage ich hab schon viel gesucht aber das meist war für Visual Basic...
Hat jemand Code für eine Pixelgenaue Kollision in C++ + DirectDraw?
Wäre echt toll weil alleine kriege ich das ganze leider nicht hin da ich in Mathe nicht so fit bin.
Sorry falls es so einen Post schon öfter gab aber ich hab schon sehr viel im Forum gesucht aber ich finde nichts passendes
Gruß
Danke
-
Prinizipiell brauchst du einfach nur schauen, ob sich zwei nicht-transparente Pixel überlappen. Allerdings ist das am Ende meist recht lahm und auch unnütz, auser es handelt sich um GUI Elemente.
Bye, TGGC (Demo or Die)
-
Hi,
danke für deinen Beitrag
Wenn das so lahm ist und unnütz ist wie soll ich dann am allerbesten eine Kollision abfragen?
Klar, ich könnte ohne arbeiten, aber eigentlich würde das ganze ohne nicht mehr funktionieren *lol*
Daher wie soll ich das ganze genau anstellen und wie mache ich das, dass ganze in angemessener Geschwindigkeit abläuft?Beispielcode wäre echt toll

Gruß
Danke
-
Für was soll denn die Kollisionsabfrage sein? Dann kann man auch sagen, was angemessen wäre.
-
Die Kollision sollte auch für Sprites wie Raumschiffe oder ähnlcihes Einsetzbar sein daher ist wohl eine Pixelgenaue Kollision am besten...
Eine BoundingBox Kollision habe ich schon allerdings ist sowas für den oben genannten Zweck eher ungeeignet
Wie gesagt Beispielcode wäre am besten

Gruß
-
Bleib doch einfach bei den BBs.
Bye, TGGC (Demo or Die)
-
Kombiniere doch beides.
wenn BoundingBoxKollision { wenn PixelgenaueKollision { zeichne fette Explosionsgfx :P } }Hat den Vorteil, dass die pixelgenaue Kollisionsabfrage(performance!) nur stattfindet, wenn eine Boundingboxkollision passiert.
Bei deinem Ursprungsproblem kann ich dir trotzdem nicht viel helfen. Ich habe keine Ahnung von VB, aber das Prinzip von der pixelgenauen Kollision ist wie folgt:
für jeden (sichtbaren) Pixel in Bild 1 { für jeden (sichtbaren) Pixel in Bild 2 { wenn an gleicher Position kollision passiert } }
-
Hi,
ne ich wollte das ganze nicht in VB haben sodern schon in C++ daher könntest du mir dabei doch helfen
Gruß
-
Pixelgenaue Kollision ist nicht sinnvoll, weil es dir dann später unmöglich ist, die Darstellung (z.B. auf 3D) umzustellen oder das Raumschiff-Bitmap zu ändern, ohne die ganze Logik mitzureißen. Nimm Bounding-Polygone, vielleicht reicht ein Rechteck ja auch. Du kannst auch den Raum, den ein Raumschiff ausfüllt, mit mehreren Rechtecken abdecken, aber pixelgenau ist nicht sinnvoll.
-
Hi danke für die Antwort,
das was du geschrieben hast hört sich recht verständlich an, aber unter einer Bounding-Polygone kann ich mir nichts drunter vorstellen und ich habe diesen Begriff auch noch nicht gehört. Ich hab schon bei Google danach gesucht aber leider nicht soviel gefunden. Hätte da jemand etwas Beispielcode wie das genau aussieht und was dass für das Raumschiff bedeutet wenn ich das ganze so mache? Bleibt das raumschiff dann nicht mehr an ecken hängen weils an einer Seite länger ist?Also Beispielcode wäre auch hier wieder echt toll

Gruß
Danke
-
Naja ... er hat das ein wenig verkehrt bezeichnet ^^
Ich denke er meint Bounding-Boxes ... das sind gedachte Körper um ein Objekt! Man misst sie meist am Größten Koordinaten Ausschlag!
-
Von BoundingBoxes war ja die ganze Zeit die Rede.
Meinst du vielleicht sowas:http://bloody-blades.de/shit.jpg *g*
?
-
Auf jeden Fall ein witziges Bild ^^
Ich seh nur keine Mauer :p
-
FoxDie schrieb:
Auf jeden Fall ein witziges Bild ^^
Ich seh nur keine Mauer :pDas Graue soll die Mauer sein; ich habs nur leider ungünstig gemalt und den Text auf die Mauer geschrieben.
Eine Kollision findet statt, wenn die Boundingbox die Mauer schneidet.::edit:: is doch sogar en gelbes Kreuz an der Kollisionsstelle

-
Hi Danke,
wie im ersten Beitrag beschrieben habe ich für eien ganz normale Bounding Box Kollision, also ein Rechteck schon Code...
Wenn ich aber nun für jedes Objekt so eine Angepasste Box -wie oben im Bild- machen würde wäre das wohl extrem viel Arbeit!
Gibt es code der sich sowas ähnliches selber berechnet?
Wobei dann ja eigentlich immernoch die Kollision VOR dem Raumschiff statt findet, aber wäre sicher als Schutzschild gut *g*Ich weiss nun nicht genau was ich nehmen soll da die Pixelgenaue zu langsam ist und die andere (Raumschiff Beispiel-Bild) anscheinend zuviel Aufwand erzeugt (da ich mit RECTs sowieso schon nicht so gut klar komme *g*)
Was sollte ich an euer Stelle wohl nun tuen?
Gruß
PS: Heisst es tun oder tuen?!
Danke
-
Nimm doch eine Box als vorprüfung ... nicht jeder Schuß trifft ... wenn die Box eine Kolision anzeigt, dann überprüfst du ob ein Kolision bzw. Wo genau eine statfinden tut. Um die Berechnungszeit ein wenig zu verringern machst du eine Vorprüfung
z.B.
Kugel bewegt sich auf Y200 entlang der X Achse ... die BB meldet eine wahrscheinliche Kolision ... Überprüfe welchen Teil des Schiffes die Kugel treffen könnte (Rechts-Oben, Links-Oben, Rechts-Mitte usw.) ... jetzt prüfst du diesen Abschnitt der Matrix auf Kolision
-
Du müsstest dir ein kleines Programm schreiben, wo du dein Bild laden und dann mit der Maus die Boundind-*Striche* ziehen kannst. Die Koordinaten der Eckpunkte werden dann in eine extra Datei geschrieben.
E.g.
Du hast die Dateien banana.jpg und banana.bbd (bounding box data :P)Das Bild wird an Position x|y gemalt.
In banana.bbd steht jetzt, dass die Boundingbox die Eckpunkte an 35|4, 48|10 und 20|8 hat.
Dann sind deine Eckpunkte der Boundingbox ingame dann eben x+35|y+4 (z.B.)
-
Dummie schrieb:
PS: Heisst es tun oder tuen?!
Danke
Hallo Dummie,

es heißt tun.
-
xindon schrieb:
Du müsstest dir ein kleines Programm schreiben, wo du dein Bild laden und dann mit der Maus die Boundind-*Striche* ziehen kannst. Die Koordinaten der Eckpunkte werden dann in eine extra Datei geschrieben.
E.g.
Du hast die Dateien banana.jpg und banana.bbd (bounding box data :P)Das Bild wird an Position x|y gemalt.
In banana.bbd steht jetzt, dass die Boundingbox die Eckpunkte an 35|4, 48|10 und 20|8 hat.
Dann sind deine Eckpunkte der Boundingbox ingame dann eben x+35|y+4 (z.B.)
Du meinst collision shapes ?

-
Netzwerk-Latenz schrieb:
Du meinst collision shapes ?

GANZ GENAU!

Ich wusste nicht wie es heißt, dankeschön

Also Threadersteller, mein Vorschlag sind wie schon gesagt Bounding Shapes / Collision Shapes.