Registriert: Mi Jan 05, 2011 14:55 Beiträge: 47
Programmiersprache: Delphi, C++,C
Hallo ans Forum, ich hab eine kleine Frage. Und zwar: Ich wollte eine einfache Kollisionskontrolle schreiben. Doch bevor ich anfange etwas zu schreiben, dass nicht klappt wollte ich fragen, ob es sinvoll ist, das ich alle Positionen von Gegenständen innerhalb der Karte speichere und dann abfrage, ob sie kollidieren. Ich könnte mir vorstellen, das dies sehr langsam ist, wenn man eine große Map hat. Falls ihr gute Tutorials zu dem Thema (außerhalb dieser Website, denn die hab ich schon durchgearbeitet) kannt, schreibt sie bitte. Auch über andere Lösungsvorschläge würde ich mich freuen. MfG nuclear
Wenn ich richtig informiert bin hast du eine 2D-Map, korrekt? Du solltest in einem neuen Thread immer kurz schreiben was du eigentlich machst, nicht alle Leute lesen alle Threads hier im Forum.
Was sind den "Gegenstände"? Liegen die nur in der Gegend herum oder können die sich auch bewegen? Bei unbeweglichen Objekten kannst brauchst du nur gegen bewegte Objekte (z.B. Spieler) testen, jedenfalls nicht die unbeweglichen Objekte untereinander, weil diese niemals kollidieren können.
Sowohl zum rendern als auch für den Kollisionstest macht es Sinn, wenn du unbewegliche Objekte in eine Baumstruktur einsortierst. Da deine Map 2D ist bietet sich ein QuadTree an.
Als Alternative zu Baumstrukturen kann auch eine Grid-Struktur Sinn machen. Letzteres ist wahrscheinlich das was du sowieso schon vor hattest, jedenfalls lese ich das aus "Gegenständen innerhalb der Karte speichere" heraus Die Idee ist eben ein gleichmäßiges Grid über die Map zu legen und jeder Grid-Zelle die unbeweglichen Objekte zuzuordnen die sich darin befinden. Aus der Position des Spielers (etc.) berechnest du dir die vier Grid-Zellen in der Umgebung und testest nur die Objekte in diesen vier Zellen. Die Größe der Grid-Zellen solltest du so wählen das du im Durchschnitt ca. 5-10 Objekte pro Zelle hast.
Pro Baum: Gut für ungleichmäßige Verteilung der Objekte => spart Speicher! Contra Baum: Ggf. aufwendiger zu implementieren
Pro Grid: Gut für gleichmäßige Verteilung der Objekte => Speicher wird sowieso gebraucht => schneller Contra Grid: Verschwendet Speicher wenn es große (nahezu) leere Bereiche gibt.
Sollten sich deine Objekte bewegen brauch ich mehr Infos über dein Projekt um dir zu sagen welche Art von Index-Struktur hier sinnvoll ist. Den bewegliche Objekte ständig neu in den Baum ein zu sortieren um sie dann wieder zu finden bringt auch keinem was.
Registriert: Mi Jan 05, 2011 14:55 Beiträge: 47
Programmiersprache: Delphi, C++,C
Danke für die Antwort. Also ich habe eine 2D-Map, aber wollte es so schreiben, dass ich die Funktion auch einfach umändern kann, damit sie auch für 3D-Karten klappt. Ja ich wolle es in einer Gridstrucktur speichern, nur ich dachte mir, das es bei zu großen Karten, je nach System, lange dauern würde, die Objekte zu finden , welche in der Nähe des Spielers sind, und auf eine Kollision zu prüfen. Ach ja und es sind unbewegliche Objekte.
Danke schoneinmal für die Tips. Ich werd versuchen sie umzusetzen.
nur ich dachte mir, das es bei zu großen Karten, je nach System, lange dauern würde, die Objekte zu finden , welche in der Nähe des Spielers sind,
Ne, das geht schnell:
Angenommen deine Gridzellen sind jeweils G Einheiten groß und du willst einen Bereich mit Radius R abfragen. Dann bekommst du den Grid-Koordinaten-Bereich so:
Code:
min.x = (position.x - R) / G min.y = (position.y - R) / G max.x = (position.x + R) / G max.y = (position.y + R) / G
(Achtung "/" ist hier eine Integer-Division...ist in Delphi glaube ich "div" !)
Also letztlich eine Doppelschleife über die Gridzellen in diesem Bereich. Das geht unabhängig von der Mapgröße immer gleich schnell. Dumm ist halt nur wenn du viele leere Gridzellen hast und somit Speicher verschwendest. Letztlich braucht eine Grid-Zelle aber nur ein Pointer auf ein dynamisches Array mit den Objekten drin sein. Wenn die Zelle leer ist setzt du den Pointer auf NULL (bzw. "NIL") und brauchst dann nur 8 Byte pro Gridzelle (*).
Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.