How to use create draggable objects with multitouch. Also shows how to move an object to the front of the display hierarchy.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | system.activate( "multitouch" ) local arguments = { { x=50, y=110, w=50, h=50, r=10, red=255, green=0, blue=128 }, { x=10, y=150, w=75, h=50, r=10, red=0, green=128, blue=255 }, { x=90, y=190, w=100, h=50, r=10, red=255, green=255, blue=0 } } local eventInfoText1 = display.newText(" ", 100,300, native.systemFont, 12) eventInfoText1:setTextColor(100,255,255) local eventInfoText2 = display.newText(" ", 100,320, native.systemFont, 12) eventInfoText2:setTextColor(100,255,255) local function printTouch( event ) if event.target then local bounds = event.target.stageBounds print( "event(" .. event.phase .. ") ("..event.x..","..event.y..") bounds: "..bounds.xMin..","..bounds.yMin..","..bounds.xMax..","..bounds.yMax ) eventInfoText1.x = event.x eventInfoText1.y = bounds.yMin - 30 eventInfoText1.text = "event(" .. event.phase .. ") ("..event.x..","..event.y..")" eventInfoText2.x = event.x eventInfoText2.y = bounds.yMin - 10 eventInfoText2.text = "bounds: "..bounds.xMin..","..bounds.yMin..","..bounds.xMax..","..bounds.yMax end end local function onTouch( event ) local t = event.target -- Print info about the event. For actual production code, you should -- not call this function because it wastes CPU resources. printTouch(event) local phase = event.phase if "began" == phase then -- Make target the top-most object local parent = t.parent parent:insert( t ) display.getCurrentStage():setFocus( t, event.id ) -- Spurious events can be sent to the target, e.g. the user presses -- elsewhere on the screen and then moves the finger over the target. -- To prevent this, we add this flag. Only when it's true will "move" -- events be sent to the target. t.isFocus = true -- Store initial position t.x0 = event.x - t.x t.y0 = event.y - t.y elseif t.isFocus then if "moved" == phase then -- Make object move (we subtract t.x0,t.y0 so that moves are -- relative to initial grab point, rather than object "snapping"). t.x = event.x - t.x0 t.y = event.y - t.y0 elseif "ended" == phase or "cancelled" == phase then display.getCurrentStage():setFocus( t, nil ) t.isFocus = false end end -- Important to return true. This tells the system that the event -- should not be propagated to listeners of any objects underneath. return true end -- Iterate through arguments array and create rounded rects (vector objects) for each item for _,item in ipairs( arguments ) do local button = display.newRoundedRect( item.x, item.y, item.w, item.h, item.r ) button:setFillColor( item.red, item.green, item.blue ) button.strokeWidth = 6 button:setStrokeColor( 200,200,200,255 ) -- Make the button instance respond to touch events button:addEventListener( "touch", onTouch ) end -- listener used by Runtime object. This gets called if no other display object -- intercepts the event. local function printTouch2( event ) print( "event(" .. event.phase .. ") ("..event.x..","..event.y..")" ) eventInfoText1.x = event.x eventInfoText1.y = event.y eventInfoText1.text = "event(" .. event.phase .. ") ("..event.x..","..event.y..")" eventInfoText2.text = " " end Runtime:addEventListener( "touch", printTouch2 ) |