Hallo,
hab mal wieder Urlaub und spiel gerade ein wenig mit GLBasic.Jetz hab ich versucht ein Level aus einer Textdatei einzulesen.
Habe das Level in etwa so aufgebaut :
111111111111
112112111211
Hier steht die 1 und die 2 für jeweils ein anderes Sprite.
Nun kann ich mit Readline nur die ganze Zahl lesen, aber nicht einzeln.
Wie kann ich jetzt jede Zahl einzeln lesen??
Gruß Jasper
READBYTE ?
wie Schranzor bereits meinte, mit Openfile/Readbyte
oder du nutzt noch die alten Befehle Getfile
(Beschränkung: max 256 Zeilen (und 1023 Zeichen pro Zeile))
siehe dazu das in GLB vorhandene Beispiel Mario (die Funktion LoadLevel)...
da wird so ein Textlevel benutzt/eingelesen...
Das ist das was Du suchst, Simples beispiel.
Ladet euine Textdatei die wie Deine oben aufgebaut ist.
// --------------------------------- //
// Project: TextMap
// Start: Wednesday, December 10, 2008
// IDE Version: 5.360
GLOBAL lev$
lev$ = FILEREQUEST$(TRUE, "TXT|*.txt|All|*.*")
DIM dat[256][256]
txt_loader(lev$)
// Map zeichnen
WHILE TRUE
FOR x= 0 TO 255
FOR y = 0 TO 255
IF dat[x][y] = 1 THEN DRAWRECT x * 16,y*16,16,16,RGB(0xfc, 0x83, 0xb6)
IF dat[x][y] = 2 THEN DRAWRECT x * 16,y*16,16,16,RGB(0x00, 0xff, 0x80)
NEXT
NEXT
SHOWSCREEN
WEND
END
FUNCTION txt_loader : l_in$
LOCAL l_x,l_y,l_temp,l_count
LOCAL l_str$,l_a$
OPENFILE(0,l_in$,TRUE)
WHILE ENDOFFILE(0) = 0
READLINE 0,l_str$
l_temp = LEN(l_str$)
FOR l_i = 0 TO l_temp
IF MID$(l_str$,l_i,1) = "1" THEN dat[l_i][l_count] = 1
IF MID$(l_str$,l_i,1) = "2" THEN dat[l_i][l_count] = 2
NEXT
INC l_count,1
IF l_temp >= l_x THEN l_x = l_temp
WEND
CLOSEFILE 0
ENDFUNCTION
Danke an alle,
habt mir sehr geholfen, besonders der Code von D²O.Ich hatte nur Readline benutzt ohne Mid$ und Zähler,hatte mir so etwas gedacht aber nicht umsetzen können :S.
FUNCTION txt_loader : l_in$
LOCAL l_x,l_y,l_temp,l_count
//Variable 1_x für Anzahl Zeichen x-Achse / Variable 1_y für Anzahl Zeichen x-Achse
//Variablen deklarieren l_temp = Für Azahl der Zeichen in der Datei/l_count Zähler für Variable dat
LOCAL l_str$,l_a$ //l_str$ Variable für die einzulesene Datei/l_a$ Variable für ???
WHILE ENDOFFILE(0) = 0
READLINE 0,l_str$ //Datei lesen
l_temp = LEN(l_str$) //Gibt die Anzahl der Zeichen wieder
FOR l_i = 0 TO l_temp //l_i = 0 bis Anzahl Zeichen(Schleife wird solange durchlaufen bis l_temp(Anzahl Zeichen) erreicht ist
IF MID$(l_str$,l_i,1) = "1" THEN dat[l_i][l_count] = 1 //Kopiert aus der Datei das Zeichen(wenn es eine 1 ist) in die Variable dat[l_i][l_count]
IF MID$(l_str$,l_i,1) = "2" THEN dat[l_i][l_count] = 2 //Kopiert aus der Datei das Zeichen(wenn es eine 2 ist) in die Variable dat[l_i][l_count]
NEXT
INC l_count,1 //l_count um 1 erhöhen
IF l_temp >= l_x THEN l_x = l_temp //wenn l_temp(Anzahl Zeichen) größer,gleich 1_x(Anzahl Zeichen x-Achse) dann 1_x = 1_temp
WEND
CLOSEFILE 0
ENDFUNCTION
Habe ich den Code verstanden? Wofür brauche ich l_a$?
Gruß Jasper
Schlagt mich wenns falsch ist, aber muss es nicht heißen :
FOR l_i = 0 TO l_temp -1
Weil LEN zählt ja jeden Buchstaben/Zahl und nicht erst ab 0 :)
Hi, kann noch gar nicht klar Denken.
Bin aus der Nachtschicht gekommen und habe den Code nur schnell mal gekürzt, der Original Code
ist der für das Konvertieren der Map's von Gernots WIZ-Spiel für den SMP-Editor.
Da kann es sein das die eine oder andere Variable fehl am platzt ist ;)
So, muss jetzt erst mal die Kids von der Schulle und KiGa hollen, dann gehts wieder ab ins Bett :)
Gute Nacht!
Viel Spass beim Maps auslesen :)
Achja, meine Testmap sah so aus:
das 00 oder 01 usw ist nur der übersicht halber!
Macht aber GLB nix aus, da es eh als Integer übergeben wird :)
00,00,00,00,00,00,00,00,00,00
01,01,01,01,01,01,01,01,01,01
02,02,02,02,02,02,02,02,02,02
03,03,03,03,03,03,03,03,03,03
04,04,04,04,04,04,04,04,04,04
05,05,05,05,05,05,05,05,05,05
06,06,06,06,06,06,06,06,06,06
07,07,07,07,07,07,07,07,07,07
08,08,08,08,08,08,08,08,08,08
09,09,09,09,09,09,09,09,09,09
10,10,10,10,10,10,10,10,10,10
11,11,11,11,11,11,11,11,11,11
12,12,12,12,12,12,12,12,12,12
13,13,13,13,13,13,13,13,13,13
14,14,14,14,14,14,14,14,14,14
Das Auslesen würde ich so machen
GLOBAL MyMap[]
Loadmap(MyMap[],10,15,"map1neu.map")
WHILE TRUE
FOR y = 0 TO 14 // Reihen: 15
FOR x = 0 TO 9 // Spalten: 10
PRINT MyMap[x][y], x*20,y*20
NEXT
NEXT
SHOWSCREEN
WEND
END
// Map[] = das MapArray, sx = Arraysize X, sy = Arraysize Y, mapname$ = Klar oder :D
FUNCTION Loadmap: Map[],sx,sy, mapname$
DIM Map[sx][sy] // Setze Mapgröße
// ok = für Openfile ist gelungen
// linenum = Zeilennummer
// tmp$ = Die aktuelle Zeile
// spl_str$[] = das Array der Zahlen in der Zeile
// spl_num = Anzahl der Zahlen in der Zeile
LOCAL ok, linenum, tmp$, spl_str$[], spl_num
ok = OPENFILE(0,mapname$,TRUE) // Öffne Map
IF ok // War Mapöffnen erfolgreich
WHILE ENDOFFILE(0) = 0 // Solange nicht Ende der Map erreich
READLINE 0, tmp$ // Lese Zeile aus
spl_num = SPLITSTR(tmp$,spl_str$[],",") // Trennt den String bei einem Komma !
FOR i = 0 TO spl_num-1 // Laufe solange durch bis Zeile zuende ist
Map[i][linenum] = spl_str$[i] // Lese aktuelle Position aus und übergib es der Map
NEXT // nochmal zu FOR
INC linenum, 1 // Neue Zeile
WEND // nochmal ausführen
ENDIF // Map geladen
CLOSEFILE 0 // Map auslesen schließen
ENDFUNCTION