[B3D]Einfache Map-Lade-Routine
Übersicht

![]() |
Kernle 32DLLBetreff: [B3D]Einfache Map-Lade-Routine |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hier eine "kleinigkeit", die ich mal für ein paar Engine-Tests meinerseits
geschrieben habe, und für einen Thread im Beginnerscorner dokumentiert habe ![]() Also, hier kommt er.... Code: [AUSKLAPPEN] ;Variablen und Type Felder:
Type WorldObject Field Name$ ;Name ? Field mesh ;BB Mesh-Stream (...BB...) Field brush ;BB Brush-Stream (...BB...) Field surface ;BB Surface-Stream (...BB...) Field texture ;BB Textur-Stream (...BB...) Field Pivot ;BB Pivot-Stream (...BB...) Field Nr% ;Nummer Identifikation (1 - unlimited) Field ObjectMode% ;Object Mode (Mesh, Block) Field X_Cord ;Absolute X-Cordinate (unlimited) Field Y_Cord ;Absolute Y-Cordinate (unlimited) Field Z_Cord ;Absolute Z-Cordinate (unlimited) ;Wenn mans nicht braucht, löschen...Siehe Code... Field PivotCordAdd1 ;Pivot X-Cord addition (unlimited) Field PivotCordAdd2 ;Pivot Y-Cord addition (unlimited) Field PivotCordAdd3 ;Pivot Z-Cord addition (unlimited) End Type Global WorldObject.WorldObject Global LoadedWorldObjects Code: [AUSKLAPPEN] Function call_CreateGameWorld (MapName$)
;================================= ;World Creation ;================================= ;--------------------------------------------- Datei = ReadFile(".\Maps\"+MapName$) While Not Eof (Datei) .ReadAgain Cache$ = ReadLine(Datei) ;prüfe ob zwischen den "Objekten" eine Leerzeile oder ein Kommentar ist ( //Komentar ) If Cache$ = "" Or Left(Cache$,2) = "//" Then Goto ReadAgain ;Füge ein neues Objekt hinzu WorldObject = New WorldObject LoadedWorldObjects = LoadedWorldObjects + 1 ;Lesen den Typ des Objektes aus. Nicht perfekt, funktioniert aber ;) If Right(Cache$,Len("MeshBlock")) = "MeshBlock" WorldObject\ObjectMode = 1 Cache$ = Left(Cache$,Len(Cache$)-Len("MeshBlock")) EndIf If Right(Cache$,Len("EntityBlock")) = "EntityBlock" And WorldObject\ObjectMode = 0 WorldObject\ObjectMode = 2 Cache$ = Left(Cache$,Len(Cache$)-Len("EntityBlock")) EndIf ;Was ist was ? ;============= ;MeshBlock ;--------- ;MeshBlock ist ein Objekt, das das Programm mithilfe von kordinanten ;zusammensetzt. Wenn man sich den unteren Code anschaut, sollte man es ;verstehen ;) ;--------- ;EntityBlock ;--------- ;EntityBlock hat nicht umbedingt was mit Blocks zu tun, EntityBlock gibt ;im grunde nur an, das kein Objekt programm intern "generiert" werden ;muss (wie bei MeshBlock), sondern einfach geladen werden kann. ;Beispielsweise ein .x oder ein .3ds file. ;Für Debugging den Namen speichern, und eine Nummer vergeben. ;(letzteres ist nicht nötig, aber später evt. hilfreich) WorldObject\Name = Trim(Cache$) WorldObject\Nr = LoadedWorldObjects ;Das { überlesen ReadLine(Datei) ;Texturpfad/Name auslesen, und direkt in die entsprechende Variable Laden WorldObject\Texture = LoadTexture(Replace(Replace(Trim(ReadLine(Datei)),"Texture = ",""),Chr(34),"")) ;Die Start-Kordianten für das Objekt einlesen WorldObject\X_Cord = Replace(Replace(Trim(ReadLine(Datei)),"X-Cord = ",""),Chr(34),"") WorldObject\Y_Cord = Replace(Replace(Trim(ReadLine(Datei)),"Y-Cord = ",""),Chr(34),"") WorldObject\Z_Cord = Replace(Replace(Trim(ReadLine(Datei)),"Z-Cord = ",""),Chr(34),"") ;Experimentelle Spielerei, die den Nullpunkt des Objektes verschieben soll. ;Im Grunde sinnlos, es sei denn, man will sein Objekt drehen. WorldObject\PivotCordAdd1 = Replace(Replace(Trim(ReadLine(Datei)),"X-Cord Center Add = ",""),Chr(34),"") WorldObject\PivotCordAdd2 = Replace(Replace(Trim(ReadLine(Datei)),"Y-Cord Center Add = ",""),Chr(34),"") WorldObject\PivotCordAdd3 = Replace(Replace(Trim(ReadLine(Datei)),"Z-Cord Center Add = ",""),Chr(34),"") ;-------------------------------------------------------- Select WorldObject\ObjectMode ;-------------------------------------------------------- Case 1 ;-------------------------------------------------------- ;Das folgende ist SEHR kompliziert ! ;NUR verwenden wenn man es einigermaßen verstanden hat ! WorldObject\mesh = CreateMesh() ;Neues Mesh erstellen WorldObject\brush = CreateBrush(255,255,255) ;Neuen Brush erstellen ;Wenn eine Textur vorhanden ist, auf den Brush legen If WorldObject\Texture <> 0 Then BrushTexture WorldObject\brush,WorldObject\Texture ;Eine Surface mithilfe des Meshes und des Brushes erstellen WorldObject\surface = CreateSurface(WorldObject\mesh,WorldObject\brush) While Not Eof (Datei) .ReadAgain2 Cache$ = ReadLine(Datei) If Cache$ = "" Or Left(Cache$,2) = "//" Then Goto ReadAgain2 If Cache$ = "}" Then Goto ReadEnd ;Ende des Objektes erreicht ;Folgendes ist entweder selbsterklärend, oder völliger quatsch ^_^ o = Instr(Cache$,",") XCord = Left(Cache$,o) Cache$ = Right(Cache$,Len(Cache$)-o) o = Instr(Cache$,",") YCord = Left(Cache$,o) Cache$ = Right(Cache$,Len(Cache$)-o) o = Instr(Cache$,",") ZCord = Left(Cache$,o) Cache$ = Right(Cache$,Len(Cache$)-o) o = Instr(Cache$,",") TexCord1 = Left(Cache$,o) Cache$ = Right(Cache$,Len(Cache$)-o) TexCord2 = Cache$ v0=AddVertex(WorldObject\surface,XCord,YCord,ZCord,TexCord1,TexCord2) Cache$ = ReadLine(Datei) o = Instr(Cache$,",") XCord = Left(Cache$,o) Cache$ = Right(Cache$,Len(Cache$)-o) o = Instr(Cache$,",") YCord = Left(Cache$,o) Cache$ = Right(Cache$,Len(Cache$)-o) o = Instr(Cache$,",") ZCord = Left(Cache$,o) Cache$ = Right(Cache$,Len(Cache$)-o) o = Instr(Cache$,",") TexCord1 = Left(Cache$,o) Cache$ = Right(Cache$,Len(Cache$)-o) TexCord2 = Cache$ v1=AddVertex(WorldObject\surface,XCord,YCord,ZCord,TexCord1,TexCord2) Cache$ = ReadLine(Datei) o = Instr(Cache$,",") XCord = Left(Cache$,o) Cache$ = Right(Cache$,Len(Cache$)-o) o = Instr(Cache$,",") YCord = Left(Cache$,o) Cache$ = Right(Cache$,Len(Cache$)-o) o = Instr(Cache$,",") ZCord = Left(Cache$,o) Cache$ = Right(Cache$,Len(Cache$)-o) o = Instr(Cache$,",") TexCord1 = Left(Cache$,o) Cache$ = Right(Cache$,Len(Cache$)-o) TexCord2 = Cache$ v2=AddVertex(WorldObject\surface,XCord,YCord,ZCord,TexCord1,TexCord2) AddTriangle(WorldObject\surface,v0,v1,v2) Wend .ReadEnd ;-------------------------------------------------------- Case 2 ;-------------------------------------------------------- ;Entitypfad/Name einlesen und laden WorldObject\mesh = LoadMesh(Replace(Replace(Trim(ReadLine(Datei)),"Entity = ",""),Chr(34),"")) ;Wenn eine Textur vorhanden ist, auf das Entity anwenden If WorldObject\Texture <> 0 Then EntityTexture WorldObject\mesh,WorldObject\Texture ReadLine(Datei) ; } überlesen ;-------------------------------------------------------- End Select ;-------------------------------------------------------- ;Hier kommen wir wieder zum obrigen ...-Cord Center Add WorldObject\Pivot = CreatePivot() ;Einen Pivot erstellen ;Pivot um die X, Y, Z Werte verschieben (das Mesh/Entity bleibt wo es ist) PositionEntity WorldObject\Pivot,WorldObject\PivotCordAdd1,WorldObject\PivotCordAdd2,WorldObject\PivotCordAdd3 ;Das Mesh/Entity dem Pivot "anhängen" EntityParent WorldObject\mesh,WorldObject\Pivot ;Zum schluss, den Pivot nach den RICHTIGEN Kordinanten ausrichten PositionEntity WorldObject\Pivot,WorldObject\X_Cord,WorldObject\Y_Cord,WorldObject\Z_Cord ;Effekt: ;Der Pivot dient als neuer Null-Punkt des Meshes/Entitys :D ;Hilfreich wenn man das Objekt drehen möchte, und den Drehpunkt ;nicht in der Mitte haben will. Falls man soetwas komplexes nicht ;braucht, kann man getrost ganz oben die Zeilen bezüglich des ;...-Cord Center Add löschen, und auch oben das Pivot gedöns ;löschen. Statdessen reicht dann ein simples... ;PositionEntity WorldObject\Mesh,WorldObject\X_Cord,WorldObject\Y_Cord,WorldObject\Z_Cord ;...völlig aus. ;Irgentwelche Kordinaten updaten....ka wofür, ist aber wichtig :P UpdateNormals WorldObject\Mesh Wend CloseFile (Datei) ;--------------------------------------------- End Function ;--------------------------------------------- Beispiel "Map" Code: [AUSKLAPPEN] Boden1 MeshBlock
{ Texture = "Texturen\BlueTexture.png" X-Cord = 0 Y-Cord = 0 Z-Cord = 0 X-Cord Center Add = 0 Y-Cord Center Add = 0 Z-Cord Center Add = 0 -64,0, 64,0,0 64,0, 64,1,0 -64,0,-192,0,2 64,0, 64,1,0 64,0,-192,1,2 -64,0,-192,0,2 } Decke1 MeshBlock { Texture = "Texturen\BlueTexture.png" X-Cord = 0 Y-Cord = 0 Z-Cord = 0 X-Cord Center Add = 0 Y-Cord Center Add = 0 Z-Cord Center Add = 0 -64,128,-192,0,0 64,128,-192,1,0 -64,128, 64,0,2 64,128,-192,1,0 64,128, 64,1,2 -64,128, 64,0,2 } WandRechts MeshBlock { Texture = "Texturen\RedTexture.png" X-Cord = 0 Y-Cord = 0 Z-Cord = 0 X-Cord Center Add = 0 Y-Cord Center Add = 0 Z-Cord Center Add = 0 64,128, 64,0,0 64,128,-192,2,0 64, 0, 64,0,1 64,128,-192,2,0 64, 0,-192,2,1 64, 0, 64,0,1 } WandLinks MeshBlock { Texture = "Texturen\RedTexture.png" X-Cord = 0 Y-Cord = 0 Z-Cord = 0 X-Cord Center Add = 0 Y-Cord Center Add = 0 Z-Cord Center Add = 0 -64,128,-192,0,0 -64,128, 64,2,0 -64, 0,-192,0,1 -64,128, 64,2,0 -64, 0, 64,2,1 -64, 0,-192,0,1 } Legostein EntityBlock { Texture = "" X-Cord = 0 Y-Cord = 10 Z-Cord = 0 X-Cord Center Add = 0 Y-Cord Center Add = 0 Z-Cord Center Add = 0 Entity = "Modells\Brickstone1.3ds" } Um einen Code für die Player-Erstellen muss man sich allerdings noch selber kümmern ![]() Grüßle: Kernle |
||
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog] Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89 Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group