Qiso isometric engine updates

Just wanted to post a bit of a heads up that I’ve finally pushed a couple of big changes live to the Qiso isometric engine. Existing users should have already received update emails but for everybody else:

Altitude support!

Altitude support is now finally live, allowing for infinitely heighted hills and dips. This was built a long time ago now and a couple of people had beta versions to play with, but I needed to fix some bugs before it could go live properly and only recently got chance to polish things off. For anybody still using those old beta links please now return to using the build.settings links provided by the plugins marketplace.

In a nutshell, there’s now a setTileAltitude() function for setting the height a tile should be rendered at, and character movement automatically climbs/descends to that height too. There’s also an offsetSpriteFromAltitude() function to move individual tile layers up/down relative to the tiles height without affecting where characters stand. You could for example have a water effect bob up and down while the character stands still, or have a hill tile render inline with other tiles but allowing the character to walk to a higher altitude.

The loadTiledMap() function also now supports an offset-from-altitude property to simplify usage, though there’s no Tiled based method for setting individual tile altitudes unfortunately.

Another new function, spriteTapEvent(), allows binding callback functions to individual sprite tap events so that any tile consisting of that sprite as one of its layers triggers the callback. You can then refer to self.tile.x and self.tile.y within the callback to receive the tile that the tapped sprite belongs to, meaning that tapping on a tile that’s rendered above/below the base tile position can still trigger an appropriate interaction. Previous example code used getTile() to convert screen locations to tile locations but with the new altitude stuff, getTile() might not return the same tile you’re literally looking at on-screen since there’s now vertical overlap.

The samples page will be updated sharpish with clear examples of these functions in use, and the documentation is already updated with some example code.

Character movement

The moveCharacter() function has been completely rebuilt so that movement is now timestamp based instead of framerate based. Previously the function’s speed parameter expected the number of frames you wanted to take to move between adjacent tiles, but now it expects the number of milliseconds to take. This approach means that even with a lot going on at once and a reduced framerate, characters should still move around at the correct speed. In turn this means you can zoom further out on a Qiso map without noticeable performance issues.

It’s also just way less confusing to define a speed in milliseconds than a speed that’s dependant on whether your game is built for 30 or 60 FPS =).


There’s been a few performance improvements made to various functions too. Most notably, the rendering loop now skips over the vast majority of code unless manipulation functions have been called, e.g. to replace tile data, move a character, or reposition the camera. So the whole thing is just less processor intensive when idle.

The cameraFollows() function was also rebuilt to be smoother and more performant.

And a tile culling bug was fixed, where on some devices under specific orientations and with specific screen ratios, sometimes tiles were culled prematurely as they scrolled off of the edge of the screen, leaving visible black spaces on the screen edge.

Qiso Editor

As Qiso has advanced, and now particularly with the altitude support, Tiled has become a bit too limited as a generic tile editor so I’m moving on to building an editor specifically for Qiso maps. This’ll be a really easy way to generate worlds, spray tiles around, adjust altitudes, and so on. More on that later.


Awesome. And nice to see you post something.

Yeah, I’m still around :slight_smile:. It’s been a busy year is all!

Too much chocolate probably :slight_smile:

Is too much a thing? :smirk: