ASCII-Dateien einlesen...
Übersicht

![]() |
maximilianBetreff: ASCII-Dateien einlesen... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() Grüße, LordChaos |
||
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
hier noch ein link für den passenden befehl dazu:
www.blitzbase.de/befehle2d/readbyte.htm |
||
[BB2D | BB3D | BB+]
|
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Super, funktioniert. THX!!! (besonders an Vertex, seine ar die beste Lösung).
Grüße, LordChaos |
||
![]() |
maximilian |
![]() Antworten mit Zitat ![]() |
---|---|---|
Und noch ein Problem ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das sollte Code: [AUSKLAPPEN] Level (40, 28) heißen.
|
||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Habs jetzt selbst hinbekommen. Trotzdem DANKE!!!!!!
Grüße, LordChaos |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group