TileD tilemap, rendering isometric tiles

Monkey Forums/Monkey Programming/TileD tilemap, rendering isometric tiles

V. Lehtinen(Posted 2014) [#1]
Hiya!

I have a little problem here... And I can't figure out what's causing it.

I'm coding a game engine (just because I like technical coding) that supports TileD tilemap format. Rendering orthogonal tilemaps works fine, getting the correct tiles for each GID, but with this isometric test, I get somewhat confused and can't really explain what happens... So I'll help you out with images and code:

My tilemap in the editor and running on my engine:


Screenshot showing how the tiles are arranged in the tileset:


The tilemap renders as it does in TileD, but I can't figure out why the tiles are so weirdly off...

Isometric rendering method and RenderTile():
    Method RenderIsometric:Void()
        'note: Needs a screen-clipper
    
        Local x:Int, y:Int, gid:Int
        Local _x:Float, _y:Float, halfTileW:Float = tileWidth * 0.5, halfTileH:Float = tileHeight * 0.5
        For y = 0 To parent.map.height - 1
            For x = 0 To parent.map.width - 1
                _x = (y * halfTileW) - (x * halfTileW)
                _y = (x * halfTileH) + (y * halfTileH)
                
                gid = data.GetTileID(x, y)
                RenderTile(gid, _x, _y)
            Next
        Next
    End

....

    Method RenderTile:Void(gid:Int, x:Int, y:Int)
        Local tileset:= parent.map.GetTilesetForGID(gid)
        
        If tileset = Null Then Return
        If tileset.image = Null Then Error("RENDER: Image for tileset '" + tileset.name + "' has failed to load!")
        
        gid -= tileset.firstGID
        Local idX:Int = (gid mod tileset.width) * tileset.tileWidth
        Local idY:Int = (gid / tileset.width) * tileset.tileHeight
        
        DrawImageRect(tileset.image, x, y, idX, idY, tileset.tileWidth, tileset.tileHeight)
    End


Method to get corresponding tileset for GID:
    Method GetTilesetForGID:TiledTileset(gid:Int)
        Local set:TiledTileset
        For set = EachIn tilesets.Values()
            If gid >= set.firstGID And gid < set.lastGID
                Return set
            EndIf
        Next
        
        Return Null
    End


Method for getting tile ID:
Method GetTileID:Int(x:Int, y:Int)
        If width = 0 Then Return - 1
        Return tiles.Get(y * width + x)
    End



If you spot _anything_ worth mentioning, I'd appreciate it very much.
Thanks in advance.

~misthema


therevills(Posted 2014) [#2]
Have you tried loading your map using the Diddy TileD renderer?

Looking at your screenshots, it looks like the wrong tile is being drawn.


V. Lehtinen(Posted 2014) [#3]
No, haven't tried that - yet. But with orthogonal tilemaps, it was able to draw the correct tiles for each GID in tilemap. But with this isometric test, it does not.. That's why I posted my problem here, because it doesn't make any sense.. :D I'll report back once I've tried it with Diddy.

EDIT: Ok, it looks like there's something wrong with my code somewhere..
Since Diddy did it, just fine:



V. Lehtinen(Posted 2014) [#4]
Awesome, I got it working correctly. Should have looked the render coordinates straight...

Old coordinates:
_x = (y * halfTileW) - (x * halfTileW)
_y = (x * halfTileH) + (y * halfTileH)


Correct coordinates:
_x = (-y * halfTileW) + (x * halfTileW)
_y = (x * halfTileH) + (y * halfTileH)




"Stupid mistakes are hardest to find..."