[B3D]Einfache Map-Lade-Routine

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Kernle 32DLL

Betreff: [B3D]Einfache Map-Lade-Routine

BeitragSa, Dez 30, 2006 15:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier eine "kleinigkeit", die ich mal für ein paar Engine-Tests meinerseits
geschrieben habe, und für einen Thread im Beginnerscorner dokumentiert
habe Wink

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 Wink


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

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group