[B3D] laden von einer Map aus einer *.txt

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

shootermaker

Betreff: [B3D] laden von einer Map aus einer *.txt

BeitragSo, Apr 16, 2006 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
kann mir jemand ein Beispiel posten, wie ich am besten eine 3d map aus einem *txt laden kann.

also vorgestellt hätte ich mir das so wie bei dem PC-gamel "Dungeon Keeper 2".

Da besteht eine map nur aus einem Text-file wie zum bleistift:

AAAAAAAAAAAA
ACCCCCCCCCA
ACCCCCCCCCA
ACCCCCCCCCA
ACCCCCCCCCA
ACCCCCCCCCA
ACCCCCCCCCA
AAAAAAAAAAAA


A ist dann z.b. ein Block
C ein dreieck
doch ich weiß irgendwie nicht wie ich das realisieren soll, also das der mir dann das file liest und dann sich denkt: "aha! da ist ein A, da muss ich einen Block erstellen... Laughing Laughing "
 

JanK

BeitragSo, Apr 16, 2006 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Datei in einen String einlesen
2. Jedes Zeichen im String durchgehen und am besten mit einer Select-Abfrage entschieden was er jetzt erstellen soll.

-----Edit:---------
BlitzBasic: [AUSKLAPPEN]
;-----[--Datei öffnen--]-----
Map = ReadFile("Map.txt")
;-----[--Datei auslesen--]-----
Inhalt$ = ReadLine$(Map)
;------------------------------

;-------[--Dateien auswerten--]---------
For x = 1 To Len(Inhalt$) ;Vom 1 Zeichen bis zum Text Ende
Zeichen$=Mid$ (inhalt$, x,1) ;Das wichtige...der Mid befehl
Select Zeichen$ ;Selectabfrage
Case "A" ;->Wenn das Zeichen A ist dann
Print "Baum"
Case "D" ;->Wenn das Zeichen D ist dann
Print "Blume"
End Select ;Ende der Abfrage
Next
;-----------------------------------------
WaitKey ;-> Damit man alles sieht
Ich habe keine Zeit, mich zu beeilen.
The Pollux Conflict || The Pollux Renegades || Lipstick-live.de
 

shootermaker

BeitragMo, Apr 17, 2006 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
zuerst danke für deine Hilfe + Beispiel! Very Happy
also so weit versteh ich die Sache noch, aber wie müsst ich jetzt vorgehen, wenn ich das dann in 3D haben möchte?

;-----[--Datei öffnen--]-----
Map = ReadFile("Map01.txt")
;-----[--Datei auslesen--]-----
Inhalt$ = ReadLine$(Map)


;-------[--Dateien auswerten--]---------
For x = 1 To Len(Inhalt$) ;Vom 1 Zeichen bis zum Text Ende
Zeichen$=Mid$ (inhalt$, x,1) ;Das wichtige...der Mid befehl
Select Zeichen$ ;Selectabfrage
Case "A"

;---------------------------------------------------------------------> Kann ja hier nicht einfach das model laden, weil er ja dann nur eins macht...
LoadMesh("block.3ds")
Case "C"
LoadMesh("boden.3ds")
End Select
Next
;-----------------------------------------
WaitKey ;-> Damit man alles sieht



...sry, hab in dem bereich leider nix mit der Suchfunktion gefunden. Leider auch keine Tutorials die über so ein Thema handeln.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Apr 17, 2006 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Siehe dazu ql:CopyEntity und ql:CopyMesh, diese sollten für deine Ansprüche genügen... Ansonsten auch ql:AddMesh je nachdem, wie du deine Grafik aufbauen willst...
 

shootermaker

BeitragMi, Apr 19, 2006 11:10
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo,
danke für deine Antwort! Very Happy
aber die frage war eigentlich anders gemeint (sry, hab sie blöd formuliert Sad )
ich meinte eigentlich: „wie kann ich es anstellen, dass er die Models nacheinander an der richtigen Position erstellt?“
hab mir in dem Bereich schon viele tutorials in 2d angeschaut, aber 2d/3d ist da ein großer unterschied.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Apr 19, 2006 12:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, ok... Da du aus einer Datei ausliest, 'kennst' du ja schon die Position der Objekte. Dazu gibt es zwei Möglichkeiten:

1.) Man erstellt eine Datei wo jedes Objekt mit einer Kennung und derer Position gespeichert ist.

2.) Man erstellt eine Datei die 2D-mässig (Map ähnlich) schon gespeichert worden ist. Die Position ergibt sich dann aus der Dateiposition und es wird nur noch die Kennung eines Objektes gespeichert.

Du hast dich wohl für die zweite Möglichkeit entschieden. Dir fehlt aber noch die Y-Variable um damit rechnen zu können. Ausserdem läuft deine Schleife ja nur einmal durch und liest dadurch nur die erste Zeile der Datei aus. Das kannst du mit einer ql:EOF -Schleife lösen. Vor dieser Schleife setzt du eine y-Variable auf 0. Innerhalb der Schleife erhöhst du jeden Schleifendurchlauf y um 1, um die Position des Meshes herraus finden zu können, könnte man wie folgt vorgehen:

on the fly Code: [AUSKLAPPEN]
;Level Laden
Map = ReadFile("Map01.txt")
 FreeEntity Welt
 y=0

 While Not Eof(Map)
  y=y+1
  Inhalt$ = ReadLine$(Map)
  For x = 1 To Len(Inhalt$)
   Zeichen$=Mid$ (inhalt$, x,1)
   Select Zeichen$
   Case "A"
    PositionMesh block,x,y
    AddMesh block,Welt
   Case "B"
    PositionMesh boden,x,y
    AddMesh boden,Welt
   Case "C"
    PositionMesh zeug,x,y
    AddMesh zeug,Welt
  Next
 Wend
CloseFile (Map)

Das laden der Meshes übernimmst du dann am Anfang deines Programmes und machst sie zB mit ql:HideEntity unsichtbar.

Bitte, zur besseren Übersicht, Code-Tags benutzen.
 

shootermaker

BeitragMi, Apr 19, 2006 14:14
Antworten mit Zitat
Benutzer-Profile anzeigen
hi,
hab den code gleich ausprobiert, aber so ganz funktioniert er noch nicht. [img]http://img145.imageshack.us/my.php?image=blitz3dprob1po.jpg[/img]
die txt-datei sieht so aus:

AAAAAAAAAAAA
ACCCCCCCCCA
ACCCCCCCCCA
ACCCCCCCCCA
ACCCCCCCCCA
ACCCCCCCCCA
AAAAAAAAAAAA


der momentane code:

Code: [AUSKLAPPEN]


Map = ReadFile("Map01_test.txt")
y=0

block = LoadMesh("media/wcrate1.3ds")
boden = LoadMesh("media/wcrate1.3ds")
Welt = LoadMesh("media/wcrate1.3ds")


HideEntity block
HideEntity boden
;HideEntity welt

;FreeEntity Welt


 While Not Eof(Map)
  y=y+1
  Inhalt$ = ReadLine$(Map)
  For x = 1 To Len(Inhalt$)
   Zeichen$=Mid$ (inhalt$, x,1)
   Select Zeichen$
   Case "A"
    PositionMesh block,x,y,z
    AddMesh block,Welt
   Case "C"
    PositionMesh boden,x,y,z
    AddMesh boden,Welt
  End Select
  Next
 Wend
CloseFile (Map)



ich musste das "hideentity welt" auskommentieren, denn sonnst hat sich überhaupt nix getan
und
"FreeEntity Welt", denn sonnst bekam ich die Fehlermeldung "entity does not exist"

wobei ich nicht ganz verstehe wofür das "welt"-entity gut sein soll

5k41

BeitragMi, Apr 19, 2006 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
du fürgst alle objekte in deinem Code dem hauptentity Welt zu, damit du nur eine Surface hast!
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group