moveCharacter() Function Reference

moveCharacter(string name, integer x, integer y, string sequence, integer speed[, function callback])

Moves a character to a specific tile using A* path-finding algorithms to traverse the map. Sequence should refer to an animation set, and speed is the time taken, in milliseconds, to move between each tile.

In earlier versions the speed parameter was used to determine how many frames it should take to iterate between two adjacent tiles and thus a speed of 60 equated to 1 second at 60fps or 2 seconds at 30fps, but this was confusing and caused problems on devices that can't keep up with the desired framerate so this has been rewritten. Qiso now expects the speed parameter to be provided in milliseconds so a speed of 60 would cause movement between adjacent tiles to take only 0.06 seconds regardless of FPS, and a speed of 1000 will move at 1 tile per second regardless of FPS. Remember to update your code accordingly if you have projects using the old mechanic.

Optionally you can also pass a callback function to run every time the character passes to a new tile on the route. Useful for checking if the character has bumped into an NPC for example.


	local qiso = require "plugin.qisoengine"
	qiso.setAssetsFolder("assets")
	qiso.loadTiledMap("sample-tilemap")

	-- Load a spritemap for use as a character. Sequences must be given compass names, like this...
	-- Dummy character asset can be downloaded from the Qiso website.
	local playerMap = graphics.newImageSheet(qiso.getAssetsFolder() .. "/dummy.png", { width = 256, height = 512, numFrames = 64, border = 0 })
	local playerSprites = {
		{ name = 'standing-north', frames = { 25 } },
		{ name = 'standing-north-east', frames = { 17 } },
		{ name = 'standing-east', frames = { 9 } },
		{ name = 'standing-south-east', frames = { 1 } },
		{ name = 'standing-south', frames = { 57 } },
		{ name = 'standing-south-west', frames = { 49 } },
		{ name = 'standing-west', frames = { 41 } },
		{ name = 'standing-north-west', frames = { 33 } },

		{ name = 'walking-north', frames = { 25, 26, 27, 28, 29, 30, 31, 32 }, time = 750, loopCount = 0, loopDirection = 'forward' },
		{ name = 'walking-north-east', frames = { 17, 18, 19, 20, 21, 22, 23, 24 }, time = 750, loopCount = 0, loopDirection = 'forward' },
		{ name = 'walking-east', frames = { 9, 10, 11, 12, 13, 14, 15, 16 }, time = 750, loopCount = 0, loopDirection = 'forward' },
		{ name = 'walking-south-east', frames = { 1, 2, 3, 4, 5, 6, 7, 8 }, time = 750, loopCount = 0, loopDirection = 'forward' },
		{ name = 'walking-south', frames = { 57, 58, 59, 60, 61, 62, 63, 64 }, time = 750, loopCount = 0, loopDirection = 'forward' },
		{ name = 'walking-south-west', frames = { 49, 50, 51, 52, 53, 54, 55, 56 }, time = 750, loopCount = 0, loopDirection = 'forward' },
		{ name = 'walking-west', frames = { 41, 42, 43, 44, 45, 46, 47, 48 }, time = 750, loopCount = 0, loopDirection = 'forward' },
		{ name = 'walking-north-west', frames = { 33, 34, 35, 36, 37, 38, 39, 40 }, time = 750, loopCount = 0, loopDirection = 'forward' }
	}

	-- Add a character at tile 6x8 using the dummy spritemap, and then focus the camera on that tile.
	qiso.addCharacter("Player", playerMap, playerSprites, "standing", 6, 8)
	qiso.goTo(6, 8)

	-- Enable the main Qiso loop to render/update our world
	qiso.activate()

	-- Walk the player to the tapped tile
	function tapTile(event)
		-- Get the tile located where the screen was tapped. If there is no tile here, getTile returns nil.
		local tile = qiso.getTile(event.x, event.y)

		if(tile ~= nil) then
			-- path-find to the tapped location, using the walking sequences defined above.
			qiso.moveCharacter("Player", tile.x, tile.y, "walking", 1000)
		end
	end

	-- Do something when the screen is tapped
	Runtime:addEventListener('tap', tapTile)