반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

Pinch Zoom Rotate 구현하기 - 2/11 -

2013. 1. 29. 06:12 | Posted by 솔웅


반응형

Multiple Touches


이 함수를 multiple display object들에 의해 사용되도록 하는 방법은 그렇게 어렵지 않습니다. setFocus 로 catch 해서 각 display object별로 한개의 touch 에 대해 listen 하도록 할 수 있습니다. 즉 하나의 touch 가 하나의 object 에 할당 되면 다른 touch 들은 그 object 에서는 무시되는 거죠. 이렇게 각 object 별로 각 touch 들을 할당해 놓으면 멀티터치 기능이 구현 가능합니다.



multitouch 를 구현하기 위해 이전 글에서 만들었던 코드를 수정할 겁니다.


sample2.lua



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

 

-- creates an object to be moved

local function newDragObj( x, y )

local circle = display.newCircle( x, y, 50 ) -- create a user interface object

circle.alpha = 0.5 -- make it less imposing

-- standard multitouch event listener

function circle:touch(e)

local target = e.target -- get the object which received the touch event

-- handle each phase of the touch event life cycle...

if (e.phase == "began") then

display.getCurrentStage():setFocus(target, e.id) -- set touch focus on this object

target.hasFocus = true -- remember that this object has the focus

return true -- indicate the event was handled

elseif (target.hasFocus) then -- this object is handling touches

if (e.phase == "moved") then

target.x, target.y = e.x, e.y -- move the display object with the touch

else -- "ended" and "cancelled" phases

display.getCurrentStage():setFocus(target, nil) -- remove touch focus

target.hasFocus = false -- this object no longer has the focus

end

return true -- indicate that we handled the touch and not to propagate it

end

return false -- if target is not responsible for this touch event return false

end

circle:addEventListener("touch") -- listen for touches starting on the touch layer

return circle -- return the object for use

end

 

local group = display.newGroup() -- create layer for the draggable objects

 

-- create 5 draggable objects

for i=1, 5 do

local circle = newDragObj( 100, i*100 )

group:insert( circle ) -- add it to the control layer

end




이 코드가 이전 코드와 다른점들을 살펴 보죠.

- multitouch 를 activate 했습니다.
- display object 생성을 wrap 했습니다. 그래서 display object 가 반복적으로 call 될 수 있게 됐습니다.
- setFocus 가 특정 touch ID 를 받아서 유저가 화면에 하는 여러 touch 들을 구분할 수 있도록 했습니다.
- When ending the touch, setFocus accepts nil to release the object’s touch input.
- touch가 끝나면 setFocus 는 nil 을 받아서 해당 object가 그 touch input 받는 일을 release 시켜 줍니다.


위 의 코드를 실행하면 5개의 큰 원을 생성하게 됩니다. 그 각 원들은 따로따로 움직일수가 있죠. setFocus 가 display object에 특정 Touch ID를 연결시켜주기 때문에 그 object는 다른 touch 들은 무시하게 됩니다. 이 로직으로 각 원들은 각각 다른 touch들이 할당 되서 multitouch로 따로따로 움직일 수 있게 되는 거죠.




반응형