Prüfen ob ein Entity an der Position eines anderen ist
Übersicht

![]() |
HubsiBetreff: Prüfen ob ein Entity an der Position eines anderen ist |
![]() 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 ![]() 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 |
![]() 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 |
![]() 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 |
![]() 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 |
![]() 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 |
![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielen Dank für die Hilfe erstmal. Das ursprüngliche Problem ist gelöst, schon kommt das nächste daher ![]() ![]() 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 |
![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Guter Tip, die Box lag wirklich am Nullpunkt der 3D-Welt. War einfach ein Fehler in der Reihenfolge der Positionierung/Erstellung ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
Midimaster |
![]() 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 |
![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzBasic: [AUSKLAPPEN] Graphics3D 800,600 |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du bist ein Schatz ![]() ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group