Fehler beim Speichern einer Datei?
Übersicht

![]() |
SephkaBetreff: Fehler beim Speichern einer Datei? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab letztens mal wieder B3D rausgekramt und ein neues kleines Spiel angefangen,das hat auch funnktioniert nun sitz ich vor dem Leveleditor und find die Lösung nicht :O ![]() Ich hab auch schon ein bisschen probiert und es scheint so das wenn man eine Level bearbeite im Prog selbst alles an den Linken Rand aufgschoben wird,aber wenn man die lvl Datei mit dem Texteditor bearbeitet und die Datei im L-Editor öffnet und dann abspeichert bleibt alles so.Komisch. Hier der Code: Code: [AUSKLAPPEN] Graphics 800,600,0,2
;Initialisierung ;DIm'S Dim CLevel$(49,19) ;Level 10*10 Groß ;Vars Global Cx%,Cy% Global Level$ = "LVL1" Global Inputtimer ;Bilder Global Wand = LoadImage ("Wand.png") Global Ecke = LoadImage ("Ecke.png") Global StachelA = LoadImage ("StachelA.png"):MaskImage StachelA,255,0,0 Global Cursor = LoadImage("Cursor.png"):MaskImage Cursor,255,255,255 ;Programm START ReadLevel(Level$) Repeat Cls If InputTimer<MilliSecs() Then KeyInput() InputTimer=MilliSecs()+100 End If PrintLevel(Level$) DrawImage Cursor,Cx*16,Cy*16 Flip Until KeyHit(1) End ;###ENDE### Function KeyInput() If KeyDown(203) And Cx>0 Then Cx=Cx-1 If KeyDown(205) And Cx<48 Then Cx=Cx+1 If KeyDown(200) And Cy>0 Then Cy=Cy-1 If KeyDown(208) And Cy<19 Then Cy=Cy+1 If KeyDown(2) Then CLevel(Cx,Cy) = "-" If KeyDown(3) Then CLevel(Cx,Cy) = "#" If KeyDown(4) Then CLevel(Cx,Cy) = "V" If KeyDown(31) Then SaveLevel(Level) End Function Function PrintLevel(PLevel$) Local x=0,y=0 Repeat If CLevel(x,y) = "-" Then DrawImage Wand,x*16,y*16 If CLevel(x,y) = "#" Then DrawImage Ecke,x*16,y*16 If CLevel(x,y) = "V" Then DrawImage StachelA,x*16,y*16 ;Text x*12+12,y*12+12,CLevel$(x,y) ;<--old way X=X+1:If X=49 Then X=0:Y=Y+1 Until Y=20 End Function Function ReadLevel(RLevel$) LevelFile = ReadFile(Level+".lvl") Local x=0,y=0 While Not Eof(LevelFile) TempLine$ = ReadLine(LevelFile) If Mid(Templine,1,1) >< "%" Then Repeat CLevel$(x,y) = Mid(Templine,x+1,1) X=X+1 If X=49 Then X=0 Y=Y+1 End If Until X=0 Else ;If Instr (Templine,"%name%")><0 Then Lname = Mid(Templine,Instr (Templine,"-")+1,Len(Templine)) ;If Instr (Templine,"%music%")><0 Then Music = Mid(Templine,Instr (Templine,"-")+1,Len(Templine)) EndIf Wend CloseFile(LevelFile) End Function Function SaveLevel(LevelFile) Local LFile = WriteFile(Level + ".lvl") Local TempString$,LevelLine$,x2%,y2% For y2=0 To 19 For x2=0 To 49 TempString = CLevel(x2,y2) DebugLog TempString LevelLine = LevelLine + TempString Next WriteLine LFile,LevelLine LevelLine = "" Next CloseFile LFile DebugLog "DONE" End Function Danke schonmal im Vorraus,Sephka |
||
Mein Freund und Helfer:
Win7 Home Premium SP1 AMD Athlon II X4 645 3.1GHZ 8GB Ram 64bit |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Strings sollte man so für Leveldaten nicht verwenden. String Vergleiche & Operationen sind langsam, Zahlen lassen sich direkt als Frame-Angabe verwenden und ein Int sind immer 4 Byte - keine Probleme beim interpretieren.
Wenn du Leere Strings "" und Leerzeichen " " nicht richtig verarbeitest, könnte es dann zusammen geschoben aussehen - darauf würde ich hier jedenfalls tippen. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
die sache ist ganz klar:
Dir fehlt neben den Feldbezeichnungen "-" , "#" und "V" eine Feldbezeichnung für leere Felder. Wenn Du die Datei zunächst mit einem Text-Editor erstellst, dann fügst Du Leerzeichen links vor oder zwischen die wirklichen Zeichen ein. Die sorgen später dafür, dass in der ReadLevel-Funktion das CLevel(x,y) an dieser Stelle ein " " (Leerzeichen) bekommt. Wenn Du das Level direkt im Level-Editor erstelltst, dann sind die CLevel$(x,y) für leere Felder wirklich leer: "" und dadurch wird jetzt kein Leerzeichen in die Datei gespeichert. Die Lösung deines Problems ist, dass du zunächst das gesamte Spielfeld vorab mit einem Zeichen für "leeres Feld" füllst. Hier z.B. das "*": BlitzBasic: [AUSKLAPPEN] Dim CLevel$(49,19) Damit es funktioniert musst Du beim ersten Mal die Zeile mit dem... BlitzBasic: [AUSKLAPPEN] ;ReadLevel(Level$)
...auskommentieren, sonst überschreibt dir die fehlerhafte Datei "LVL1.lvl" diese Vorbelegung. Hier noch zwei Tipps: 1. Sicherlich hast Du schon bemerkt, das sich manchmal die Steine nicht setzen lassen, obwohl Du auf die "1" gedrückt hast. Dies kommt von der ungünstigen Kombination von KeyDown() und deinem InputTimer. Besser wäre es hier auf KeyHit für die Eingabe-Tasten zu wechseln: BlitzBasic: [AUSKLAPPEN] If KeyHit(2) Then CLevel(Cx,Cy) = "-" 2. Füge nun auch eine Eingabe-Taste ein, um ein Spielelement wieder entfernen zu können: BlitzBasic: [AUSKLAPPEN] If KeyHit(5) Then CLevel(Cx,Cy) = "*" |
||
![]() |
Sephka |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke für die Tipps werd mich gleich dransetzten
Lg,Sephka |
||
Mein Freund und Helfer:
Win7 Home Premium SP1 AMD Athlon II X4 645 3.1GHZ 8GB Ram 64bit |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group