2011-07-05 8 views
0

私は基本的に "どこでも"検索して解決策を見つけることができませんので、ここで私は助けていただければ幸いです。このコードのMax/Minスケールを制限しようとしています。今のようあなたがピンチすることができますし、無限にズーム、私は、ユーザーがズームイン、ズームアウトすることができますどのくらいの制限を設定したいので、どのように私はこのコードLuaコロナ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

その機能は...ひどく長いです。手元にある問題に重要ではない部品を取り除くことはできますか? – kikito

答えて

4

にすることを追加しますあなたはここでロジックを行います:

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) `

関連する問題