I'm posting the source in case anyone wants it, but be warned that it makes some assumptions:
- that tilewidth and tileheight are the same across the map, and all the tilesheets
- that we've saved file under the csv method
- this snippet only loads the variables from the file, and doesn't do anything with them - loading the info into tiles is another several hundred lines of code I'm not including here
Here it is: it's ugly, but its working.
function getTileArg(stringVal, argVal) --gets argument value from the string in the form argument="value" mySearchBegin, mySearchEnd = string.find(stringVal, ' ' .. argVal .. '="') if mySearchBegin then --find closing quote (") openQuote = mySearchEnd closeQuote, closeQuoteEnd = string.find(stringVal, '"', openQuote + 1) return string.sub(stringVal, openQuote + 1, closeQuote - 1) else return -1 end end function explodeNumeric(div,str) if (div=='') then return false end local pos,arr = 0,{} -- for each divider found for st,sp in function() return string.find(str,div,pos,true) end do table.insert(arr,tonumber(string.sub(str,pos,st-1))) -- Attach chars left of current divider pos = sp + 1 -- Jump past current divider end table.insert(arr,string.sub(str,pos)) -- Attach chars right of last divider return arr end function setupLevel(levelfile) lines = {} for line in love.filesystem.lines(levelfile .. ".tmx") do table.insert(lines, line) end --find <map> line, get arguments mapWidth = -1 mapHeight = -1 tileSize = -1 collideMapFirstLine = -1 collideMapWidth = -1 collideMapHeight = -1 spritesMapFirstLine = -1 spritesMapWidth = -1 spritesMapHeight = -1 collideFirstTile = -1 collideFile = -1 spritesFirstTile = -1 spriteFile = -1 for i,v in ipairs(lines) do --main map line if string.find(v, "<map ") then --get mapWidth, mapHeight, tileSize mapWidth = tonumber(getTileArg(v, "width")) mapHeight = tonumber(getTileArg(v, "height")) tileWidth = tonumber(getTileArg(v, "tilewidth")) tileHeight = tonumber(getTileArg(v, "tileheight")) if tileWidth == tileHeight then tileSize = tileWidth end end --tilesets if string.find(v, "<tileset ") then --get which map this is whichMap = getTileArg(v, "name") if whichMap == "collide" then collideFirstTile = tonumber(getTileArg(v, "firstgid")) collideTileWidth = tonumber(getTileArg(v, "tilewidth")) collideTileHeight = tonumber(getTileArg(v, "tileheight")) collideFile = getTileArg(lines[i + 1], "source") elseif whichMap == "sprites" then spritesFirstTile = tonumber(getTileArg(v, "firstgid")) spritesTileWidth = tonumber(getTileArg(v, "tilewidth")) spritesTileHeight = tonumber(getTileArg(v, "tileheight")) spriteFile = getTileArg(lines[i + 1], "source") end end --layers if string.find(v, "<layer ") then --get which layer this is whichLayer = getTileArg(v, "name") if whichLayer == "Collision" then collideMapWidth = tonumber(getTileArg(v, "width")) collideMapHeight = tonumber(getTileArg(v, "height")) collideMapFirstLine = i + 2 elseif whichLayer == "Sprites" then spritesMapWidth = tonumber(getTileArg(v, "width")) spritesMapHeight = tonumber(getTileArg(v, "height")) spritesMapFirstLine = i + 2 end end end if mapWidth == -1 or mapHeight == -1 or tileSize == -1 then error("Error Loading .tmx File (1)") end if collideFirstTile == -1 or collideFile == -1 or collideTileHeight ~= collideTileWidth or collideTileHeight ~= tileSize then error("Error Loading .tmx File (1)") end if spritesFirstTile == -1 or spriteFile == -1 or spritesTileHeight ~= spritesTileWidth or spritesTileHeight ~= tileSize then error("Error Loading .tmx File (1)") end if collideMapWidth == -1 or spritesMapWidth == -1 or collideMapWidth ~= spritesMapWidth or collideMapHeight == -1 or spritesMapHeight == -1 or collideMapHeight ~= spritesMapHeight or collideMapFirstLine == -1 or spritesMapFirstLine == -1 or collideMapWidth ~= mapWidth or collideMapHeight ~= mapHeight then error("Error Loading .tmx File (1)") end endNext up is some glitch fixes - my character won't jump while running downhill - I need to tweak the touchingGround check somehow. Yay for bug fixes!
Thanks to the tilemap loader, I can now create nice looking levels ... er... nicer looking levels than before, at any rate. |
No comments:
Post a Comment