Drawing Order in 2D Tile Editor

BlitzPlus Forums/BlitzPlus Programming/Drawing Order in 2D Tile Editor

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

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)