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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형
Touch Events

사용자가 스크린을 터치 했을 때 hit 이벤트가 발생합니다. 그리고 이 이벤트는 우선 순위에 따라 스크린에 표시된 object들에 전달 됩니다. 우선순위에 있는 객체가 이 이벤트를 가로채서 사용했다면(handle) 그 이후의 객체들에게는 이 이벤트가 전달 되지 않습니다.
어떤 특정한 객체에 이벤트의 포커스를 맞추고 싶으면 display.getCurrentStage():setFocus(object)를 이용합니다. 지난 번 글에서 한번 설명한 적이 있습니다. 버튼 down시 이후에 일어나는 up은 이 버튼에만 적용되도록 하는 경우에 사용 됩니다.

touch(single touch)
event.name : touch
event.x : 터치된 곳의 x 좌표
event.y : 터치 된 곳의 y 좌표
event.xStart : touch의 began phase 일 때 x 좌표였던 곳
event.yStart : touch의 began phase 일 때 y 좌표였던 곳
event.phase
  : began : 손가락이 스크린에 닿는 순간
  : moved : 손가락이 스크린에 닿은 채로 움직이는 경우 (컴퓨터의 드래그 상태)
  : ended : 손가락이 스크린에서 떼어지는 순간
  : cancelled : system이 touch 이 tracking을 cancel한 시점

touch (multitouch)
여러 손가락이 스크린에 터치 됐을 경우 이 multitouch를 사용해야 합니다.
제가 만든 앱 중에 multi Player ping pong 이라는 앱에 이 기능을 적용했는데요.
1~4인용 게임이라서 여러명이 터치할 경우 이를 반영해야 했습니다.
코로나에서는 MultitouchFingers와 MultitouchButton (interface 폴더 아래) 라는 샘플코드를 제공 합니다.
-- 이 multitouch 와 ui.lua를 동시에 사용할 경우는 최신버전의 ui.lua를 받으셔야 합니다. 초창기 버전에서는 멀티터치 기능 지원에 제한이 있었나 봅니다.
이 코로나 멀티 터치는 NexusOne, HTC Incredible 같은 일부 안드로이드 폰에서 동작이 잘 안 될 수 있다고 합니다. 이건 그 디바이스에서 멀티터치 기능을 지원하지 않기 때문이라고 하는군요. 참고하세요.--
멀티터치는 위에 있는 모든 싱글터치에 있는 프로퍼티들을 다 가지고 있습니다.
그 외에 event.id와 event.time 프로퍼티가 추가로 더 있습니다.
멀티터치는 각 터치들의 구분을 event.id로 합니다. event.time은 터치 당시의 system.getTimer()입니다.

멀티터치 사용법
멀티터치를 사용하시려면 처음에 system.activate("multitouch") 를 해 주시면 됩니다. 이 선언을 하신 후 스크린의 두곳을 터치하면 코로나는 event.id로 이것을 따로 관리하게 됩니다.

싱글 터치에 있었던  Forcus는 stage:setFocus(object[,touchID]) 를 사용 합니다. 이 기능은 각 object에 대해 touchID별로 따로 포커스를 둡니다. 이 기능을 없애려면 stage:setFocus(object,nil)을 해 주시면 됩니다.

Custom Events
object:dispatchEvent(event)
코로나는 custom events를 지원한다고 합니다. 아래 소스를 보세요.
-- Create an object that listens to events
local image = display.newImage( "endinggreen.png" )
 
-- Setup listener
local myListener = function( event )
        print( "Event " .. event.name )
        print( "Target has width: " .. event.target.contentWidth )
end
 
image:addEventListener( "myEventType", myListener )
 
-- Sometime later, create an event and dispatch it
local event = { name="myEventType", target=image }
image:dispatchEvent( event )


보시면 myEventType 이라는 이벤트를 개발자가 직접 만들 수 있습니다.
이 소스는 image에 이벤트를 걸어서 이 이미지가 뜰 때 event.name (myEventType)과 이 이미지의 width가 나오도록 한 소스코드 입니다.

Timer
가끔 특정 함수를 일정한 시간 이후에 호출할 필요가 있습니다.
앱 개발을 하다 보면 일정한 속도로 이미지를 움직이던가 할 때 이 시간을 조절하면서 이용하는게 더 편할 때가 있습니다. 이럴때 timer.performWithDelay를 사용하면 편합니다.

timer.performWithDelay(delay,listener[,iterations])

delay는 밀리세컨드 milliseconds 이구요 listener는 동작될 함수를 넣어 주시면 됩니다. iterations는 반복 횟수로 0이면 앱이 실행되고 있는 한 무한대로 반복 됩니다.

 local function listener( event )
    print( "listener called" )
 end
 
 timer.performWithDelay(1000, listener )

local listener = {}
function listener:timer( event )
   print( "listener called" )
end
 
timer.performWithDelay(1000, listener )

위 두 소스코드는 똑같이 1초마다 listener함수를 불러옵니다. 위에것은 함수 리스너이고 아래것은 테이블 리스너 입니다. 이 Function Listener 와 Table Listener 의 차이점과 장단점은 지난 글에서 다뤘으니까 따로 설명은 하지 않겠습니다.

timer.cancel(timerId)

 local t = {}
 function t:timer( event )
    local count = event.count
    print( "Table listener called " .. count .. " time(s)" )
    if count >= 3 then
        timer.cancel( event.source ) -- after 3rd invocation, cancel timer
    end
 end

 -- Register to call t's timer method an infinite number of times
 timer.performWithDelay( 1000, t, 0 )

위 소스코드는 1초 간격으로 t 를 실행시키는 테이블 함수 입니다. 여기서 event.count가 3보다 크거나 같으면 이 timer를 cancel 하도록 만들었습니다.
timer를 cancel 하는 방법에 대한 예제 소스코드 입니다.

timer.pause(timerId) : 이 기능은 코로나 build version 2011.596 부터 가능합니다.
timer.resume(timerId) 기능도 2011.596 버전부터 사용이 가능합니다.

2 주전 쯤에 다운 받았을 때만 해도 안전한 버전이 591 이었습니다. 위 두 기능을 다운 받으려면 그 이후 버전을 받아야 겠네요.

참고로 안정성이 확인 되지 않은 시험판 버전은 유료 구매자에 한해서 받을 수 있을 겁니다.

지금까지 코로나 SDK 의 이벤트,리스너에 대해 알아 봤습니다.

다음 Codona SDK DOC 공부는 Location and Maps 입니다.

그럼 다음에 뵙겠습니다.
반응형