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

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Hubsi

Betreff: Prüfen ob ein Entity an der Position eines anderen ist

BeitragMo, Jan 21, 2013 11:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile 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

BeitragMo, Jan 21, 2013 12:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jan 21, 2013 12:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jan 21, 2013 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jan 21, 2013 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Twitter

BladeRunner

Moderator

BeitragMo, Jan 21, 2013 20:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jan 28, 2013 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für die Hilfe erstmal. Das ursprüngliche Problem ist gelöst, schon kommt das nächste daher Very Happy 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 Smile Falls es was hilft sind das die Codeausschnitte die den Pivot bzw. Mesh betreffen:

vorbereitendes Zeug
BlitzBasic: [AUSKLAPPEN]
; Meshes laden
p.player=New player ; Spielfigur erstellen
p\z=3.0 ; Debug: Daten aus Mapfile ziehen
p\y=0.5
p\x=3.0
p\entity_nr=LoadMesh(".\meshes\player.b3d")
p\coll_nr=1
EntityShininess p\entity_nr,0.1
p\pivot=CreatePivot()
EntityType p\pivot,31 ; Type für Pivot ist immer Collisionsnr. + 30
EntityParent p\pivot,p\entity_nr
PositionEntity p\entity_nr,p\x,p\y,p\z
EntityType p\entity_nr,1
EntityParent cam,p\entity_nr


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
Collisions p\coll_nr,99,2,3
Collisions p\coll_nr+30,100,2,3

tmp_int=CountCollisions(p\pivot)
jump_possible=False
If tmp_int>0 Then
jump_possible=True
; Debug: Kollisionsliste löschen?
EndIf


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? Smile

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

BeitragMo, Jan 28, 2013 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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)
ScaleEntity p\Pivot , 10, 0.1 , 10
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Hubsi

BeitragMo, Jan 28, 2013 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Guter Tip, die Box lag wirklich am Nullpunkt der 3D-Welt. War einfach ein Fehler in der Reihenfolge der Positionierung/Erstellung Smile 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

BeitragMo, Jan 28, 2013 18:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

EntityType MapMesh, 333 ; aber wahrscheinlich sind das ganz viele, oder?
; dann müsste sowas wie eine FOR/EACH rein und alle bekommen die Kennung 333???

; jetzt prüfung enschalten:

Collisions 222,333,2,2

Repeat
.....
UpdateWorld()
tmp_int=CountCollisions(p\pivot)





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

BeitragMo, Jan 28, 2013 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Midimaster

BeitragMo, Jan 28, 2013 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Graphics3D 800,600

SetBuffer BackBuffer()
For i=0 To 100
Cube=CreateCube()
MoveEntity cube, Rnd(100) , 0,Rnd(100)
EntityType Cube,100
Next

Global Player =CreateCube()
EntityColor Player,255,0,0
EntityType Player, 1


camera=CreateCamera( Player)
MoveEntity camera, 0,4,-10
AmbientLight 111,111,111
Collisions 1,100,2,2

Repeat
UpdateWorld()
RenderWorld()
If CountCollisions(Player)
DebugLog "COLLI"
Else
DebugLog "no"
EndIf
If KeyDown(205)
dir=-1
ElseIf KeyDown(203)
dir=1
EndIf
TurnEntity Player, 0,dir,0
MoveEntity Player,0,0,.1
Flip 1
Until KeyHit(1)

Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Hubsi

BeitragMo, Jan 28, 2013 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Du bist ein Schatz Mr. Green 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 Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group