Prüfen ob ein Entity an der Position eines anderen ist
Übersicht BlitzBasic Blitz3D
HubsiBetreff: Prüfen ob ein Entity an der Position eines anderen ist |
Mo, Jan 21, 2013 11:18 Antworten mit Zitat |
|
---|---|---|
Hai besiammen.
Ich mache gerade meine ersten wackeligen Gehversuche in 3D und möchte einen Map-Editor für ein einfaches Spiel entwickeln. Dieser Editor soll nun Cubes in einem 1-1-1 Raster setzen (und löschen, aber das ist nicht das Problem) können. Die Positionen der einzelnen Würfel werden in einem Type-Konstrukt gespeichert. Der Cursor der die Position anzeigt und an dessen Stelle auch ein Würfel erstellt/gelöscht wird soll nun dahingehend überprüft werden ob dort schon ein Würfel ist. In der Hilfe habe ich dazu nichts gefunden, was auch daran liegen kann das ich mit meinem mageren 3D-Wissen vielleicht auch die falsche Kategorie durchsucht habe Jetzt fallen mir nur zwei Möglichkeiten ein das ganze zu "umschiffen". Entweder ich iteriere die ganze Type-Liste durch bis ich eine gleiche Position gefunden habe bzw. nicht finde, oder ich bastel das Konstrukt auf ein Array um was zwar deutlich schneller in der Programmausführung wäre, aber auch nennenswert mehr Speicher für Leerfelder verbraten würde. Hat jemand eine bessere Lösung für mich oder gehts ohnehin nicht anders? Wer sich unter meinem Geschwätz nichts vorstellen kann hat hier Möglichkeit den Code einzusehen und probieren: https://www.blitzforum.de/upload/file.php?id=12202 |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Midimaster |
Mo, Jan 21, 2013 12:00 Antworten mit Zitat |
|
---|---|---|
Nennenswert mehr Speicher ist relativ
also bei einem Spielfeld von 1000x1000 Tiles sind das 1.000.000 Tiles und braucht ungefähr so 4MB Speicher. Das dürfte einen akt. Rechner nicht wirklich stören. Wenn Du für die Tiles ein Array anlegst, kann Du sie nach Koordinaten finden und gleichzeitig steht dir aber weiterhin die Objektliste für FOR/EACH Aktionen zur Verfügung. Ich würde es so machen. |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
Hubsi |
Mo, Jan 21, 2013 12:30 Antworten mit Zitat |
|
---|---|---|
Vielen Dank für die Hilfe. Ich habe es jetzt mal probehalber auf Array umgebastelt und denke dabei wirds auch bleiben. Schon allein weil es von der Handhabung her deutlich einfacher und prozessicherer wird. | ||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Jan_Ehemaliger Admin |
Mo, Jan 21, 2013 15:58 Antworten mit Zitat |
|
---|---|---|
In dieser Größe, würde ich auch mit einen Array arbeiten, ansonsten, das geänderete Cube, mit den restlichen vergleichen und wenn XYZ gleich, dann geht net. | ||
between angels and insects |
skey-z |
Mo, Jan 21, 2013 19:57 Antworten mit Zitat |
|
---|---|---|
Alternativ kannst du es auch über das Picken heraus bekommen, wenn du den Cubes einen EntityType verpasst und nur einen neuen an der Position erstellst, wenn das gepickte Objekt der Ebene/Plane entspricht, somit ist es auch bei Types kein Problem.
Zudem kannst du ja auch Types und Array kombinieren um mehr Flexibilität zu bekommen. Wenn du zum Beispiel nicht nur die position, sondern auch die Farbe und andere Werte mit speichern willst, wird ein normales Array sehr schnell aufgebläht, dann bietet sich die Kombination aus beiden an. |
||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
BladeRunnerModerator |
Mo, Jan 21, 2013 20:11 Antworten mit Zitat |
|
---|---|---|
In drei Dimensionen wächst der Speicherverbrauch ja exponentiell schneller zu zwei Dimensionen, daher ist es schon sinnig sich Gedanken zu machen.
Eine einfache Lösung könnte es sein anstatt einer simplen Typeliste einen Binärbaum zu implementieren und die Position der Cubes in einem Integer zu verschlüsseln. Einfachste Version wäre eine Begrenzung auf 256³ Volumen für die map, dann kann jede Position mit einem Byte pro Achse im Integer verschlüsselt werden. Da kommen wir dann auch durchaus schon in relevante Speichergrößen wenn viele Blöcke gesetzt sind. Wenn man keine Probleme damit hat ein wenig mit den Rotationsbefehlen (SHL, SHR) zu spielen ist das problemfrei erweiterbar auf 2048*2048*1024 große Maps. Durch die Verschlüsselung anhand dieser Kennzahl in einem Binärbaum wird jeder Cube in maximal 32 Suchschritten gefunden, der Großteil deutlich früher. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Hubsi |
Mo, Jan 28, 2013 15:52 Antworten mit Zitat |
|
---|---|---|
Vielen Dank für die Hilfe erstmal. Das ursprüngliche Problem ist gelöst, schon kommt das nächste daher Ich bastel derzeit am Spiel an sich rum und muß dabei wissen ob das Spielermesh mit den Füßen kollidiert. Aber eben nur mit den Füßen. Dazu hab ich mir überlegt einen Pivot zu erstellen um den auf Kollsion mit der Map zu prüfen, aber das funktioniert nicht, oder ich mach es falsch Falls es was hilft sind das die Codeausschnitte die den Pivot bzw. Mesh betreffen:
vorbereitendes Zeug BlitzBasic: [AUSKLAPPEN] ; Meshes laden In der Hauptschleife (Type 100 sind die Blöcke der Map, 99 eine Plane als Boden quasi) BlitzBasic: [AUSKLAPPEN] Collisions p\coll_nr,100,2,2 Mein Gedanke war das der Pivot am Nullpunkt des Meshes erstellt wird und somit die Variable jump_possible nur dann True ist wenn das Mesh festen Boden unter den Füßen hat, aber tmp_int bleibt stur auf False. Hätte vielleicht jemand Lust mir einen Schubs in die richtige Richtung zu geben? Nachtrag: Weil ich öfter mal in der Hilfe darüber stolper, was ist ein "Normal" bzw. eine "Normale"? Der Begriff wird dort gerne mal verwendet, aber nirgends erklärt? |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Midimaster |
Mo, Jan 28, 2013 16:58 Antworten mit Zitat |
|
---|---|---|
Schreibe gleich bei CreatePivot() als Paramter das Parent-Entity rein...
BlitzBasic: [AUSKLAPPEN] p\pivot= CreatePivot(p\entity_nr) ..dann befindet sich das Pivot gleich am Nullpunkt deines 3D-Objektes. Allerdings ist nicht sicher, ob dieser Nullpunkt wirklich bei den Füßen liegt! Erzeuge kurz mal einen Cube statt des Pivot, damit Du seine Lage sehen kannst. BlitzBasic: [AUSKLAPPEN] p\pivot= CreateCube(p\entity_nr) |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
Hubsi |
Mo, Jan 28, 2013 17:41 Antworten mit Zitat |
|
---|---|---|
Guter Tip, die Box lag wirklich am Nullpunkt der 3D-Welt. War einfach ein Fehler in der Reihenfolge der Positionierung/Erstellung Kann ich jetzt noch in Echtzeit herausbekommen ob dieser Würfel (bzw. der Pivot dann) mit der Map kollidiert? | ||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Midimaster |
Mo, Jan 28, 2013 18:33 Antworten mit Zitat |
|
---|---|---|
naja,...
jetzt muss das p\pivot eine Kollisions-ID bekommen und dann die Map eine andere Und dann kann man die beiden auf Kollision untersuchen lassen BlitzBasic: [AUSKLAPPEN] EntityType p\pivot, 222 so ganz sicher bin ich mir hier nun auch nicht, weil ich hja nicht weiss, wie du deine map organisiert hast. Snd das lauter Entitys?## |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
Hubsi |
Mo, Jan 28, 2013 18:58 Antworten mit Zitat |
|
---|---|---|
Die Map besteht aus einer variablen Menge Cubes, aber es haben alle den Type 100. Das funktioniert in einer einzigen Kollisionsabfrage recht gut. Das heißt ich prüfe den Pivot auf Type 99 (die Plane, also der Boden quasi), dann noch auf Type 100 (alle Würfel auf der Map) und schließlich das Mesh auf 100. Insgesamt also 3 Collisions im Code. Mit welchem der Würfel dabei das Pivot kollidiert ist für mich nicht relevant, lediglich das ob. Und da häng ich so dermaßen fest das es eine wahre Freude ist | ||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Midimaster |
Mo, Jan 28, 2013 19:52 Antworten mit Zitat |
|
---|---|---|
BlitzBasic: [AUSKLAPPEN] Graphics3D 800,600 |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
Hubsi |
Mo, Jan 28, 2013 21:11 Antworten mit Zitat |
|
---|---|---|
Du bist ein Schatz Mit CountCollisions hatte ich auch schon rumprobiert, aber in der ganz falschen Weise. Du hast soeben eine Woche Rätselraten und Quatsch coden beendet. Danke | ||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Übersicht BlitzBasic Blitz3D
Powered by phpBB © 2001 - 2006, phpBB Group