FFA TileEngine Test in B3D (2D Variation)

Übersicht Sonstiges Projekte

Neue Antwort erstellen

Neoxit

Betreff: FFA TileEngine Test in B3D (2D Variation)

BeitragFr, Apr 02, 2010 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Heydiho,

hatte n bissl langeweile und habe mal angefangen eine Tileengine zu entwickeln.

Derzeitig ist der Editor vorhanden, welcher es erlaubt tiles in der größe 32x32 (sollte auch mit anderen formaten funktionieren (einfach die tilesize variable auf z.b. 64 ändern)) aus dem tiles ordner zu laden.

zu beachten ist, dass keine andere dateien ausser image dateien darin befinden (ausgenommen von der "tollen" -.- Thumbs.db (diese wird übersprungen))

Man kann den namen der map (für den Dateinamen der Datei) und die x größe so wie die y größe festlegen.

Es sind noch einige bugs vorhanden. Aber benutzbar ist es durchaus schon.

Dann ist noch das "Ladeprogramm" welches diese map dann lädt und dann wieder rekonstruiert.

Ich wollte als nächstes noch ein weiteren layer reinmachen, welches es dann erlaubt, gegenstände auf einer bereits vorhandenen tile z.b. darzustellen.

Sprich 2 ebenen.

So wie die bestimmung durch rechtsklick der layer, welche begehbar sind (passable) und welche nicht passable sind.

(Daher existiert auch eine pass variable im type Very Happy)

Nunja hier habt ihr screenshots und den Quellcode dafür.
Vllt könnt ihr es ja gebrauchen Wink


user posted image


user posted image


Der Quellcode:
(Mapper)

Code: [AUSKLAPPEN]

Graphics 800,600,32,2
SetBuffer BackBuffer()

;types
Type tiles_laden
   Field id,img,name$,x,y
End Type

Type tiles_map
   Field id,x,y,img,img_id
End Type

;images
Global img_cursor    = LoadImage("gfx/img_cursor.PNG")
Global cursor      = LoadImage("gfx/cursor_dummy.PNG")

Global selektor      = LoadImage("misc/rand.PNG")

Global map_empty_tile = LoadImage("misc/map.PNG")

;informationen
dir_tiles$    = ("tiles")
dir_gfx$   = ("gfx")
dir_misc$   = ("misc")
dir_maps$   = ("maps")

tilesize = 32

;globals
Global cursor_x
Global cursor_y
Global cursor_tileID

Global TTile_ID = 1

Global palette_tile_x = 450
Global palette_tile_y = 0

Global map_name$ = Input("Map Name: ")
Global map_x_max = Input("Map Breite: ")
Global map_y_max = Input("Map Höhe:   ")

Global map_x
Global map_y
Global map_tile_id


For i = 1 To map_y_max
   For j = 1 To map_x_max
   TMapTile.tiles_map = New tiles_map
   TMapTile\id = map_tile_id + 1
   TmapTile\x = map_x
   TmapTile\y = map_y
   TmapTile\img = map_empty_tile
   map_x = map_x + tilesize
   Next
map_y = map_y + tilesize
map_x = 0
Next


;daten laden
dir_aktuell = ReadDir(dir_tiles$)

Repeat

file$=NextFile$(dir_aktuell)

; Wenn keine keine Weitere File gefunden wurde, laden ende.
If file$="" Then Exit


;If file$ = ("2.PNG") Then
; Wenn es eine file ist (1) und NICHT Thumbs.db heißt dann lade die file und weise den entsprechenden Type zu.
If FileType(dir_tiles$+"\"+file$) = 1 And file$ <> ("Thumbs.db") Then
   TTile.tiles_laden = New tiles_laden
   TTile\id = TTile_ID
   TTile\img = LoadImage(dir_tiles$+"\"+file$)
   TTile\name$ = file$
   TTile\x = palette_tile_x
   TTile\y = palette_tile_y
   palette_tile_x = palette_tile_x + tilesize
   If palette_tile_x > 750 Then
      palette_tile_x = 450
      palette_tile_y = palette_tile_y + tilesize
   EndIf
    TTile_ID = TTile_ID + 1
End If
;EndIf
Forever




Repeat
Cls
cursor_x = MouseX()
cursor_y = MouseY()


;Map Palette malen

For TMapTile.tiles_map = Each tiles_map
   DrawImage TMapTile\img,TMapTile\x,TMapTile\y
   
   If ImagesOverlap(cursor,cursor_x,cursor_y,TMapTile\img,TMapTile\x,TMapTile\y)
      DrawImage selektor,TMapTile\x,TMapTile\y
      
      If MouseDown(1) And cursor_tileID <> 0 Then
         For ttile.tiles_laden = Each tiles_laden
            If ttile\id = cursor_tileID Then
               TMapTile\img = ttile\img
               TMapTile\img_id = ttile\id
            EndIf
         Next
      EndIf
      
   EndIf
   
   
   
Next


;TilePalette malen

For ttile.tiles_laden = Each tiles_laden
   DrawImage ttile\img,ttile\x,ttile\y
   palette_tile_x = palette_tile_x + tilesize
   
   If ImagesOverlap (cursor,cursor_x,cursor_y,ttile\img,ttile\x,ttile\y) Then
      Text 0,0,("ID: "+ttile\id)
      DrawImage selektor,ttile\x,ttile\y
      If MouseHit(1) Then
         cursor_tileID = ttile\id
      EndIf
   EndIf
   
Next


;Speicherfunktion
If KeyHit(57) Then
   ChangeDir(dir_maps$)
   save_file = WriteFile(map_name$+".map")
   WriteLine(save_file,tilesize)
   WriteLine(save_file,map_x_max)
   WriteLine(save_file,map_y_max)
   ;For save_tileID = 1 To (map_x_max*map_y_max)
      For TMapTile.tiles_map = Each tiles_map
         WriteLine(save_file,TMapTile\img_id)
      Next
   ;Next
   CloseFile(save_file)
EndIf


Text 500,500,cursor_tileID

DrawImage cursor,cursor_x,cursor_y
DrawImage img_cursor,cursor_x,cursor_y
Flip
Until KeyHit(1) End



Der Quellcode:
(Loader)

Code: [AUSKLAPPEN]

Graphics 800,600,32,2
SetBuffer BackBuffer()

;Types
Type MapLay1
   Field id,img,x,y,passable
End Type

Type TileSet
   Field id,img
End Type

;Images
img_player = LoadImage ("player.PNG")

;Infos

;Globals
dir_tiles$    = ("tiles")
dir_gfx$   = ("gfx")
dir_misc$   = ("misc")
dir_maps$   = ("maps")

Global map_x
Global map_y
Global map_x_max
Global map_y_max
Global tilesize
Global tile_id

;Tiles aus den Tileordner Laden und die entsprechende ID zuweisen
dir_aktuell = ReadDir(dir_tiles$)
Repeat
file$=NextFile$(dir_aktuell)
If file$="" Then Exit
If FileType(dir_tiles$+"\"+file$) = 1 And file$ <> ("Thumbs.db") Then
   tile_id = tile_id + 1
   tile.tileset = New tileset
   tile\id = tile_id
   tile\img = LoadImage(dir_tiles$+"\"+file$)
EndIf
            
Forever

;Mapnamen Eingeben
map_file_overlay1_name$ = Input("Namen der zu Ladenen Map: ")

;Map Laden
map_file_overlay1 = OpenFile(dir_maps$+"/"+map_file_overlay1_name$+".map")
   
   ;3 Headinformationen der Mapdatei laden
   map_tilesize = ReadLine(map_file_overlay1)
   map_x_max = ReadLine(map_file_overlay1)
   map_y_max = ReadLine(map_file_overlay1)
   
   ;In den Type Laden
   For i = 1 To map_y_max
      For j = 1 To map_x_max
      map1.maplay1 = New maplay1
      map1\id = ReadLine(map_file_overlay1)
      map1\x   = map_x
      map1\y   = map_y
      
      For tile.tileset = Each tileset
         If map1\id = tile\id Then
            map1\img = tile\img
         EndIf
      Next
      

      
      map_x = map_x + map_tilesize
      Next
   map_x = 0
   map_y = map_y + map_tilesize
   Next

CloseFile(map_file_overlay1)



;//////HAUPTSCHLEIFE///////
Repeat
Cls


For map1.maplay1 = Each maplay1
   DrawImage map1\img,map1\x,map1\y
Next


Flip
Until KeyHit(1) End




Und hier nochmal der Download (Quelldateien und Images):

http://www.frequenzy.net/stuff/mapper.rar



Wenn jemand interesse hat, daran weiterzubasteln, oder ihn evtl sogar verwenden kann, wäre es nett wenn er mir doch wenigstens nen kleines post hier lässt.

Wer natürlich nicht mit einer 100 % cpu auslastung testen will, sollte noch eine framebegrenzung einbauen.

Ansonsten ist es freeforall für die, die mal wissen wollten wie soetwas in etwa funktioniert.

Es gibt mit sicherheiten elegantere Lösungen für ein solches mapping programm.
Vllt kann hier der ein oder andere ja noch Tipps geben.

Ansonsten viel spaß damit Wink

Neue Antwort erstellen


Übersicht Sonstiges Projekte

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group