Seite 1 von 1

Bmp2Map : ein ersatz für nen Mapeditor

Verfasst: 19.02.2005 16:04
von Kaeru Gaman
wem ist das noch nicht passiert, dass er mal schnell nen Map-Editor brauchte, um mit dem Game weiterzukommen?

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
In den Data-zeilen stehen die Farben in der Reihenfolge, wie in PAINT,
die Extra-Zuordnung von Nummern soll ein Verändern der Farbe -> Tile Zuordnung erleichtern.
Kleine Grafik zur verdeutlichung der momentanen zuordnung:
Bild

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

Verfasst: 19.02.2005 16:08
von SlapY
Hi,
Sehr schönes System wie ich finde :)

Bye
Slap

Verfasst: 19.02.2005 16:15
von Andre
Die Prozedur zum Laden sollte so aussehen:

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 
    EndIf 
    CloseFile(1) 
EndProcedure
OpenFile() => in ReadFile() geändert, um unnötiges Erstellen einer Datei zu verhindern

ReadLong() => hier waren jeweils Parameter und Rückgabewerte vertauscht :wink:

Verfasst: 19.02.2005 16:26
von Kaeru Gaman
danke andrè :wink:

hatte die procedure nurnch fix hingeschmiert.. sorry an alle...

habs oben auch geändert...

Verfasst: 08.08.2006 02:29
von Kaeru Gaman
hab oben mal das bild aktualisiert, die palette fehlte, weil mein alter webspace off ist.

nochmal zum verständnis:

ein pixel entspricht einer Tile in der TileMap.
man kann also so etwas ähnliches wie ne MiniMap in PAINT malen,
und das als Map-Array einlesen, dazu dient bmp2map.

Verfasst: 08.08.2006 07:09
von DarkDragon
Dasselbe nutze ich in meinem 3D Spiel in etwa auch. Dort liegt alles auf dem Terrain. Die Höhe wird nur an das Terrain angepasst.