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
end
Next 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