Bmp2Map : ein ersatz für nen Mapeditor

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Bmp2Map : ein ersatz für nen Mapeditor

Beitrag 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
Zuletzt geändert von Kaeru Gaman am 08.08.2006 02:27, insgesamt 3-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
SlapY
Beiträge: 47
Registriert: 08.01.2005 20:57

Beitrag von SlapY »

Hi,
Sehr schönes System wie ich finde :)

Bye
Slap
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag 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:
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

danke andrè :wink:

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

habs oben auch geändert...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten