Example with CoronaSDK using PhysicsEditor & TexturePacker

Example with CoronaSDK using PhysicsEditor & TexturePacker

Small example for CoronaSDK using PhysicsEditor to create the shapes and TexturePacker for the sprite sheets.

Full source code to this example project is available on GitHub.

As requested on the Corona forum I created a small example using PhysicsEditor to create the shapes and TexturePacker for the sprite sheets.

I use the excellent SpriteGrabber class from the corona forum to split the sheet.

Overview over the important files

  • shapedefs.pes - PhysicsEditor file containing all the shapes

  • shapedefs.lua - Shape definitions file created by PhysicsEditor

  • spritesheet.tps - TexturePacker file to create the sprite sheets

  • spritesheet.lua - Sprite definition file ("old" format)

  • spritesheet.png - Png image containing the sprite data

  • SpriteGrabber.lua - Magenda's sprite grabber from corona forum

  • main.lua - The code driving the example

Initialisation of the physics module

local physics = require("physics")
physics.start()

Initializing SpriteGrabber with the sprite sheet

This code loads SpriteGrabber and then loads our sprite sheet.

local grabber = require("SpriteGrabber")
spriteSheet = grabber.grabSheet("spritesheet")

Setting up the background shape

To add a sprite you need to extract it from the sprite sheet, creating a sprite. Sprites can be addressed by their name:

local bkg = spriteSheet:grabSprite( "bkg_cor.png", true)

Creating a floor shape

With this code block you initialize a floor sprite, setting it's position. The bar is taking a rectangulars standard shape.

The second block initializes a second bar shape which sits above the other. With this the impression can be created that the sprite sinks in the floor a bit.

local bar = spriteSheet:grabSprite("bar.png", true)
bar.x = 160; bar.y = 430
physics.addBody( bar, "static", { friction=0.5, bounce=0.3 } )

-- create floor shape only for the looks
local bar2 = spriteSheet:grabSprite("bar2.png", true) 
bar2.x = 160; bar2.y = 440

Initialise the physics data

To load the physics data created with PhysicsEditor simply require the file and call the function physicsData :

-- load the physics data, scale factor is set to 1.0
local physicsData = (require "shapedefs").physicsData(1.0)

Setting debug drawing mode

This code enables hybrid drawing mode - it shows the shape itself but also overlays the shape's collition shapes.

physics.setDrawMode( "hybrid" )

Create some bodies

This function chooses a random object by it's name, creates a sprite using spriteSheet:grabSprite and then attaches a physics body which is retrieved from physicsData by calling addBody .

Finally the object is set to a random position allowing it to drop onto the scene:

function newItem()	
	names = {"orange", "drink", "hamburger", "hotdog", "icecream", "icecream2", "icecream3"};

	name = names[math.random(6)];

	-- set the graphics 
	obj = spriteSheet:grabSprite(name..".png", true);

	-- set the shape
	physics.addBody( obj, physicsData:get(name))	
	
	-- random start location
	obj.x = 60 + math.random( 160 )
	obj.y = -100
end

Finally this function is called from a timer, spawning more and more items over time:

local dropCrates = timer.performWithDelay( 500, newItem, 100 )