Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 12, 2025 12:49

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kollisionskontrolle
BeitragVerfasst: Mo Jan 10, 2011 13:16 
Offline
DGL Member

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisionskontrolle
BeitragVerfasst: Mo Jan 10, 2011 14:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

Bezüglich Bäumen, schau dir mal das hier an:
http://wiki.delphigl.com/index.php/Tech ... stechniken

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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisionskontrolle
BeitragVerfasst: Mo Jan 10, 2011 17:35 
Offline
DGL Member

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.

MfG nuclear


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisionskontrolle
BeitragVerfasst: Mo Jan 10, 2011 17:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
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 (*).

(*) auf einem 32bit System sogar nur 4 Byte.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisionskontrolle
BeitragVerfasst: Mo Jan 10, 2011 18:05 
Offline
DGL Member

Registriert: Mi Jan 05, 2011 14:55
Beiträge: 47
Programmiersprache: Delphi, C++,C
Coolcat hat geschrieben:

(Achtung "/" ist hier eine Integer-Division...ist in Delphi glaube ich "div" !)

Jo das stimmt, Delphi kann ich ganz gut :D

Danke für die Antwort


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]