Level aus Textdatei lesen,wie?

Previous topic - Next topic

jasper111

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
Rechtschreibfehler sind pure Absicht und dienen der allgemeinen Belustigung.
_____________________________________________________________

Schranz0r

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Kosta

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...

Intel QuadCore, Geforce8600GT,512MB,4GB Ram, 26" TFT
HP nw8440 Schläppy
GP2X Mk2 (Firmware 3.0)

GLBASIC Blog:
http://www.glbasic.com/forum/index.php?blog=51.0

D2O

Das ist das was Du suchst, Simples beispiel.
Ladet euine Textdatei die wie Deine oben aufgebaut ist.

Code (glbasic) Select
// --------------------------------- //
// 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
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

jasper111

#4
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.

Code (glbasic) Select
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
Rechtschreibfehler sind pure Absicht und dienen der allgemeinen Belustigung.
_____________________________________________________________

Schranz0r

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 :)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

D2O

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!
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Schranz0r

#7
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 :)

Code (glbasic) Select
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

Code (glbasic) Select

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
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard