Sprung eines Sprites simulieren
Re: Sprung eines sprites simulieren
Wie ist deine Datei denn aufgebaut?
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Re: Sprung eines sprites simulieren
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
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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- Marvin133
- Beiträge: 80
- Registriert: 25.01.2010 15:51
- Computerausstattung: Win 7 Home Premium 64 Bit \ PB 4.41 Demo\2.8Ghz QuadCore \4GB RAM\ nVidia GTS 250
- Kontaktdaten:
Re: Sprung eines sprites simulieren
Also ich wollte die datei eigentlich als txt speicher und sie ist wie folgt aufgebaut
x y img
123 234 3
...
x y img
123 234 3
...
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Re: Sprung eines sprites simulieren
also, latürnich darfst du die Datei als .txt speichern...
grundsätzlich würde ich dir dann ein format wie
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.
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
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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Re: Sprung eines sprites simulieren
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:
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.
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
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.
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Open Suse 11.2: PB 4.4
Re: Sprung eines sprites simulieren
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.
Edit: Ok wenn es so gemeint war, wie Kswb73 gemeint hat, kannste meinen Code vergessen.^^
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()
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.