Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extends Control
- var MultiLoader = preload('multi_loader.gd')
- var layers = Array()
- var tilesets = Array()
- var tiles = Array()
- class Map extends Reference:
- var orientation = 'orthogonal'
- var width = 0
- var height = 0
- var tile_width = 0
- var tile_height = 0
- var tilesets = Array()
- var layers = Array()
- func _is_all_done():
- var d = 0
- for t in tilesets:
- if t._done:
- d += 1
- return d == tilesets.size()
- func _init():
- #self.re_init()
- pass
- func re_init():
- self.layers = []
- self.tilesets = []
- var par = 1
- class Tileset:
- var firstgid = 0
- var name = ''
- var tile_width = 0
- var tile_height = 0
- var texture = null
- var image_width = 0
- var image_height = 0
- var _done = false
- func load_image(path, width,height):
- image_width = width
- image_height = height
- if path.find('http')!=0:
- # load direct resource
- texture = ImageTexture.new()
- texture.set_flags(0)
- texture.load(path)
- _done = true
- func _init():
- pass
- class Layer:
- var name = ''
- var width = 0
- var height = 0
- var tiles = Array()
- var opacity = 1.0
- var visible = true
- func _init():
- pass
- func _parse_tilemap(map,raw):
- var xml = XMLParser.new()
- if xml.open_buffer(raw) != OK:
- return
- var _map = false
- var _tileset = false
- var _image = false
- var _layer = false
- var _data = false
- var _objectgroup = false
- var _object = false
- var _properties = false
- var objectgroup = ''
- var object
- var tileset
- var layer
- var properties
- while xml.read()==OK:
- #if xml.get_node_type()==XMLParser.NODE_TEXT or xml.get_node_type()==XMLParser.NODE_CDATA:
- # print(str(xml.get_node_data()))
- # continue
- var name = xml.get_node_name()
- if name=='map':
- if _map:
- _map = false
- else:
- map.orientation = xml.get_named_attribute_value('orientation')
- map.width = int(xml.get_named_attribute_value('width'))
- map.height = int(xml.get_named_attribute_value('height'))
- map.tile_width = int(xml.get_named_attribute_value('tilewidth'))
- map.tile_height = int(xml.get_named_attribute_value('tileheight'))
- _map = true
- if name=='tileset':
- if _tileset:
- _tileset = false
- else:
- _tileset = true
- tileset = Tileset.new()
- tileset.name = xml.get_named_attribute_value('name')
- tileset.firstgid = int(xml.get_named_attribute_value('firstgid'))
- tileset.tile_width = int(xml.get_named_attribute_value('tilewidth'))
- tileset.tile_height = int(xml.get_named_attribute_value('tileheight'))
- tilesets.push_back(tileset)
- if name=='image':
- if _tileset:
- var w = int(xml.get_named_attribute_value('width'))
- var h = int(xml.get_named_attribute_value('height'))
- var p = xml.get_named_attribute_value('source')
- tileset.load_image(p, w,h)
- if name=='layer':
- if _layer:
- layer.tiles = tiles
- tiles = null
- _layer = false
- else:
- _layer = true
- layers.push_back( Layer.new() )
- layer = layers[layers.size()-1]
- layer.name = xml.get_named_attribute_value('name')
- layer.width = int(xml.get_named_attribute_value('width'))
- layer.height = int(xml.get_named_attribute_value('height'))
- if xml.has_attribute('opacity'):
- layer.opacity = float(xml.get_named_attribute_value('opacity'))
- if xml.has_attribute('visible'):
- if xml.get_named_attribute_value('visible')==0:
- layer.visible = false
- if name=='data':
- if _data:
- _data = false
- else:
- if _layer:
- tiles = Array()
- _data = true
- if name=='tile':
- if _layer:
- tiles.push_back( int(xml.get_named_attribute_value('gid')) )
- if name=='objectgroup':
- if _objectgroup:
- _objectgroup = false
- else:
- _objectgroup = true
- objectgroup = xml.get_named_attribute_value('name')
- print('gp ', objectgroup )
- map.layers = layers
- map.tilesets = tilesets
- print('done? ', map._is_all_done() )
- print(map.layers[0].tiles)
- _update_view()
- var map = Map.new()
- var vertices = Array()
- var colors = Array()
- var uvs = Array()
- var _dirty = false
- var offset = Vector2()
- func _update_view():
- print( 'up ', map.layers[0].tiles.size() )
- print( 'up ', map.layers.size() )
- print( 'up ', layers[0].tiles.size() )
- print( 'up ', layers.size() )
- _dirty = true
- func _draw():
- _dirty = false
- if map == null:
- return
- for layer in map.layers:
- if not layer.visible:
- continue
- var y = floor(offset.y/map.tile_height)
- while y<map.height:
- var x = floor(offset.x/map.tile_width)
- while x<map.width:
- var i = y*map.width + x
- x += 1
- y += 1
- draw_primitive( vertices, colors, uvs, map.tilesets[0].texture )
- func _load_has_done(loader):
- #print(loader.data.get_string_from_ascii())
- print('parse')
- #map = Map.new()
- #map.re_init()
- _parse_tilemap(map,loader.data)
- #print('moved ',loader.response_code == HTTPClient.RESPONSE_MOVED_PERMANENTLY)
- #print('moved ',loader.response_code)
- #update()
- #_update_view()
- #update()
- func _process(delta):
- if _dirty:
- update()
- var loader
- func _ready():
- vertices.push_back( Vector2(0,0) )
- vertices.push_back( Vector2(64,0) )
- vertices.push_back( Vector2(64,64) )
- vertices.push_back( Vector2(0,64) )
- colors.push_back( Color(1,1,1,1) )
- colors.push_back( Color(1,1,1,1) )
- colors.push_back( Color(1,1,1,1) )
- colors.push_back( Color(1,1,1,1) )
- uvs.push_back( Vector2(0,0) )
- uvs.push_back( Vector2(1,0) )
- uvs.push_back( Vector2(1,1) )
- uvs.push_back( Vector2(0,1) )
- #map = Map.new()
- loader = MultiLoader.new()
- loader.connect( 'load_complete', self, '_load_has_done' )
- #loader.load_data('https://copy.com/woAZDQdmDYdgq63f/NotM/Portal.tmx?download=1')
- #loader.load_data('http://localhost/Portal.tmx')
- #loader.load_data('file:///var/www/html/Portal.tmx')
- #loader.load_data('user://Desktop/maps/Portal.tmx')
- loader.load_data('res://Portal.tmx')
- set_process(true)
Advertisement
Add Comment
Please, Sign In to add comment