Here’s a simple implementation:
local physics = require("physics") physics.start() local bullet = {} local bCounter = 1 local circleOne = display.newCircle( display.contentCenterX, display.contentCenterY, 30 ) physics.addBody( circleOne, "dynamic" ) circleOne.gravityScale = 0 local box = display.newRect( display.contentCenterX, display.contentCenterY - 200, 20, 20 ) local speedMultiplier = 50 local function shoot(event) bullet[bCounter] = display.newCircle( box.x, box.y, 10 ) physics.addBody( bullet[bCounter], "dynamic" ) bullet[bCounter].gravityScale = 0 bullet[bCounter].value = bCounter -- METHOD 1: Simple -- local diffX, diffY = circleOne.x - bullet[bCounter].x, circleOne.y - bullet[bCounter].y -- bullet[bCounter]:setLinearVelocity(diffX \* speedMultiplier, diffY \* speedMultiplier) -- METHOD 2: Slightly more complex - this is probably better because bullets will fire at a constant speed local diffX, diffY = circleOne.x - bullet[bCounter].x, circleOne.y - bullet[bCounter].y local distance = ((diffX \* diffX) + (diffY \* diffY)) ^ 0.5 local normalX, normalY = diffX / distance, diffY / distance bullet[bCounter]:setLinearVelocity(normalX \* speedMultiplier, normalY \* speedMultiplier) -- METHOD 3: Nah... Implement it yourself. Bleh. Really quite complex. bCounter = bCounter + 1 end local function startAndEnd(event) if event.phase == "began" then timerStart = timer.performWithDelay( 100, shoot, -1 ) elseif event.phase == "ended" then timer.cancel( timerStart ) end end box:addEventListener( "touch", startAndEnd ) local function moveBox( event ) box.x = event.x box.y = event.y end box:addEventListener( "touch", moveBox )