0

i am using the function contained in corona sample codes for the pinch to zoom. But since i am developing an app, i need to make every single place of interest zoommable. Do i have to copy and paste the horribly long function for every single image or can i redirect every image on just one function? I am new to lua, here is the pinch to zoom function included in the sample code:

function background:touch( event )
local result = true

local phase = event.phase

local previousTouches = self.previousTouches

local numTotalTouches = 1
if ( previousTouches ) then
    -- add in total from previousTouches, subtract one if event is already in the array
    numTotalTouches = numTotalTouches + self.numPreviousTouches
    if previousTouches[event.id] then
        numTotalTouches = numTotalTouches - 1
    end
end

if "began" == phase then
    -- Very first "began" event
    if ( not self.isFocus ) then
        -- Subsequent touch events will target button even if they are outside the contentBounds of button
        display.getCurrentStage():setFocus( self )
        self.isFocus = true

        previousTouches = {}
        self.previousTouches = previousTouches
        self.numPreviousTouches = 0
    elseif ( not self.distance ) then
        local dx,dy

        if previousTouches and ( numTotalTouches ) >= 2 then
            dx,dy = calculateDelta( previousTouches, event )
        end

        -- initialize to distance between two touches
        if ( dx and dy ) then
            local d = math.sqrt( dx*dx + dy*dy )
            if ( d > 0 ) then
                self.distance = d
                self.xScaleOriginal = self.xScale
                self.yScaleOriginal = self.yScale
                print( "distance = " .. self.distance )
            end
        end
    end

    if not previousTouches[event.id] then
        self.numPreviousTouches = self.numPreviousTouches + 1
    end
    previousTouches[event.id] = event

elseif self.isFocus then
    if "moved" == phase then
        if ( self.distance ) then
            local dx,dy
            if previousTouches and ( numTotalTouches ) >= 2 then
                dx,dy = calculateDelta( previousTouches, event )
            end

            if ( dx and dy ) then
                local newDistance = math.sqrt( dx*dx + dy*dy )
                local scale = newDistance / self.distance
                print( "newDistance(" ..newDistance .. ") / distance(" .. self.distance .. ") = scale("..  scale ..")" )
                if ( scale > 0 ) then
                    self.xScale = self.xScaleOriginal * scale
                    self.yScale = self.yScaleOriginal * scale
                end
            end
        end

        if not previousTouches[event.id] then
            self.numPreviousTouches = self.numPreviousTouches + 1
        end
        previousTouches[event.id] = event

    elseif "ended" == phase or "cancelled" == phase then
        if previousTouches[event.id] then
            self.numPreviousTouches = self.numPreviousTouches - 1
            previousTouches[event.id] = nil
        end

        if ( #previousTouches > 0 ) then
            -- must be at least 2 touches remaining to pinch/zoom
            self.distance = nil
        else
            -- previousTouches is empty so no more fingers are touching the screen
            -- Allow touch events to be sent normally to the objects they "hit"
            display.getCurrentStage():setFocus( nil )

            self.isFocus = false
            self.distance = nil
            self.xScaleOriginal = nil
            self.yScaleOriginal = nil

            -- reset array
            self.previousTouches = nil
            self.numPreviousTouches = nil
        end
    end
end

return result

end

1 Answers1

0

You could probably use a closure to accomplish this, assuming all of your points of interest are alike.

Example:

local function createPOI(properties)
    local pointOfInterest = createPointOfInterest() -- code to create your object
    --set properties based on argument
    function pointOfInterest:touch(e)
        --do stuff
    end
    pointOfInterest:addEventListner("touch")
    return pointOfInterest
end

Corona has some code here that might be useful. Check the 'Multiple Touches' section.

Henry
  • 149
  • 1
  • 3
  • 12