Nun, SlapY und mir ist das gestern passiert...
Und was macht man, wenn man keine zeit hat, mal "schnell" einen zu schreiben?
Man benutzt einen, der bei windows mitgeliefert wird.
Mit PAINT kann man doch einwandfrei pixeln, gell?
Und die Standart-Palette, die angezeigt wird, hat 28 verschiedene Farben.
Für den Anfang reichen doch 28 verschiedene Tiles in der Map...
also hab ich fix ne Routine geschrieben, die eine Bmp in eine Map einliest.
Jetzt hab ich ein komplettes Programm draus gemacht:
Mittels File-Requester wird die einzulesende Bitmap erfragt, (max. 1024x768)
diese wird vom screen in ein Array gepackt,
und unter einem .map Filenamen gespeichert (auch wieder FileRequester)
Hier ist der Code:
Code: Alles auswählen
InitSprite()
InitKeyboard()
BMPName.s = OpenFileRequester("Bitmap zum einlesen auswählen","c:\","Bitmap|*.bmp|Alle|*.*",0)
OpenScreen(1024,768,32,"BMP2MAP")
Dim Colors(27)
Dim Tiles(27)
Restore Table
For n=0 To 27
Read Red.w
Read Grn.w
Read Blu.w
Read Tile.w
Colors(n) = RGB(Red,Grn,Blu)
Tiles(n) = Tile
Next
LoadSprite(1,BMPName,0)
MapWidth = SpriteWidth(1)
MapHeight = SpriteHeight(1)
If MapWidth>1024 Or MapHeight>768
MessageRequester("Fehler !","Die maximale Größe beträgt 1024x768 Pixel!",#MB_ICONERROR)
End
EndIf
Dim Map.l(MapWidth-1,MapHeight-1)
DisplaySprite(1,0,0) ; anzeigen der Grafik, die geladen wurde
FlipBuffers()
; Map Grabben
;
DisplaySprite(1,0,0)
StartDrawing(ScreenOutput())
For t=0 To MapHeight-1
For n=0 To MapWidth-1
For i=0 To 27
If Point(n,t) = Colors(i)
Map(n,t) = Tiles(i)
EndIf
Next
Next
Next
StopDrawing()
CloseScreen()
MapName.s = OpenFileRequester("Name und Pfad der zu speichernden Map wählen","c:\","Maps|*.map|Alle|*.*",0)
CreateFile(1,Mapname)
WriteLong(MapWidth)
WriteLong(MapHeight)
For t=0 To MapHeight-1
For n=0 To MapWidth-1
WriteLong(Map(n,t))
Next
Next
CloseFile(1)
End
DataSection
Table:
Data.w 0, 0, 0, 0 ; Schwarz
Data.w 128, 128, 128, 1 ; Dunkelgrau
Data.w 128, 0, 0, 2 ; Dunkelrot
Data.w 128, 128, 0, 3 ; Dunkelgelb
Data.w 0, 128, 0, 4 ; Dunkelgrün
Data.w 0, 128, 128, 5 ; Dunkeltürkis
Data.w 0, 0, 128, 6 ; Dunkelblau
Data.w 128, 0, 128, 7 ; Dunkellila
Data.w 128, 128, 64, 16 ; Graugelb
Data.w 0, 64, 64, 17 ; Graugrün
Data.w 0, 128, 255, 18 ; Blassblau
Data.w 0, 64, 128, 19 ; Graublau
Data.w 64, 0, 255, 20 ; Seeblau
Data.w 128, 64, 0, 21 ; Braun
Data.w 255, 255, 255, 15 ; Weiss
Data.w 192, 192, 192, 8 ; Hellgrau
Data.w 255, 0, 0, 9 ; Rot
Data.w 255, 255, 0, 10 ; Gelb
Data.w 0, 255, 0, 11 ; Grün
Data.w 0, 255, 255, 12 ; Türkis
Data.w 0, 0, 255, 13 ; Blau
Data.w 255, 0, 255, 14 ; Lila
Data.w 255, 255, 128, 22 ; Blassgelb
Data.w 0, 255, 128, 23 ; Blassgrün
Data.w 128, 255, 255, 24 ; Blasstürkis
Data.w 128, 128, 255, 25 ; Lilablau
Data.w 255, 0, 128, 26 ; Pink
Data.w 255, 128, 64, 27 ; Ocker
die Extra-Zuordnung von Nummern soll ein Verändern der Farbe -> Tile Zuordnung erleichtern.
Kleine Grafik zur verdeutlichung der momentanen zuordnung:

Zum Einlesen der fertigen Map dient diese Proc:
Code: Alles auswählen
Procedure LoadMap(MapName.s)
If ReadFile(1,Mapname)
MapWidth = ReadLong()
MapHeight = ReadLong()
Dim Map(MapWidth-1,MapHeight-1)
For t=0 To MapHeight-1
For n=0 To MapWidth-1
Map(n,t) = ReadLong()
Next
Next
CloseFile(1)
EndIf
EndProcedure