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)