Advertisement
bitetti

Tiled map reader with CooffeScript

Aug 18th, 2013
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 6.99 KB | None | 0 0
  1. if console == undefined
  2.     console = {
  3.         log: (msg) ->
  4.             msg = msg
  5.     }
  6.  
  7.  
  8. class LoaderInfo
  9.     @intance = new LoaderInfo()
  10.     @res = 0
  11.     @resLoaded = 0
  12.     @callBack = null
  13.  
  14.     constructor: () ->
  15.  
  16.     @loaded: () ->
  17.         LoaderInfo.resLoaded += 1
  18.         if LoaderInfo.res > 0
  19.             if LoaderInfo.resLoaded>=LoaderInfo.res
  20.                 LoaderInfo.callBack() if LoaderInfo.callBack
  21.  
  22.     @incLoads: () ->
  23.         LoaderInfo.res += 1
  24.  
  25.  
  26. class BaseDOMManager
  27.  
  28.     injectCSS: (target, css) ->
  29.         console.log css
  30.         for i of css
  31.             do (i) =>
  32.                 target.style[i] = css[i]
  33.  
  34.     addEvent: (target, name,func) ->
  35.         if target.attachEvent
  36.             return target.attachEvent 'on'+name, func
  37.         else
  38.             return target.addEventListener name, func
  39.  
  40.     ajaxRequest: (url,callBack,type) ->
  41.         if type==undefined
  42.             #type = 'json'
  43.             type = 'text'
  44.         request = null
  45.         nativeEval = window['eval']
  46.         if window.ActiveXObject
  47.             try
  48.                 request = new ActiveXObject "Msxml2.XMLHTTP"
  49.             catch err
  50.                 # ...
  51.             if request == null
  52.                 try
  53.                     request = new ActiveXObject "Microsoft.XMLHTTPP"
  54.                 catch e
  55.                     # ...
  56.         else
  57.             try
  58.                 request = new XMLHttpRequest()
  59.             catch err
  60.                 # ...
  61.  
  62.         if request
  63.             request.onreadystatechange = () =>
  64.                 if request.readyState==4
  65.                     if request.status==200
  66.                         if type=='json'
  67.                             callBack nativeEval "(" + request.responseText + ")"
  68.                         else
  69.                             callBack request #.responseText
  70.             request.open "GET", url
  71.             request.send null
  72.  
  73.         return request
  74.  
  75.     parseDOM: (xmlString) ->
  76.         if window.DOMParser
  77.             parser=new DOMParser()
  78.             xmlDoc=parser.parseFromString xmlString,"text/xml"
  79.         else
  80.             xmlDoc=new ActiveXObject "Microsoft.XMLDOM"
  81.             xmlDoc.async = false
  82.             xmlDoc.loadXML xmlString
  83.         xmlDoc
  84.  
  85.     trim: (string) ->
  86.         return string.replace /^\s+|\s+$/g, ''
  87.  
  88.  
  89.  
  90. class Entity
  91.     constructor: (@name,@x,@y,@type) ->
  92.         if @type==undefined
  93.             @type="circle"
  94.         if @rad==undefined
  95.             @rad=16
  96.         @ele = document.createElement 'area'
  97.         @position @x,@y
  98.         @ele.href="#"
  99.         @ele.title = @ele.alt = @name
  100.  
  101.     position: (x,y) =>
  102.         @x=x
  103.         @y=y
  104.         @ele.coords = @x+","+@y+","+@rad
  105.  
  106. class Tileset
  107.     constructor: (src, @name, @firstgid, @tW, @tH, cb) ->
  108.         @gid = @firstgid
  109.         @image = new Image()
  110.         @image.src = src
  111.         @image.onload = @loaded
  112.         @tiles = []
  113.         LoaderInfo.incLoads()
  114.         if cb==undefined
  115.             @callBack = (dt)->
  116.                 dt = dt
  117.         else
  118.             @callBack = cb
  119.  
  120.     loaded: (e) =>
  121.         y=0
  122.         while y<@image.height
  123.             x=0
  124.             while x<@image.width
  125.                 @tiles.push
  126.                     x:x
  127.                     y:y
  128.                 x += @tW
  129.             y += @tH
  130.         LoaderInfo.loaded()
  131.         @callBack(e)
  132.  
  133.     render: (id, cx, x,y) =>
  134.         if id==0
  135.             return
  136.         id = id - @firstgid
  137.         #cx.fillStyle = "#efefef"
  138.         #cx.fillRect x,y, @tW,@tH
  139.         t = @tiles[id]
  140.         cx.drawImage @image, t.x,t.y, @tW, @tH, x,y, @tW,@tH
  141.  
  142.  
  143.  
  144. class Map extends BaseDOMManager
  145.  
  146.     constructor: (src) ->
  147.         @tilesets = []
  148.         @layers = []
  149.         @ajaxRequest src, @dataDone, 'xml'
  150.         @resources = 0
  151.         @canvas = document.createElement 'canvas'
  152.         @injectCSS @canvas, {
  153.                 position:'absolute'
  154.             }
  155.         LoaderInfo.incLoads()
  156.  
  157.     dataDone: (request) =>
  158.         doc = @parseDOM request.responseText
  159.         mapDOM = doc.getElementsByTagName('map')[0]
  160.         @canvas.width = parseInt(mapDOM.getAttribute('width')) * parseInt(mapDOM.getAttribute('tilewidth'))
  161.         @canvas.height = parseInt(mapDOM.getAttribute('height')) * parseInt(mapDOM.getAttribute('tileheight'))
  162.  
  163.         for tileset in doc.getElementsByTagName 'tileset'
  164.             do (tileset) =>
  165.                 image = tileset.getElementsByTagName('image')[0].getAttribute 'source'
  166.                 @tilesets.push new Tileset(image, tileset.getAttribute('name'),
  167.                         new Number(tileset.getAttribute('firstgid')),
  168.                         new Number(tileset.getAttribute('tilewidth')),
  169.                         new Number(tileset.getAttribute('tileheight')), @resourceDone )
  170.                 @resources += 1
  171.  
  172.         for layer in doc.getElementsByTagName 'layer'
  173.             do (layer) =>
  174.                 #data = layer.getElementsByTagName('data')[0]
  175.                 #bData = window.atob @trim data.childNodes[0].nodeValue
  176.                 lay = []
  177.                 #for data in @trim(layer.getElementsByTagName('data')[0].childNodes[0].nodeValue).split(',')
  178.                 for data in layer.getElementsByTagName('tile')
  179.                     do (data) =>
  180.                         lay.push parseInt data.getAttribute 'gid'
  181.                 @layers.push
  182.                     name:layer.getAttribute 'name'
  183.                     width:layer.getAttribute 'width'
  184.                     height:layer.getAttribute 'height'
  185.                     data:lay
  186.  
  187.         LoaderInfo.loaded()
  188.  
  189.     resourceDone: (e) =>
  190.         @resources -= 1
  191.         if @resources<=0
  192.             #console.log 'done'
  193.             @renderizeMap()
  194.  
  195.     renderizeMap: () =>
  196.         @render @canvas.getContext('2d')
  197.  
  198.     render: (cx,x,y,width,height) =>
  199.         for i in [0..@tilesets.length-1]
  200.             do (i) =>
  201.                 tileset = @tilesets[i]
  202.                 layer = @layers[i]
  203.                 t = 0
  204.                 for iy in [0..layer.height-1]
  205.                     do (iy) =>
  206.                         for ix in [0..layer.width-1]
  207.                             do (ix) =>
  208.                                 px = ix*tileset.tW
  209.                                 py = iy*tileset.tH
  210.                                 #console.log layer.data[t]
  211.                                 tileset.render layer.data[t], cx, px,py
  212.                                 t += 1
  213.  
  214.  
  215.  
  216.  
  217. class Stage extends BaseDOMManager
  218.     @instance = null
  219.  
  220.     constructor: (@divName) ->
  221.         Stage.instance = this
  222.         @addEvent window, 'load', (e) ->
  223.             window.stage = Stage.instance
  224.             Stage.instance.start()
  225.         @tX = @tY = @x = @y = 0
  226.         @over = new Image()
  227.         @over.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAs"+
  228.         "TAAALEwEAmpwYAAAAB3RJTUUH3QgPExkF/22+eAAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAALElEQVRYw+3OMQEAAAgD"+
  229.         "oGn/zjOGDyRg2ubT5pmAgICAgICAgICAgICAgMABQLQDPYU9GZMAAAAASUVORK5CYII="
  230.  
  231.     start: () =>
  232.         LoaderInfo.callBack = @iniStage
  233.  
  234.         @div = document.getElementById @divName
  235.         @plane = document.createElement 'div'
  236.         @map = document.createElement 'map'
  237.         @map.name = "cliclableNodes"
  238.  
  239.  
  240.         @injectCSS @div, {
  241.                 overflow:'hidden'
  242.             }
  243.         @injectCSS @plane, {
  244.                 position:'absolute'
  245.             }
  246.         @injectCSS @over, {
  247.                 position:'absolute'
  248.                 width:'inherit'
  249.                 height:'inherit'
  250.             }
  251.         #@over.usemap = "#" + "cliclableNodes"
  252.         @over.setAttribute 'usemap', '#cliclableNodes'
  253.  
  254.         # request on Teste60
  255.         @maps = [
  256.             new Map('./data/base.tmx')
  257.         ]
  258.         #@maps[0].renderizeMap()
  259.  
  260.         @plane.appendChild @maps[0].canvas
  261.         @div.appendChild @plane
  262.         @div.appendChild @over
  263.         @plane.appendChild @map
  264.  
  265.         @ele = new Entity "Zé",0,0
  266.         @map.appendChild @ele.ele
  267.  
  268.     iniStage: () =>
  269.         console.log LoaderInfo.res
  270.         @addEvent window.document, 'keydown', @keyDown
  271.         @addEvent window.document, 'keyup', @keyUp
  272.         @moveView()
  273.  
  274.     keyDown: (e) =>
  275.         switch e.keyCode
  276.             when 37
  277.                 @x = @tX
  278.                 @tX -= 4
  279.             when 38
  280.                 @y = @tY
  281.                 @tY -= 4
  282.             when 39
  283.                 @x = @tX
  284.                 @tX += 4
  285.             when 40
  286.                 @y = @tY
  287.                 @tY += 4
  288.         #console.log e.keyCode
  289.         e.preventDefault()
  290.         e.stopPropagation()
  291.         false
  292.  
  293.     keyUp: (e) =>
  294.         e.preventDefault()
  295.         e.stopPropagation()
  296.         false
  297.  
  298.     moveView: () =>
  299.         @x += (@tX - @x)*0.2
  300.         @y += (@tY - @y)*0.2
  301.         if @x!=@tX or @y!=@tY
  302.             @plane.style.left = String(parseInt -@x) + "px"
  303.             @plane.style.top = String(parseInt -@y) + "px"
  304.  
  305.         window.setTimeout @moveView, 50
  306.  
  307.  
  308.  
  309.        
  310.  
  311.  
  312.  
  313. stage = new Stage('tilespace')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement