Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --Скрыть StatusBar
- display.setStatusBar (display.HiddenStatusBar)
- --параметры экрана
- _W = display.contentWidth
- _H = display.contentHeight
- --пивот по умолчанию
- display.setDefault( "anchorX", 0 )
- display.setDefault( "anchorY", 0 )
- -- display.setDefault( "background", 1 )
- --активация мультитача
- system.activate( "multitouch" )
- --создаём изображение
- local img = display.newImage("image.jpg")
- --количество нажатий
- local touch_count = 0
- --для хранения данных о тапе
- local touch_id = {}
- --стартовая дистанция между тапами
- local oldDistance = nil
- --текущая дистанция между тапами
- local newDistance = nil
- --объект для отображения середины между тапами
- local circle_green = display.newCircle(-10,-10,10)
- circle_green.anchorX, circle_green.anchorY = 0.5, 0.5
- circle_green.fill = {0,1,0}
- --объект для зума
- local target = img
- function zoom ( event )
- local phase = event.phase
- local x,y = 0,0
- local xNow,yNow
- ---------------------------------------------------
- --для перемещения по 1 тапу
- local function tapBegan(event)
- if (event.x > target.x) then
- target.offsetX = event.x - target.x
- elseif (event.x < target.x) then
- target.offsetX = target.x - event.x
- end
- if (event.y > target.y) then
- target.offsetY = event.y - target.y
- elseif (event.y < target.y) then
- target.offsetY = target.y - event.y
- end
- end
- local function tapMoved(event)
- if (event.x > target.x) then
- target.x = event.x - target.offsetX
- elseif (event.x < target.x) then
- target.x = event.x + target.offsetX
- end
- if (event.y > target.y) then
- target.y = event.y - target.offsetY
- elseif (event.y < target.y) then
- target.y = event.y + target.offsetY
- end
- end
- ---------------------------------------------------
- --длина отрезка
- local function getDistance(x1,y1,x2,y2)
- return math.sqrt((x2 - x1) ^ 2 + (y2 - y1) ^ 2)
- end
- --середина на отрезке
- local function centerDistance(x1,y1,x2,y2)
- local x,y = 0,0
- --Y
- if y2 > y1 then
- y = (y2-y1)/2 + y1
- else
- y = (y1-y2)/2 + y2
- end
- --X
- if x2 > x1 then
- x = (x2-x1)/2 + x1
- else
- x = (x1-x2)/2 + x2
- end
- return x,y
- end
- local function reposAnchor(x,y)
- local posX, posY = x, y
- local sizeX, sizeY = target.contentWidth, target.contentHeight
- local xDiff, yDiff = posX - target.x , posY - target.y
- target.anchorX = target.anchorX + xDiff / sizeX
- target.anchorY = target.anchorY + yDiff / sizeY
- target.x, target.y = posX, posY
- -- debug:log( target.anchorX.."|"..target.anchorY)
- end
- --обновление данных о тапе
- local function update()
- for i=1,touch_count do
- if touch_id[i].id == event.id then
- touch_id[i].xNew=event.x
- touch_id[i].yNew=event.y
- end
- end
- end
- if phase == "began" then
- --увеличиваем количество тапов
- touch_count = touch_count + 1
- --заносим.обновляем в таблицу данные о тапе
- touch_id[touch_count]=
- {
- id=event.id,
- xStart=event.xStart,
- yStart=event.yStart,
- xNew=event.x,
- yNew=event.y
- }
- --если 2 тапа
- if touch_count == 2 then
- --запоминаем стартовую дистанцию
- oldDistance = getDistance(touch_id[1].xStart, touch_id[1].yStart, touch_id[2].xStart, touch_id[2].yStart)
- --распологаем зеленую точку
- x,y = centerDistance(touch_id[1].xNew,touch_id[1].yNew,touch_id[2].xNew,touch_id[2].yNew)
- circle_green.x,circle_green.y = x,y
- --устанавливаем анкор и поозицию
- reposAnchor(x,y)
- elseif touch_count == 1 then
- -- начало перемещения одним тапом
- tapBegan(event)
- end
- elseif phase == "moved" then
- --обновляем данные о тапах
- update()
- if touch_count == 1 then
- --перемещение одним тапом
- tapMoved(event)
- elseif touch_count == 2 then
- --если два тапа
- --получаем новую дистанцию
- newDistance = getDistance(touch_id[1].xNew,touch_id[1].yNew,touch_id[2].xNew,touch_id[2].yNew)
- --устанавливаем позицию для отладочной точки
- circle_green.x,circle_green.y = centerDistance(touch_id[1].xNew,touch_id[1].yNew,touch_id[2].xNew,touch_id[2].yNew)
- circle_green.alpha = 1
- --увеличение
- if newDistance > oldDistance then
- if target.xScale < 3 then
- target.xScale = target.xScale + 0.01
- target.yScale = target.yScale + 0.01
- newDistance = newDistance - 0.05
- else
- target.xScale = 3
- target.yScale = 3
- end
- else
- --уменьшение
- if target.xScale > 1 then
- target.xScale = target.xScale - 0.01
- target.yScale = target.yScale - 0.01
- newDistance = newDistance + 0.2
- else
- target.xScale = 1
- target.yScale = 1
- end
- end
- end
- elseif phase == "cancelled" or phase == "ended" then
- --уменьшаем количество тапов
- touch_count = touch_count - 1
- --скрываем зеленую точку
- circle_green.alpha = 0
- end
- return true
- end
- --листинер для зума
- Runtime:addEventListener("touch", zoom)
- -- target:addEventListener("touch", zoom)
- require("debug_view")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement