在Lua Corona SDK中缩小缩放比例限制

我已基本搜索“无处不在”,无法找到解决方案,所以,我在这里,并感谢任何帮助,我正在尝试限制此代码的最大/最小比例,截至目前你可以捏和缩放到无穷大,我想设置一个限制用户可以放大和缩小的距离,因此我将如何将其添加到此代码中

-- activate multitouch system.activate( "multitouch" )
``

-- add bkgd image to screen
 local background = display.newImage( "aquariumbackgroundIPhone.jpg", 0, 0 )

local function calculateDelta( previousTouches, event )
    local id,touch = next( previousTouches )
    if event.id == id then
            id,touch = next( previousTouches, id )
            assert( id ~= event.id )
    end

    local dx = touch.x - event.x
    local dy = touch.y - event.y
    return dx, dy
    end

-- create a table listener object for the bkgd image
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 stageBounds 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

    -- Determine if running on Corona Simulator
      --
     local isSimulator = "simulator" == system.getInfo("environment")

     -- Multitouch Events not supported on Simulator
      --
         if isSimulator then
         msg = display.newText( "Multitouch not supported on Simulator!", 0, 20,       "Verdana-Bold", 14 )
         msg.x = display.contentWidth/2          -- center title
          msg.y = display.contentHeight/2         -- center title
          msg:setTextColor( 255,255,0 )
           end

          -- register table listener
           background:addEventListener( "touch", background )

回答(1)

2 years ago

你在这里做逻辑:

if ( scale > 0 ) then self.xScale = self.xScaleOriginal * scale self.yScale = self.yScaleOriginal * scale end

这是采用原始比例并乘以新比例 . 所以你需要做一些事情:

local xScale = self.xScaleOriginal * scale
local yScale = self.yScaleOriginal * scale

//设置上限
xScale = math.min(ZOOMMAX,xScale)
yScale = math.min(ZOOMMAX,yScale)

//设置下限
self.xScale = math.max(ZOOMMIN,xScale)
self.yScale = math.max(ZOOMMIN,yScale)`