Lua Corona SDK 中的捏缩放比例限制

Posted

技术标签:

【中文标题】Lua Corona SDK 中的捏缩放比例限制【英文标题】:Pinch to Zoom Scale Limits in Lua Corona SDK 【发布时间】:2011-09-28 13:16:48 【问题描述】:

我基本上已经“到处”搜索并且找不到解决方案,所以,我在这里并且希望得到任何帮助,我正在尝试限制此代码的最大/最小比例,截至目前,您可以捏合和缩放到无穷大,我想限制用户可以放大和缩小的距离,那么我将如何将其添加到此代码中

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

 -- 将 bkgd 图像添加到屏幕
 本地背景 = display.newImage("aquariumbackgroundIPhone.jpg", 0, 0)

局部函数calculateDelta(previousTouches, event)
    本地 id,touch = next(previousTouches)
    如果 event.id == id 那么
            id,touch = next(previousTouches, id)
            断言(id ~= event.id)
    结尾

    本地 dx = touch.x - event.x
    本地 dy = touch.y - event.y
    返回 dx, dy
    结尾

-- 为 bkgd 图像创建一个表监听器对象
功能背景:触摸(事件)
    本地结果 = true

    本地阶段 = event.phase

    本地 previousTouches = self.previousTouches

    本地 numTotalTouches = 1
    if (previousTouches) then
            --从previousTouches中加总,如果事件已经在数组中,则减一
            numTotalTouches = numTotalTouches + self.numPreviousTouches
            如果 previousTouches[event.id] 那么
                    numTotalTouches = numTotalTouches - 1
            结尾
    结尾

    如果“开始” == 阶段,那么
            -- 第一个“开始”事件
            如果(不是 self.isFocus)那么
                    -- 后续的触摸事件将针对按钮,即使它们在按钮的 stageBounds 之外
                    display.getCurrentStage():setFocus(self)
                    self.isFocus = true

                    以前的触摸 = 
                    self.previousTouches = previousTouches
                    self.numPreviousTouches = 0
            elseif ( 不是 self.distance ) 然后
                    本地 dx,dy

                    如果 previousTouches 和 ( numTotalTouches ) >= 2 那么
                            dx,dy = calculateDelta(previousTouches, event)
                    结尾

                    -- 初始化为两次触摸之间的距离
                    如果(dx 和 dy)那么
                            本地 d = math.sqrt(dx*dx + dy*dy)
                            如果 ( d > 0 ) 那么
                                    self.distance = d
                                    self.xScaleOriginal = self.xScale
                                    self.yScaleOriginal = self.yScale
                                    打印(“距离=”.. self.distance)
                            结尾
                    结尾
            结尾

            如果不是 previousTouches[event.id] 那么
                    self.numPreviousTouches = self.numPreviousTouches + 1
            结尾
            previousTouches[event.id] = 事件

    elseif self.isFocus then
            如果“移动”== 阶段,那么
                    如果(self.distance)那么
                            本地 dx,dy
                            如果 previousTouches 和 ( numTotalTouches ) >= 2 那么
                                    dx,dy = calculateDelta(previousTouches, event)
                            结尾

                            如果(dx 和 dy)那么
                                    本地 newDistance = math.sqrt(dx*dx + dy*dy)
                                    局部比例 = newDistance / self.distance
                                    打印(“newDistance(”..newDistance..“)/距离(”..self.distance..“)=规模(“..规模..”)“)
                                    如果 ( 比例 > 0 ) 那么
                                            self.xScale = self.xScaleOriginal * 比例
                                            self.yScale = self.yScaleOriginal * 比例
                                    结尾
                            结尾
                    结尾

                    如果不是 previousTouches[event.id] 那么
                            self.numPreviousTouches = self.numPreviousTouches + 1
                    结尾
                    previousTouches[event.id] = 事件

            elseif “结束” == 阶段或“取消” == 阶段 then
                    如果 previousTouches[event.id] 那么
                            self.numPreviousTouches = self.numPreviousTouches - 1
                            previousTouches[event.id] = nil
                    结尾

                    如果(#previousTouches > 0)那么
                            -- 必须至少剩余 2 次触摸才能捏合/缩放
                            self.distance = nil
                    别的
                            --previousTouches 是空的,所以没有更多的手指在触摸屏幕
                            -- 允许触摸事件正常发送到他们“击中”的对象
                            display.getCurrentStage():setFocus(nil)

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

                            -- 重置数组
                            self.previousTouches = nil
                            self.numPreviousTouches = nil
                    结尾
            结尾
    结尾

    返回结果
   结尾

    -- 确定是否在 Corona Simulator 上运行
      --
     本地 isSimulator = "模拟器" == system.getInfo("环境")

     -- 模拟器不支持多点触控事件
      --
         如果是模拟器那么
         msg = display.newText("模拟器不支持多点触控!", 0, 20, "Verdana-Bold", 14 )
         msg.x = display.contentWidth/2 -- 中心标题
          msg.y = display.contentHeight/2 -- 中心标题
          味精:setTextColor(255,255,0)
           结尾

          -- 注册表监听器
           背景:addEventListener(“触摸”,背景)

【问题讨论】:

那个函数……太长了。你能把对手头的问题不重要的部分去掉吗? 【参考方案1】:

你在这里做逻辑:

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

这是采用原始比例并将其乘以新比例。所以你需要做类似的事情:

本地 xScale = self.xScaleOriginal * 比例 本地 yScale = self.yScaleOriginal * 比例

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

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

【讨论】:

以上是关于Lua Corona SDK 中的捏缩放比例限制的主要内容,如果未能解决你的问题,请参考以下文章

Lua/Corona SDK:为啥我的倒计时停止了?

场景和群组使用Lua和Corona SDK时出现问题

防止 UIWebview 上的捏缩放和双击缩放

如何在 Corona SDK 中切换到另一个场景?

为啥 Corona sdk 中会出现此错误?

通过触摸平滑移动具有 3000 个元素的组(Corona sdk)