Seite 2 von 2

Re: Sprung eines sprites simulieren

Verfasst: 05.04.2010 18:59
von jojo1541
Wie ist deine Datei denn aufgebaut?

Re: Sprung eines sprites simulieren

Verfasst: 05.04.2010 19:31
von Kaeru Gaman
lad die ganze Datei auf einen rutsch, keine Dateioperationen im Game-Loop.
du brauchst für ne anständige Tilemap ein 2D-Array, schau dir mein verlinktes Beispiel noch mal genau an.

wie man sowas als binary speichert und lädt, hab ich als sidenote in BMP2MAP drin:
http://www.purebasic.fr/german/viewtopi ... 31&start=0

Re: Sprung eines sprites simulieren

Verfasst: 05.04.2010 19:35
von Marvin133
Also ich wollte die datei eigentlich als txt speicher und sie ist wie folgt aufgebaut

x y img
123 234 3
...

Re: Sprung eines sprites simulieren

Verfasst: 05.04.2010 20:03
von Kaeru Gaman
also, latürnich darfst du die Datei als .txt speichern...
grundsätzlich würde ich dir dann ein format wie

Code: Alles auswählen

0/0 1/0 2/0 3/0 4/0
0/1 1/1 2/1 3/1 4/1
0/2 1/2 2/2 3/2 4/2
0/3 1/3 2/3 3/3 4/3
empfehlen, also eine tilezeile, eine textzeile.
also, das da sind die koordinaten, nicht der Inhalt. grundsätzlich speicherst du nur den Inhalt.
per ReadString() bekommst du glaubich jede Zeile einzeln, also immer eine Zeile lesen und splitten, in eine Arrayzeile schreiben, dann die nächste Zeile...

trotzdem musst du die datei beim startup komplett einlesen und wieder schließen, während des gameloops machst du keine dateioperationen.

Re: Sprung eines sprites simulieren

Verfasst: 05.04.2010 21:51
von kswb73
ReadString() liest eine ganze Zeile von einer Datei aus. Mittels StringField() kannst du dann die einzelnen Zahlen auseinander Pflücken, da sie durch Leerzeichen getrennt sind. Dann kannst du sie wie du bereits weist mit Val() in richtige Zahlen umwandeln.

Beispiel:
Datei (Map.txt):
500 500 3
158 123 4
Code:

Code: Alles auswählen

;Da PureBasic keine vorgefertige Struktur für
;dein Vorhaben hat, erstellen wir eine eigene.

Structure Object
;Die X und Y Position
X.l
Y.l
;und das Sprite, was später angezeigt werden soll
Sprite.l
EndStructure

;Wir erstellen als ein Array names Object, mit
;der Struktur Object.
Dim Object.Object(10)

;Jetzt öffnen wir unsere Datei
OpenFile(0,"Map.txt")

;Wir nutzen die Variable Pos, damit wir nicht alles
;ins erste Element des Arrays schreiben. Dann 
;hätten wir nämlich nur ein Element.
Pos=0

  ;Wir lesen die Datei bis zum Ende aus
  While Not Eof(0)
  ;Wir lesen eine Zeile aus und speichern sie in
  ;der Variable String.
  String.s=ReadString(0)
  
  ;Hier passieren meherer Sachen aufeinmal. 
  
  ;1) Wir nehmen uns eine Zahl aus der Zeile heraus
  ;   Die Zahlen sind über Leerzeichen getrennt, 
  ;   deshalb können wir sie mit StringField()
  ;   voneinander trennen.
  
  ;2) Val() wandelt die Zahl (welche noch als
  ;   String vorliegen in eine richtige Zahl 
  ;   (aus Sicht des Computers) um.
  
  ;3) Die Zahl wird dann unserem Objekt zugewiesen
  Object(Pos)\X=Val(StringField(String,1," "))
  Object(Pos)\Y=Val(StringField(String,2," "))
  Object(Pos)\Sprite=Val(StringField(String,3," "))
  
  ;Wir erhöhen Pos um eins damit wir das nächste 
  ;Element beschreiben
  Pos+1
  Wend
CloseFile(0)  

;Hier noch ein kleines Testcode um zu prüfen ob alles
;richtig geladen wurde. Str() wandelt Zahlen übrigends
;wieder in Strings um. 
;Mit dem Plus können wir dann zwei Strings verbinden. 
;Debug gibt uns dann das Ergebnis aus (funktioniert
;mit Zahlen und Strings). Wenn wir das Programm ohne
;Debugger starten, oder eine Executetabelle  erstellen
;(Menü: Compiler --> Executetabelle erstellen...) wird
;Debug nicht mehr ausgegeben

  For a=0 To Pos-1
  Debug "Object"
  Debug "X: "+str(Object(a)\X)
  Debug "Y: "+str(Object(a)\Y)
  Debug "Sprite: "+str(Object(a)\Sprite)
  Next a
String:
Ein String ist eine Zeichenkette. Mann könnte auch einfach sagen eine Reihe von Buchstaben. Alles was ich hier schreibe ist ein String. In PureBasic erkennst du Strings daran, dass sie in Anfürungszeichen geschrieben werden. Natürlich kann man ins Strings auch ganz einfach Zahlen schreiben. Allerdings ist das nur für uns Menschen sinnvoll. Ein Computer kann mit einer Zahl in einem String erstmal nichts anfangen. Schreibst du etwas in einem Texteditor wird dies als String gespeichert.
Um Strings in PureBasic in Variabeln speichern zu können schreibt man entweder immer Name$ (Dollarzeichen) oder man schreibt .s hinter die Variable wenn man sie zum ersten mal benutzt.

Zahl/Integer:
Der Computer arbeitet mit einem anderen, für uns schwer lesbaren, Zahlensystem, das Binärssystem. Dass verbraucht deutlich weniger Speicher als ein String und damit kann der Computer sehr viel schneller rechnen. Wollen wir als Programmierer also eine Zahl für den Computer schreiben müssen wir sie ins Binärformat umwandeln. Im Programmcode macht PureBasic das automatisch, wenn du die Zahl nicht in Anführungzeichen setzt. Lesen wir aber später eine Zahl in unseren Zahlensystem aus (z. B. 1658) als String aus, müssen wir sie mit Val() ins Binärsystem umwandeln. Umgekehrt funktioniert das ganze mit Str().

Weitere Infos und Beispiele zu den Befehlen findest du in der PureBasic Hilfe welche du mit [F1] aufrufen kannst.

Re: Sprung eines sprites simulieren

Verfasst: 05.04.2010 21:59
von jojo1541
Wenn ich das richtig verstehe, willst du deine Map also so aufbauen:

Zahl 1 = X-Koordinate
Zahl 2 = Y-Koordinate
Zahl 3 = Sprite

Also XYS XYS.

Hab mal was gebastelt, das Dateiformat sieht so aus:
Erste Zeile = Anzahl der Koordinaten in der nächsten Zeile
Zweite Zeile = Die Dreierkombi

Ist Vielleicht nicht die beste Lösung, aber sie läuft. <)

Code: Alles auswählen

InitSprite()
InitKeyboard()

#Level = 0

Dim Level(25,19)

OpenScreen(800,600,32,"Test")

CreateSprite(1,32,32) ; Wir erzeugen zwei Sprites. Hier das Erste
  StartDrawing(SpriteOutput(1)) ;Auf das Sprite malen
    Box(0,0,32,32,RGB(200,100,0)) ;ne Box zeichnen
  StopDrawing() ; Und den Drawingblock schließen
  
CreateSprite(2,32,32) ; Hier das zweite
  StartDrawing(SpriteOutput(2)) ; das selbe wie oben nur auf das neue Sprite
    Box(0,0,32,32,RGB(0,100,200))
  StopDrawing()
  
;Jetzt lesen wir die Datei ein. Man muss einen eindeutigen Trenner haben, 
;der die einzelnen Dreierkombis voneinander trennt. In diesem Fall Space.

If OpenFile(#Level,"Leveldaten.txt") ; Wenn das File geöffnet werden kann
  Anz = Val(ReadString(#level))
  Daten$ =  ReadString(#Level)
  For x = 1 To Anz ; alle Daten auslesen
    Coords$ = StringField(Daten$,x," "); Entsprechende Kombi auslesen
    Xcoord = Val(Mid(Coords$,1,1));Xkoordinate holen
    Ycoord = Val(Mid(Coords$,2,1));Ykoordinate holen
    Sprite = Val(Mid(Coords$,3,1)); Sprite holen
    Level(Xcoord,Ycoord) = Sprite ;Array-stelle zuweisen
  Next
EndIf  
  
  Repeat
  
    ClearScreen(0)
    
    For x = 0 To 24
      For Y = 0 To 18
        If level(x,y) > 0
          DisplaySprite(level(x,y),x*32,y*32)
        EndIf
      Next
    Next
    
    FlipBuffers()
    
    ExamineKeyboard()
Edit: Ok wenn es so gemeint war, wie Kswb73 gemeint hat, kannste meinen Code vergessen.^^