Ok, here is a simplified demo with some comments to explain what’s going on
I’d really appreciate a push in the right direction
--Note: Each object is in its own display group --to keep consistent with the real app where this --is necessary and also using a lot of hard coded --numbers for simplicity local MainView = display.newGroup() --Using bounding box as edges where object should wrap local BoundingBox = display.newRect(MainView,160,240,300,300) BoundingBox:setFillColor(1,1,1) --Setup 3 objects that will move together local DG1 = display.newGroup() local DG1Obj = display.newCircle(DG1,0,0,20) DG1Obj:setFillColor(0,1,0) DG1.x = 160 DG1.y = 240 MainView:insert(DG1) local DG2 = display.newGroup() local DG2Obj = display.newRect(DG2,0,0,40,40) DG2Obj:setFillColor(1,0,0) DG2.x = 120 DG2.y = 240 MainView:insert(DG2) local DG3 = display.newGroup() local DG3Obj = display.newText(DG3, "ABC",0,0) DG3Obj:setFillColor(0,0,1) DG3.x = 80 DG3.y = 240 MainView:insert(DG3) --Create invisible rectangle to capture touch events local HitTestRectangle = display.newRect(MainView,160,240,320,40) HitTestRectangle.alpha = 0 HitTestRectangle.isHitTestable = true --Event called when touched local function HitTestTouched(event) if event.phase == "began" then -- elseif event.phase == "moved" then local x = (event.x - event.xStart) --move each object with drag DG1.x = 160 + x DG2.x = 120 + x DG3.x = 80 + x --if object goes completely over edge then position at left side --what really should happen is the portion of the object that goes --past the right side should be redrawn on the left side if DG1.x \>= 330 then DG1.x = x - 140 end if DG2.x \>= 330 then DG2.x = x - 180 end if DG3.x \>= 330 then DG3.x = x - 220 end --I have had some success drawing a copy of the end element and placing --it on the left side and moving it along until the "real" object takes --its place but these object are going to be animating and transitioning --all the time so manually making sure the copy matches will get ugly. --Hoping there is a more elegant approach elseif event.phase == "ended" or event.phase == "cancelled" then DG1.x = 160 DG2.x = 120 DG3.x = 80 end end HitTestRectangle:addEventListener("touch", HitTestTouched)