Type layers
Field s.tiles
Field e.tiles
End Type
Type tiles
Field image
Field x
Field y
Field layer.layers
End Type
Function CreateLayer.layers()
Local layer.layers
;create new layer
layer = New layers
Return layer
End Function
Function DeleteLayer(layer.layers)
Local tile.tiles
;clear tiles from layer
If layer\s <> Null
tile = layer\s
Repeat
If tile = layer\e
Delete tile
Exit
Else
tile = After tile
Delete Before tile
End If
Forever
End If
;delete layer
Delete layer
End Function
Function CreateTile.tiles(image,x,y,layer.layers)
Local tile.tiles
;create new tile
tile = New tiles
tile\image = image
tile\x = x
tile\y = y
tile\layer = layer
;insert tile into layer
If layer\s = Null
;this is first tile in layer, set start pointer to tile
layer\s = tile
Else
;there are other tiles in this layer, add tile to end of list
Insert tile After layer\e
End If
;update the end pointer to this tile
layer\e = tile
Return tile
End Function
Function DeleteTile(tile.tiles)
;update layers list of tiles
If tile = tile\layer\s And tile = tile\layer\e
;if this tile is the only tile in layer NULL start end pointers (clear the list)
tile\layer\s = Null
tile\layer\e = Null
ElseIf tile = tile\layer\s
;tile is first in list, update start pointer
tile\layer\s = After tile
ElseIf tile = tile\layer\e
;tile is last in list, update end pointer
tile\layer\e = Before tile
End If
;delete tile
Delete tile
End Function
Function MoveLayerUp(layer.layers)
;if the layer before this layer exists, then move this layer, before it
If Before layer <> Null Insert layer Before (Before layer)
End Function
Function MoveLayerDown(layer.layers)
;if the layer after this layer exists, then move this layer, after it
If After layer <> Null Insert layer After (After layer)
End Function
Graphics 640,480,32,2
;frame timer
Global timer = CreateTimer(50)
;create 3 layers
Global layer1.layers = CreateLayer()
Global layer2.layers = CreateLayer()
Global layer3.layers = CreateLayer()
;create some tile images
Global image1 = CreateImage(32,32)
Global image2 = CreateImage(32,32)
Global image3 = CreateImage(32,32)
SetBuffer ImageBuffer(image1)
ClsColor 255,0,0
Cls
SetBuffer ImageBuffer(image2)
ClsColor 0,255,0
Cls
SetBuffer ImageBuffer(image3)
ClsColor 0,0,255
Cls
;set active layer and image
Global currentlayer.layers = layer1.layers
Global currentimage = image1
SetBuffer BackBuffer()
ClsColor 255,255,255
Repeat
Cls
;render layers
If Last layers <> Null
layer.layers = Last layers
Repeat
;render this layers tiles
If layer\s <> Null
tile.tiles = layer\s
Repeat
DrawImage tile\image,tile\x,tile\y
If tile = layer\e Exit
tile = After tile
Forever
End If
If layer = First layers Exit
layer = Before layer
Forever
End If
;user interface
x = MouseX()
y = MouseY()
If x > 160
DrawImage currentimage,x,y
If MouseHit(1)
CreateTile(currentimage,x,y,currentlayer)
End If
End If
If KeyHit(2) currentlayer = layer1
If KeyHit(3) currentlayer = layer2
If KeyHit(4) currentlayer = layer3
If KeyHit(200) MoveLayerUp(currentlayer)
If KeyHit(208) MoveLayerDown(currentlayer)
If KeyHit(57)
Select currentimage
Case image1
currentimage = image2
Case image2
currentimage = image3
Case image3
currentimage = image1
End Select
End If
Color 0,0,0
Rect 0,0,160,480,1
Color 255,255,255
Text 2,2,"left click to place"
Text 2,16,"a tile."
Text 2,40,"up to move layer up"
Text 2,64,"down to move layer"
Text 2,78,"down"
Text 2,102,"1,2,3 to change"
Text 2,116,"the current layer"
Text 2,140,"space to change"
Text 2,154,"tile image"
Text 10,178,"current tile"
DrawImage currentimage,40,192
y = 244
For layer.layers = Each layers
If layer = layer1
If layer = currentlayer
Color 0,128,0
Rect 2,y,156,20,1
Color 0,55,0
Rect 2,y,156,20,0
Color 255,255,255
Text 4,y,"layer 1"
Else
Color 128,128,128
Rect 2,y,156,20,1
Color 55,55,55
Rect 2,y,156,20,0
Color 0,0,0
Text 4,y,"layer 1"
End If
ElseIf layer = layer2
If layer = currentlayer
Color 0,128,0
Rect 2,y,156,20,1
Color 0,55,0
Rect 2,y,156,20,0
Color 255,255,255
Text 4,y,"layer 2"
Else
Color 128,128,128
Rect 2,y,156,20,1
Color 55,55,55
Rect 2,y,156,20,0
Color 0,0,0
Text 4,y,"layer 2"
End If
ElseIf layer = layer3
If layer = currentlayer
Color 0,128,0
Rect 2,y,156,20,1
Color 0,55,0
Rect 2,y,156,20,0
Color 255,255,255
Text 4,y,"layer 3"
Else
Color 128,128,128
Rect 2,y,156,20,1
Color 55,55,55
Rect 2,y,156,20,0
Color 0,0,0
Text 4,y,"layer 3"
End If
End If
y = y + 20
Next
Flip
WaitTimer(timer)
Until KeyDown(1)