bitetti

Tiled tmx format reader for Godot

Jun 9th, 2015
343
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.84 KB | None | 0 0
  1.  
  2. extends Control
  3.  
  4. var MultiLoader = preload('multi_loader.gd')
  5.  
  6. var layers = Array()
  7. var tilesets = Array()
  8. var tiles = Array()
  9.  
  10. class Map extends Reference:
  11.     var orientation = 'orthogonal'
  12.     var width = 0
  13.     var height = 0
  14.     var tile_width = 0
  15.     var tile_height = 0
  16.     var tilesets = Array()
  17.     var layers = Array()
  18.    
  19.     func _is_all_done():
  20.         var d = 0
  21.         for t in tilesets:
  22.             if t._done:
  23.                 d += 1
  24.         return d == tilesets.size()
  25.    
  26.     func _init():
  27.         #self.re_init()
  28.         pass
  29.    
  30.     func re_init():
  31.         self.layers = []
  32.         self.tilesets = []
  33.         var par = 1
  34.  
  35. class Tileset:
  36.     var firstgid = 0
  37.     var name = ''
  38.     var tile_width = 0
  39.     var tile_height = 0
  40.     var texture = null
  41.    
  42.     var image_width = 0
  43.     var image_height = 0
  44.    
  45.     var _done = false
  46.    
  47.     func load_image(path, width,height):
  48.         image_width = width
  49.         image_height = height
  50.         if path.find('http')!=0:
  51.             # load direct resource
  52.             texture = ImageTexture.new()
  53.             texture.set_flags(0)
  54.             texture.load(path)
  55.             _done = true
  56.    
  57.     func _init():
  58.         pass
  59.  
  60. class Layer:
  61.     var name = ''
  62.     var width = 0
  63.     var height = 0
  64.     var tiles = Array()
  65.     var opacity = 1.0
  66.     var visible = true
  67.    
  68.     func _init():
  69.         pass
  70.  
  71. func _parse_tilemap(map,raw):
  72.     var xml = XMLParser.new()
  73.     if xml.open_buffer(raw) != OK:
  74.         return
  75.    
  76.     var _map = false
  77.     var _tileset = false
  78.     var _image = false
  79.     var _layer = false
  80.     var _data = false
  81.     var _objectgroup = false
  82.     var _object = false
  83.     var _properties = false
  84.     var objectgroup = ''
  85.     var object
  86.     var tileset
  87.     var layer
  88.     var properties
  89.    
  90.     while xml.read()==OK:
  91.         #if xml.get_node_type()==XMLParser.NODE_TEXT or xml.get_node_type()==XMLParser.NODE_CDATA:
  92.         #   print(str(xml.get_node_data()))
  93.         #   continue
  94.         var name = xml.get_node_name()
  95.         if name=='map':
  96.             if _map:
  97.                 _map = false
  98.             else:
  99.                 map.orientation = xml.get_named_attribute_value('orientation')
  100.                 map.width = int(xml.get_named_attribute_value('width'))
  101.                 map.height = int(xml.get_named_attribute_value('height'))
  102.                 map.tile_width = int(xml.get_named_attribute_value('tilewidth'))
  103.                 map.tile_height = int(xml.get_named_attribute_value('tileheight'))
  104.                 _map = true
  105.         if name=='tileset':
  106.             if _tileset:
  107.                 _tileset = false
  108.             else:
  109.                 _tileset = true
  110.                 tileset = Tileset.new()
  111.                 tileset.name = xml.get_named_attribute_value('name')
  112.                 tileset.firstgid = int(xml.get_named_attribute_value('firstgid'))
  113.                 tileset.tile_width = int(xml.get_named_attribute_value('tilewidth'))
  114.                 tileset.tile_height = int(xml.get_named_attribute_value('tileheight'))
  115.                 tilesets.push_back(tileset)
  116.         if name=='image':
  117.             if _tileset:
  118.                 var w = int(xml.get_named_attribute_value('width'))
  119.                 var h = int(xml.get_named_attribute_value('height'))
  120.                 var p = xml.get_named_attribute_value('source')
  121.                 tileset.load_image(p, w,h)
  122.         if name=='layer':
  123.             if _layer:
  124.                 layer.tiles = tiles
  125.                 tiles = null
  126.                 _layer = false
  127.             else:
  128.                 _layer = true
  129.                 layers.push_back( Layer.new() )
  130.                 layer = layers[layers.size()-1]
  131.                 layer.name = xml.get_named_attribute_value('name')
  132.                 layer.width = int(xml.get_named_attribute_value('width'))
  133.                 layer.height = int(xml.get_named_attribute_value('height'))
  134.                 if xml.has_attribute('opacity'):
  135.                     layer.opacity = float(xml.get_named_attribute_value('opacity'))
  136.                 if xml.has_attribute('visible'):
  137.                     if xml.get_named_attribute_value('visible')==0:
  138.                         layer.visible = false
  139.         if name=='data':
  140.             if _data:
  141.                 _data = false
  142.             else:
  143.                 if _layer:
  144.                     tiles = Array()
  145.                     _data = true
  146.         if name=='tile':
  147.             if _layer:
  148.                 tiles.push_back( int(xml.get_named_attribute_value('gid')) )
  149.         if name=='objectgroup':
  150.             if _objectgroup:
  151.                 _objectgroup = false
  152.             else:
  153.                 _objectgroup = true
  154.                 objectgroup = xml.get_named_attribute_value('name')
  155.                 print('gp ', objectgroup )
  156.     map.layers = layers
  157.     map.tilesets = tilesets
  158.     print('done? ', map._is_all_done() )
  159.     print(map.layers[0].tiles)
  160.     _update_view()
  161.    
  162.  
  163. var map = Map.new()
  164. var vertices = Array()
  165. var colors = Array()
  166. var uvs = Array()
  167. var _dirty = false
  168. var offset = Vector2()
  169.  
  170. func _update_view():
  171.     print( 'up ', map.layers[0].tiles.size() )
  172.     print( 'up ', map.layers.size() )
  173.     print( 'up ', layers[0].tiles.size() )
  174.     print( 'up ', layers.size() )
  175.     _dirty = true
  176.  
  177. func _draw():
  178.     _dirty = false
  179.     if map == null:
  180.         return
  181.    
  182.     for layer in map.layers:
  183.         if not layer.visible:
  184.             continue
  185.         var y = floor(offset.y/map.tile_height)
  186.         while y<map.height:
  187.             var x = floor(offset.x/map.tile_width)
  188.             while x<map.width:
  189.                 var i = y*map.width + x
  190.                 x += 1
  191.             y += 1
  192.    
  193.     draw_primitive( vertices, colors, uvs, map.tilesets[0].texture )
  194.    
  195.  
  196. func _load_has_done(loader):
  197.    
  198.     #print(loader.data.get_string_from_ascii())
  199.     print('parse')
  200.     #map = Map.new()
  201.     #map.re_init()
  202.     _parse_tilemap(map,loader.data)
  203.     #print('moved ',loader.response_code == HTTPClient.RESPONSE_MOVED_PERMANENTLY)
  204.     #print('moved ',loader.response_code)
  205.     #update()
  206.     #_update_view()
  207.     #update()
  208.  
  209. func _process(delta):
  210.     if _dirty:
  211.         update()
  212.  
  213. var loader
  214.  
  215. func _ready():
  216.     vertices.push_back( Vector2(0,0) )
  217.     vertices.push_back( Vector2(64,0) )
  218.     vertices.push_back( Vector2(64,64) )
  219.     vertices.push_back( Vector2(0,64) )
  220.     colors.push_back( Color(1,1,1,1) )
  221.     colors.push_back( Color(1,1,1,1) )
  222.     colors.push_back( Color(1,1,1,1) )
  223.     colors.push_back( Color(1,1,1,1) )
  224.     uvs.push_back( Vector2(0,0) )
  225.     uvs.push_back( Vector2(1,0) )
  226.     uvs.push_back( Vector2(1,1) )
  227.     uvs.push_back( Vector2(0,1) )
  228.    
  229.     #map = Map.new()
  230.    
  231.     loader = MultiLoader.new()
  232.     loader.connect( 'load_complete', self, '_load_has_done' )
  233.     #loader.load_data('https://copy.com/woAZDQdmDYdgq63f/NotM/Portal.tmx?download=1')
  234.     #loader.load_data('http://localhost/Portal.tmx')
  235.     #loader.load_data('file:///var/www/html/Portal.tmx')
  236.     #loader.load_data('user://Desktop/maps/Portal.tmx')
  237.     loader.load_data('res://Portal.tmx')
  238.    
  239.     set_process(true)
Advertisement
Add Comment
Please, Sign In to add comment