Seite 1 von 1

Level von Datei laden

Verfasst: 26.08.2012 13:00
von TheNewOne
Hallo zusammen,
ich habe eine txt-Datei die folgendes enthält:
0,0,0
0,1,1
1,1,1
Ich möchte diese Datei per ReadFile und ReadString lesen, und für jede 0 ein sprite anzeigen, und für jede 1 ein anderes sprite.
Leider scheitere ich an der Umsetzung.
Hoffe jemand versteht mein Problem.

Re: Level von Datei laden

Verfasst: 26.08.2012 13:22
von NicknameFJ
Hallo TheNewOne,

hier mal ein kleiner Testcode. Ich hoffe Du kannst Da was für Dich raus ziehen.


Grüße

NicknameFJ

Code: Alles auswählen

Procedure MacheWas()
  Debug "eins"
EndProcedure 

Procedure MacheNochWas()
  Debug "null"
EndProcedure
 
If ReadFile(1,"C:\Test.txt") ; <-----    Pfad anpassen
  While Eof(1) = 0
    Dummy$ = ReadString(1)
    Debug Dummy$
    Anzahl = CountString(Dummy$,",") +1
    
    For i = 1 To Anzahl
      If StringField(Dummy$,i,",") = "1"
        MacheWas()
      Else
         MacheNochWas()
      EndIf
    Next
        
    Wend 
EndIf

Re: Level von Datei laden

Verfasst: 26.08.2012 13:46
von ts-soft
Ich würde es in etwa so machen:

Code: Alles auswählen

EnableExplicit

; LoadImage(0, ...)
; LoadImage(1, ...)

Procedure ParseLevelLine(List StringList.s())
  Protected count, i, sprite
  
  ForEach StringList()
    count = CountString(StringList(), ",")
    For i = 1 To count + 1
      sprite = Val(StringField(StringList(), i, ","))
      Debug sprite
    Next
  Next
EndProcedure

Procedure ReadLevelFile(File.s)
  NewList StringList.s()
  Protected FF = ReadFile(#PB_Any, File)
  If FF
     While Not Eof(FF)
      AddElement(StringList())
      StringList() = ReadString(FF)
    Wend
    CloseFile(FF)
  EndIf
  ParseLevelLine(StringList())
EndProcedure

ReadLevelFile("d:\TS-TEMP\level.txt")

Re: Level von Datei laden

Verfasst: 26.08.2012 13:49
von TheNewOne
:allright: Danke, euch beiden. Werde jetzt ausprobieren ob ich die codes verstanden habe.

Re: Level von Datei laden

Verfasst: 26.08.2012 15:07
von TheNewOne
Soweit so gut, das Laden der Datei funktioniert schon mal, nun möchte ich aber das ein drittes Sprite den "Weg" der 1sen folgt.
Aber irgendwie will mir das nicht gelingen.

Re: Level von Datei laden

Verfasst: 26.08.2012 15:25
von ts-soft
Dafür sind die bisherigen Infos aber viel zu wenig. Außerdem wäre ein ausführbarer Beispielcode, der
das Problem aufzeigt angebracht, ansonsten wird Dir wohl eher keiner helfen können.

Gruß
Thomas

Re: Level von Datei laden

Verfasst: 26.08.2012 15:29
von TheNewOne
Hier der Code:

Code: Alles auswählen

IncludeFile "lib.pb"

init()

If OpenScreen(1600, 900, 32, "path")
  sprites()
  Repeat
    ClearScreen($FFFFFF)
    Readit()
    ExamineKeyboard()
    keys()
    FlipBuffers()
  Until quit = 1
Else
  MessageRequester("Error!","Error!")
EndIf
und die Inlcude File:

Code: Alles auswählen

Enumeration
  #weg
  #block
  #troop
  #mouse
EndEnumeration

Global x
Global y
Global a
Global tx
Global ty
Global speed
Global mx
Global my
Global row
Global quit
Global sprite

tx = 0
ty = 100
speed = 1

Procedure init()
  InitSprite()
  InitKeyboard()
  InitMouse()
EndProcedure

Procedure sprites()
  LoadSprite(#weg, "weg.bmp")
  LoadSprite(#block, "block.bmp")
  LoadSprite(#troop, "troop.bmp")
  LoadSprite(#mouse, "mouse.bmp")
EndProcedure

Procedure Weg()
  DisplaySprite(#weg, x, y)
EndProcedure 

Procedure block()
  DisplaySprite(#block, x, y)
EndProcedure

Procedure Enemy()
  If Not a = 1
    tx = x + 1
    ty = y + 1
    a = 1
  EndIf
  
  DisplaySprite(#troop, tx, ty)
  
  If Not SpritePixelCollision(#troop, tx + 25, ty, #weg, x, y)
    tx + speed
  Else
    
  EndIf
  
EndProcedure

Procedure readit()
  y = 0
  If ReadFile(1,"Test.txt")
    While Eof(1) = 0
    Dummy$ = ReadString(1) 
    x = 0
    Anzahl = CountString(Dummy$,",") + 1
    
    For i = 1 To Anzahl
      If StringField(Dummy$,i,",") = "1"
        weg()
        Enemy()
      Else
         block()
      EndIf
       x + 25
    Next
    y + 25    
    Wend 
  EndIf
EndProcedure

Procedure keys()
  If KeyboardPushed(#PB_Key_Escape)
    quit = 1
  EndIf
EndProcedure

Re: Level von Datei laden

Verfasst: 26.08.2012 22:57
von NicknameFJ
Hi TheNewOne,

in meinem Beispielcode habe ich leider den Closefile-Befehl vergessen.

Du müsstest daher in Deinem Code in der ReadIt() Procedure diesen Befehl noch einfügen. Hier dann nochmals die komplette Proc.

Code: Alles auswählen

Procedure readit()
  y = 0
  If ReadFile(1,"Test.txt")
    While Eof(1) = 0
    Dummy$ = ReadString(1)
    x = 0
    Anzahl = CountString(Dummy$,",") + 1
   
    For i = 1 To Anzahl
      If StringField(Dummy$,i,",") = "1"
        weg()
        Enemy()
      Else
         block()
      EndIf
       x + 25
    Next
    y + 25   
    Wend
    Closefile(1)  ;   <------   Hier den Befehl ergänzt
  EndIf
EndProcedure
Grüße

NicknameFJ

Re: Level von Datei laden

Verfasst: 27.08.2012 14:22
von TheNewOne
Ich habe nun ein Level das folgendermaßen aussieht:

0,0,0,0,0
1,1,0,0,0
0,1,0,0,0
0,1,1,1,1
0,0,0,0,0

Für 1 lasse ich einen "weg" anzeigen und für 0 einen "block". Nun möchte ich, dass mein 3tes Sprite den weg der 1sen verfolgt.
Ich habe das bereits mit SpriteCollision zwischen "weg" und dem dritten sprite probiert, das funktioniert aber nicht richtig.
Hat vielleicht jemand eine Idee wie ich es sonst noch machen könnte?

Edit: Könnte man vllt den weg irgendwie in eine Liste speichern oder so?