Seite 3 von 6

Verfasst: 19.06.2005 21:01
von Rubiko
EDIT: ups... code verbessert klappt aber immernoch net


bin schon mal froh das ich auf den richtigen weg bin...

jetzt siehts so aus

Code: Alles auswählen

Enumeration
#Tile_Grass01
#Tile_GrassSand01
#Tile_GrasSsand02
#Tile_Water01
#Tile_SandWater02
#Tile_Sandeckenordwest
  
#Sprite_Baum01
EndEnumeration

Structure spritesanzeigen
  zeicheninmap.l
  spriteID.l
  spriteposX.l
  spriteposY.l
EndStructure

Procedure loadtilemap()
  Dim tilemap.l(40)
  tilemap(0) = #Tile_GrassSand01
  
  If zeicheninmap = 1
    spriteID = tilemap(0)
  EndIf 
EndProcedure

Procedure showtilemap()
  
  spriteposX.l = 0
  spriteposY.l = 0
  
  If OpenFile(0, "\GFX\Map\map.map")
    firststring.s = ReadString()
    If FindString(firststring, ".", 0)
      spriteposX + 50
      If spriteposX >= 500
        spriteposY + 50
        spriteposX = 0
      EndIf
      
    EndIf
    
  CloseFile(0)
EndIf

DisplaySprite(spriteID,spriteposX,spriteposY)
    
EndProcedure
windows sagt immernoch das es einen fehler findet... :(

Verfasst: 20.06.2005 17:16
von Rubiko
gut.... irgendwas hat einfach nicht gestimmt, kann es mir immer noch nicht erklären, aber ein compiler neustart hat's gebracht...
und anzeigen tut er trotzdem nix... (liegt das vielleicht daran das ich nach nummern überprüfen muss? wie mach ich das denn in einen standartstring, schauen nach JEDER nummer.... oder soll ich jetzt wieder mit if gucken ob bei jeden string eine nummer ist, obwohl das viel aufwand is... (if... = 1... if... = 2...)

aber eine frage wurde mir immernoch nicht beantwortet, falsch schon sagt mir bitte auf welcher seite...

wie mache ich es das die figur IMMER ein tile nach unten läuft egal wie langsam/schnell er ist...

ich danke für eure hilfe

Verfasst: 20.06.2005 20:33
von Kaeru Gaman
also... am besten speicherst du longs...

...liest in ein 2D-array...

gehst das array beim anzeigen durch...

also

Code: Alles auswählen

Dim Map(1,1)
Procedure LoadTileMap
    If OpenFile(0, "\GFX\Map\map.map")
        XS = ReadLong()
        YS = ReadLong()
        ReDim Map(XS,YS)
        For t = 0 To YS
            For n=0 To XS
                Map(n,t) = ReadLong()
            Next
        Next
        CloseFile(0)
        ProcedureReturn 1
    Else
        ProcedureReturn 0
    EndIf
EndProcedure
die ersten beiden Longs der Datei geben die Größe an,
danach kommen die Spritenummern der Tiles zeilenweise.

anzeigen

Code: Alles auswählen

Procedure SchowMap ( x.l, y.l)
    For t=0 to 15
        For n=0 to 15
             DisplaySprite(Map(x+n,y+t), 32*n, 32*t)
        Next
    Next
EndProcedure
damit wird ein Ausschnitt von 16x16 tiles (die 32x32 pixel groß sind)
ab der linken oberen Bildschirmecke angezeigt.
der ausschnitt beginnt bei Kartenposition (x,y)

... hoffe, das hilft dir weiter. das ist standard-vorgehensweise. ;)

Verfasst: 18.03.2006 16:24
von Rubiko
Erstmal... tut mir Leid, dass ich den alten Thread hochhole, find's aber besser als wieder einen neuen aufzumachen...
und ich will endlich kapieren wie das mit den Tilemaps geht
Kaeru Guman hat geschrieben: also... am besten speicherst du longs...

...liest in ein 2D-array...

gehst das array beim anzeigen durch...

also
Code:

Dim Map(1,1)
Procedure LoadTileMap
If OpenFile(0, "\GFX\Map\map.map")
XS = ReadLong()
YS = ReadLong()
ReDim Map(XS,YS)
For t = 0 To YS
For n=0 To XS
Map(n,t) = ReadLong()
Next
Next
CloseFile(0)
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure


die ersten beiden Longs der Datei geben die Größe an,
danach kommen die Spritenummern der Tiles zeilenweise.

anzeigen
Code:
Procedure SchowMap ( x.l, y.l)
For t=0 to 15
For n=0 to 15
DisplaySprite(Map(x+n,y+t), 32*n, 32*t)
Next
Next
EndProcedure


damit wird ein Ausschnitt von 16x16 tiles (die 32x32 pixel groß sind)
ab der linken oberen Bildschirmecke angezeigt.
der ausschnitt beginnt bei Kartenposition (x,y)

... hoffe, das hilft dir weiter. das ist standard-vorgehensweise. ;)
das erste Problem kam damit, dass PB ReDim nicht kennt... (3,94er Demo... aber dauert ja nichtmehr lang bis zu meinem Geburtstag :D)

naja, dann hab ich eben den hier ausm Codearchiv genommen

Code: Alles auswählen

Procedure ReDim(Pointer.l, Len.l, Fieldlen.l)

fLen.l = SizeOf(LONG)

If Fieldlen <> 0 : fLen = Fieldlen : EndIf

Fields.l = PeekL(Pointer - 8)
If Len < Fields
   
  PokeL(Pointer - 8, Len + 1)
  ProcedureReturn Pointer
Else

oldArrayLen.l = (Fields * fLen + 8)
newArrayLen.l = (Len * fLen)


newArray = AllocateMemory(newArrayLen + 8)
CopyMemory(Pointer - 8, newArray, oldArrayLen)

PokeL(newArray, newArrayLen)

ProcedureReturn newArray
EndIf
EndProcedure 

und bei ReDim

Code: Alles auswählen

ReDim Map(@Map,XS,YS)
genommen

Soweit so gut, aber wenn ich deine Proceduren benutz passiert nichts...
hab als test bei der Map-datei einfach mal 1111 reingetan... mach ich da was falsch?

Ich glaub mir fehlt da vielleicht auch ein bisschen Grundwissen, bei den Textdateien kann man doch von 0 - 9 IDs eintragen, heißt doch, dass ich nicht mehr als 10 benutzen darf, da 10 schon wieder als eine 1 und eine 0 erkannt wird, oder denk ich da grad falsch?

die Grafiken sind übrigens bei mir unter GFX\Sprites (einzelne mit den Namen 1, 2, 3 usw...) und GFX\Tiles (für die Felder, 1, 2, 3 usw.)

Hoffe dir ist die Lust nicht langsam vergangen Kaeru Guman^^

Würde mich wirklich auf eine Antwort freuen....

Danke im Vorraus
Rubiko

Verfasst: 18.03.2006 17:13
von Zaphod
Wieso texte, das macht doch überhaupt keinen sinn? Benutz doch einfach ein array von longs, dann hast du mehr ids als du brauchen wirst.

Verfasst: 18.03.2006 17:22
von Rubiko
aber irgendwoher muss ich das array doch füllen... und das geht doch durch den einlesen der map datei....
sorry, ich weiß jetzt nicht genau was du meinst

Verfasst: 18.03.2006 19:47
von Kaeru Gaman
dafür musst du dir einen map-editor schreiben,
oder du benutzt eine krücke:

http://www.purebasic.fr/german/viewtopic.php?t=2131

das isn mini-tool, damit kannst du deine map in PAINT aufmalen, jedes Pixel bedeutet ein Tile.

die korrespondierende Tile-ID kannst du in den DATA-zeilen ändern...

die MAP-datei selber enthält dann dementsprechend die Tile-IDs als Longs, nicht als zahlen...

...und selbst wenn du das per text machen wolltest, wieso nimmst du nur 0-9?
du hast noch 26 buchstaben + 26 kleine + jede menge sonderzeichen...
du kannst jedes zeichen mit ASCII 32-127 direkt per tastatur eingeben...

Verfasst: 18.03.2006 21:05
von Rubiko
ähh...

Longs sind doch ganz normale Variablentypen, die man mit Zahlen füllen kann oder seh ich da jetzt was ganz falsch? Deswegen meinte ich auch eine Textdatei mit Zahlen zum einlesen...

Bei Wikipedia steht nichts gescheits zu Long/Longs und bei der PB Hilfe auch nur, dass es ein Datentyp ist

Verfasst: 18.03.2006 21:29
von Kaeru Gaman
rubiko, natürlich könntest du eine textdatei mit zahlen einlesen...
aber das ist
a) platzverschwendung
b) hast du doch bestimmt keine lust, tausende von zahlen zu tippen..

longs können werte von -2147483648 bis +2147483647 enthalten...
deswegen ist es unverständlich, wieso du einstellige zahlen in ner textdatei haben willst....

die endgültige MAP-datei besteht letztendlich aus longs,
schau mal in der PB-Hilfe unter ReadLong() und WriteLong()

...und schau dir auch mal das beispiel in dem Link an, dern ich gepostet hab,
das ist ein netter ersatz für nen mapedi, wenn man noch an der engine schraubt...

Verfasst: 18.03.2006 21:38
von Rubiko
Kaeru Gaman hat geschrieben:rubiko, natürlich könntest du eine textdatei mit zahlen einlesen...
aber das ist
a) platzverschwendung
b) hast du doch bestimmt keine lust, tausende von zahlen zu tippen..
nene, ich denke du hast mich missverstanden, ich seh ein, dass deine Lösung besser ist.
Ich erkenn jetzt auch meinen Fehler... ich dachte Longwerte sind ganz normale Zeichen, also WriteLong(1) das selbe wäre wie die 1 manuell in die Textdatei zu schreiben...
Vielen Dank für deine Hilfe, werd jetzt etwas rumprobieren