ASCII-Dateien einlesen...

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

maximilian

Betreff: ASCII-Dateien einlesen...

BeitragSo, Jan 25, 2004 11:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich programmiere gerade ein Qbasic-Spiel (alte Prograsmmiersprache, sehr ähnlich BB) nach BB um. Dabei gibt es folgendes Problem:

Ich speichere alle Grafiken in externen Dateien. Diese haben das Format "*.cbm" (von mir erfunden, falls es soas noch nicht gibt). In Qbasic gibt es für jede Farbe Farbcodes: z.B 0 = Schwarz, 1 = Blau, 2 = Grün, 3 = Türkis, 14 = Gelb) Diese sind in den Dateien gespeichert als ASCII-Zeichen. Ich wandle sie mit ASC um und stelle dann für BB die nötigen RGB-Codes ein.
Allerdings weiß ich nicht wie man in BB Strings einlesen kann, die nur eine Stelle haben. Soweit ich weiß orientiert sich BB ja an bestimmten Zeichen, die normale Dateien nicht enthalten.Crying or Very sad

Grüße,
LordChaos

D2006

Administrator

BeitragSo, Jan 25, 2004 12:02
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn sie als ASCII zeichen gespeichert sind, sind es ja sowieos nur bytes. Also ein byte für ein zeichen. und genauso liest du sie in BB aus. einfach ReadByte(file_stream). die zahl brauchst du dann eigentlich auch nicht mehr umzuwandeln.

wenn ich dich falsch verstanden habe, oder du codeschnipsel brauchst, sag' bescheid!

MfG

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSo, Jan 25, 2004 12:09
Antworten mit Zitat
Benutzer-Profile anzeigen
hier noch ein link für den passenden befehl dazu:
www.blitzbase.de/befehle2d/readbyte.htm
[BB2D | BB3D | BB+]

Vertex

BeitragSo, Jan 25, 2004 12:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ganz easy, musst noch nichteinmal in ASCII-Code umwandeln.
Als erstes machst Du Dir ein Array mit den ganzen Farben:
Code: [AUSKLAPPEN]

Dim Farben(15)
Farben(00) = $000000 ; Schwarz
Farben(01) = $000080 ; Dunkelblau
Farben(02) = $008000 ; Dunkelgrün
Farben(03) = $008080 ; Dunkelzyan (Türkis)
Farben(04) = $800000 ; Dunkelrot
Farben(05) = $800080 ; Dunkelviolett
Farben(06) = $808000 ; Oliv-Braun
Farben(07) = $C0C0C0 ; Hellgrau
Farben(08) = $808080 ; Grau
Farben(09) = $0000FF ; Hellblau
Farben(10) = $00FF00 ; Hellgrün
Farben(11) = $00FFFF ; Hellzyan (Hell-Türkis)
Farben(12) = $FF0000 ; Hellrot
Farben(13) = $FF00FF ; Hellviolett
Farben(14) = $FF00FF ; Gelb
Farben(15) = $FFFFFF ; Leucht-Weiß


Nun öffnest Du die Datei zum lesen:
Code: [AUSKLAPPEN]

Stream = ReadFile("MeinBild.cbm")

Musst event. noch vorher die größe auslesen
und dann kannst Du via ReadByte(Stream) den ASCII Code
des Bytes auslesen:
Code: [AUSKLAPPEN]

For X = 0 To Breite - 1
   For Y = 0 To Hoehe - 1
      Farbwert = Farben(Readbyte(Stream))
   Next
Next

Und die datei wieder schließen:
Code: [AUSKLAPPEN]

CloseFile Stream

mfg olli
Edit: Arg andere waren mal wieder schneller, aber dafür habe ich die
Farbtabelle
vertex.dreamfall.at | GitHub

maximilian

BeitragSo, Jan 25, 2004 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Super, funktioniert. THX!!! (besonders an Vertex, seine ar die beste Lösung).

Grüße,
LordChaos

maximilian

BeitragSo, Jan 25, 2004 13:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Und noch ein Problem Wink:

Ich sollte das wohl selber hinbekommen, aber... tja, ich bekomm das einfach nicht hin. Ich möchte meine Levels auslesen, diese sind 28x40 Einheiten groß. Jede Einheit entspricht einem ASCII-Zeichen, welche alle hintereinander aufgereiht sind. Zwischen den Levels sind noch zei Koordinaten (Integer), welche ich aber selber auslesen kann. Letzendlich möchte ich einfach so ein Level in ein Array Level(40, 28) haben. Hier einer meiner Versuche (funktioniert vorne und hinten nicht):

Code: [AUSKLAPPEN]
 LevelFile = ReadFile("level.map")
   Repeat
     PosX1% = ReadInt(LevelFile)
     PosY1% = ReadInt(LevelFile)
     For i = 1 To 28
       Zeile$(i) = ReadLine$(LevelFile)
     Next
     If PosX1% = PosX% And PosY1% = PosY% Then CloseFile LevelFile: Exit
   Forever

Sobald er das richtige Level (dank Koordinaten) gefunden hat soll er die Schleife beenden.

Grüße,
LordChaos

maximilian

BeitragSo, Jan 25, 2004 13:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Das sollte Code: [AUSKLAPPEN]
Level (40, 28)
heißen.

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMo, Jan 26, 2004 0:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Dim Level (40, 28)

LevelFile = ReadFile("level.map")

For x = 1 To 40
   For y = 1 To 28
   Level (x, y) = ReadInt(LevelFile)
   Next
Next
CloseFile LevelFile

so in etwa macht man das
Ich weiß jetzt aber nicht weiter;
da ich die Codierung deiner Datei nicht genau kenne
evt. muste die Datei mit Readline auslesen und dan den String zerlegen
damit du herausfindest wo denn jetz die richtige level steht
einfacher ist es jede Level in einer Datei
[BB2D | BB3D | BB+]

Vertex

BeitragMo, Jan 26, 2004 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich würde es so machen:
Code: [AUSKLAPPEN]

Type tLevel
   Field X,Y
   Field Map[39,27]
End Type

Stream = ReadFile("Level.map")
Count = ByteAvail(Stream) / (40 * 28 + 8) ; Breite * Höhe + X + Y (2 mal Int = 8 Byte)
For I = 1 To Count
   Level.tLevel = New tLevel
   Level\X = ReadInt(Stream)
   Level\Y = ReadInt(Stream)
   For X = 0 To 39
      For Y = 0 To 27
         Level\Map[X,Y] = ReadByte(Stream)
      Next
   Next
Next

CloseFile(Stream)


mfg olli
vertex.dreamfall.at | GitHub

maximilian

BeitragMo, Jan 26, 2004 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
@Ralliman: So weit hab ichs dann später auf geschafft. (aber mit ReadByte)
Das Problem ist jetzt folgendes: Das Level befindet sich jetzt im passenden Array (Level(40, 28). So sieht das z.B aus:

Code: [AUSKLAPPEN]

xxxxxxxxxxxxxx
x     . . . . . . . . x
x  o   . . . . . . . x
xxxxxxxxxxxxxx


Das Problem ist jetzt das ich das nicht auslesen kann. So sieht es bis jetzt aus:
Code: [AUSKLAPPEN]

Select Level(x, y)
 Case " "
   nichts
 Case "x"
   Wand
  Case "."
    Gegner
End Select


Also jetzt nur als Beispiel. Select Chr$(Level(x, y)) funktioniert auch nicht.

@Vertex: Das ist wieder sehr professionell aber ich denke etwas einfacher würde es auch gehen.

Grüße,
LordChaos

maximilian

BeitragMo, Jan 26, 2004 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Habs jetzt selbst hinbekommen. Trotzdem DANKE!!!!!!

Grüße,
LordChaos

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group