Level von Datei laden

Anfängerfragen zum Programmieren mit PureBasic.
TheNewOne
Beiträge: 60
Registriert: 06.04.2011 14:33

Level von Datei laden

Beitrag 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.
Win7, 64bit, PB 4.60
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Level von Datei laden

Beitrag 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
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Level von Datei laden

Beitrag 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")
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
TheNewOne
Beiträge: 60
Registriert: 06.04.2011 14:33

Re: Level von Datei laden

Beitrag von TheNewOne »

:allright: Danke, euch beiden. Werde jetzt ausprobieren ob ich die codes verstanden habe.
Win7, 64bit, PB 4.60
TheNewOne
Beiträge: 60
Registriert: 06.04.2011 14:33

Re: Level von Datei laden

Beitrag 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.
Win7, 64bit, PB 4.60
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Level von Datei laden

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
TheNewOne
Beiträge: 60
Registriert: 06.04.2011 14:33

Re: Level von Datei laden

Beitrag 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
Win7, 64bit, PB 4.60
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Level von Datei laden

Beitrag 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
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
TheNewOne
Beiträge: 60
Registriert: 06.04.2011 14:33

Re: Level von Datei laden

Beitrag 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?
Win7, 64bit, PB 4.60
Antworten