-- relative motion -- turn on multitouch system.activate("multitouch") -- which environment are we running on? local isDevice = (system.getInfo("environment") == "device") -- calculates the average centre of a list of points local function calcAvgCentre( points ) local x, y = 0, 0 for i=1, #points do local pt = points[i] x = x + pt.x y = y + pt.y end return { x = x / #points, y = y / #points } end -- creates an object to be moved function newTrackDot(e) -- create a user interface object local circle = display.newCircle( e.x, e.y, 50 ) -- make it less imposing circle.alpha = .5 -- keep reference to the rectangle local rect = e.target -- standard multi-touch event listener function circle:touch(e) -- get the object which received the touch event local target = circle -- store the parent object in the event e.parent = rect -- handle each phase of the touch event life cycle... if (e.phase == "began") then -- tell corona that following touches come to this display object display.getCurrentStage():setFocus(target, e.id) -- remember that this object has the focus target.hasFocus = true -- indicate the event was handled return true elseif (target.hasFocus) then -- this object is handling touches if (e.phase == "moved") then -- move the display object with the touch (or whatever) target.x, target.y = e.x, e.y else -- "ended" and "cancelled" phases -- stop being responsible for touches display.getCurrentStage():setFocus(target, nil) -- remember this object no longer has the focus target.hasFocus = false end -- send the event parameter to the rect object rect:touch(e) -- indicate that we handled the touch and not to propagate it return true end -- if the target is not responsible for this touch event return false return false end -- listen for touches starting on the touch layer circle:addEventListener("touch") -- listen for a tap when running in the simulator function circle:tap(e) if (e.numTaps == 2) then -- set the parent e.parent = rect -- call touch to remove the tracking dot rect:touch(e) end return true end -- only attach tap listener in the simulator if (not isDevice) then circle:addEventListener("tap") end -- pass the began phase to the tracking dot circle:touch(e) -- return the object for use return circle end -- spawning tracking dots -- create object to listen for new touches local rect = display.newRect( 200, 200, 200, 100 ) rect:setFillColor(0,0,255) -- keep a list of the tracking dots rect.dots = {} -- advanced multi-touch event listener function rect:touch(e) -- get the object which received the touch event local target = e.target -- handle began phase of the touch event life cycle... if (e.phase == "began") then print( e.phase, e.x, e.y ) -- create a tracking dot local dot = newTrackDot(e) -- add the new dot to the list rect.dots[ #rect.dots+1 ] = dot -- pre-store the average centre position of all touch points rect.prevCentre = calcAvgCentre( rect.dots ) -- we handled the began phase return true elseif (e.parent == rect) then if (e.phase == "moved") then print( e.phase, e.x, e.y ) -- calculate the average centre position of all touch points local centre = calcAvgCentre( rect.dots ) -- update the position of rect rect.x = rect.x + (centre.x - rect.prevCentre.x) rect.y = rect.y + (centre.y - rect.prevCentre.y) -- store the centre of all touch points rect.prevCentre = centre else -- "ended" and "cancelled" phases print( e.phase, e.x, e.y ) -- remove the tracking dot from the list if (isDevice or e.numTaps == 2) then -- get index of dot to be removed local index = table.indexOf( rect.dots, e.target ) -- remove dot from list table.remove( rect.dots, index ) -- remove tracking dot from the screen e.target:removeSelf() -- store the new centre of all touch points rect.prevCentre = calcAvgCentre( rect.dots ) end end return true end -- if the target is not responsible for this touch event return false return false end -- listen for touches starting on the touch object rect:addEventListener("touch")