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

최근에 받은 트랙백

글 보관함


Posted on . Written by


또 다시 돌아왔습니다. FAQ 시간 입니다. 아래 자주 나오는 질문 5가지가 있습니다. 오늘은 Display object를 Lisener로 pass 하는 방법과 off-line에서 CoronaSDK document에 접근하는 방법에 대해 얘기하겠습니다.



1. How can I access the display object in the “transition.to” listener?

"tween" 이 finish 할 때 call 되는 리스너 함수로 transition.to과 transiditon.from 파라미터가 있습니다. 

리스너에 보내지는 파라미터는 transition에 의해 콘트롤 되는 Display Object(target)의 reference 입니다. 이것은 여러분에게 multiple transition들에 대해 일반적인 리스너를 이용할 수 있도록 해 줍니다.


local square = display.newRect( 0, 0, 100, 100 )
local w,h = display.contentWidth, display.contentHeight


local function listener1( target )
        print( "Transition 1 completed on object: " .. tostring( target ), target.x, target.y )
end


transition.to( square, { time=1500, alpha=0, x=(w-50), y=(h-50), onComplete=listener1 } )



Note 제가 onComplete=listener1()를 사용하지 않고 onComplete=listener1를 사용했죠? 둘 이 다른 점은 onComplete=listener1는 리스너의 함수에 레퍼런스를 passing 한다는 겁니다. onComplete=listener1()는 리스너를 initialization 할 때 call 하죠 그리고 transition (화면전환)이 끝났을 때 call 되는 함수처럼 리스너로부터 return 되는 것을 사용합니다.


2. I need to cancel the “transition” for multiple display objects. Is there an easy way to find the transition ID for each object?


transition을 cancel 하려면 transition.cancel을 call 해야 되요 이때 transition ID로 call 해야 됩니다. 이 transition ID는 transition이 처음 생성될 때 return 됩니다. 이 ID는 어딘가에 저장해 놔야 됩니다. 로컬 변수나 테이블에 저장할 수 있겠죠.


그런데 더 쉬운 그리고 더 편한 방법은 그 객체 자체에 attach 하는 겁니다. 코로나에서는 display object에 custom property들을 추가 할 수 있는 기능을 제공합니다. transitionID라는 custom property를 만들어서 여기에 저장하면 좋습니다.


저는  display의 이름을 저장하는데도 사용합니다. 그러면 디버깅할 때도 편리합니다. (e.g., object.name).

아래 transitionID를 어떻게 저장하는지 보여주는 예제가 있습니다



local square = display.newRect( 0, 0, 100, 100 )
local w,h = display.contentWidth, display.contentHeight


local function listener1( target )
        print( "Transition 1 completed on object: " .. tostring( target ), target.x, target.y )
end


square.transitionID = transition.to( square, { time=3000, alpha=0, x=(w-50), y=(h-50), onComplete=listener1 } )
timer.performWithDelay( 1500, function() transition.cancel( square.transitionID ) end )



위 코드는 transition 이 반쯤 됐을 때 cancel 하는 timer 함수를 추가했습니다. 나머지는 첫번째 예제와 비슷하고 움직이죠. 여기서는 이 transition을 cancel 하기 위해 필요한 ID를 save 하기위해 square.transitionID를 사용했습니다.



3. How can I pass the display object to a function when I’m using “timer.performWithDelay”?


비슷한 질문에 대한 대답을 FAQ #3에서 했었습니다만 어떻게 Display Object를 listener로 pass 하는지에 대해 보여 드리겠습니다.

timer.performWithDelay는 보통 listener의 address(reference)와 함께 call 됩니다. 그러니까 delay가 finish 된 후에 call 될 수가 있죠. 

여기서 함수가 call 됐을 때 pass 되는 display object에 대한 reference를 hold 할 로컬 변수를 생성하기 위해 루아의 closures를 사용할 수 있습니다. 아래 그 예제가 있습니다.



local rect = display.newRect( 0, 0, 100, 100 )


local function timerListener( object )
    return function()
        print( "Rect x,y = ", object.x, object.y )
    end
end


timer.performWithDelay( 1000, timerListener( rect ) )



timerListener “listener”는 함수에 대한 reference 대신에 call 되는 함수 입니다. 이 함수를 call 하는것은 저장된 object 변수에 접근할 수 있는 anonymous 함수의 reference를 return 하도록 합니다. 그 object는 timerListener에 pass 됩니다. 그 시기는 timer가 첫번째로 initialized 될 때이고 return 된 anonymous 함수는 delay time이 종료 된 이후에 call 된 함수처럼 사용 됩니다.

오직 한 객체에 대해서만 리스너를 사용할 거라면 이 방법은 그리 유용하지 않을 겁니다. 이 기능의 장점은 리스너가 많은 객체들을 다룰 때 그 진가가 나타날 겁니다. 그 리스너는 deplay object에만이 아니라 테이블, 스트링 그리고 number에도 적용 됩니다.


4. I’m confused about what parameters are available in event listeners.


리스너에 보내지는 이벤트 파라미터가 무엇인지 이해하시려면 CoronaSDK documentation를 참조하세요.  그리고 리스너에 어떤것이 pass 되는지도 확인하세요. event 정보는 파라미터들의 table 입니다. 이 table을 dump 하는 간단한 예제가 이것을 이해하는데 그리고 디버깅 하는데 도움을 드릴 겁니다. 아래 제가 찾아낸 유용한 디버그 코드가 있습니다. 어떻게 동작하는지 보여주기 위해 touch 리스너를 사용했습니다.



local function touchListener( event )
--- Debug Event parameters printout --------------------------------------------------
print();print( "Listener events:" )
for k,v in pairs( event ) do
print( " " .. tostring( k ) .. "(" .. tostring( v ) .. ")" )
end
--- End of debug Event routine -------------------------------------------------------
return true
end
Runtime:addEventListener( "touch", touchListener )


아래가 스크린을 touch 했을 때 화면에 출력되는 event 파라미터들입니다.


Listener events:
y(66)
x(193)
time(84950.623)
id(userdata: 0x1000df3e0)
phase(began)
yStart(66)
xStart(193)
name(touch)
Listener events:
y(68)
x(193)
time(86388.318)
id(userdata: 0x1000df3e0)
phase(moved)
yStart(66)
xStart(193)
name(touch)
Listener events:
y(68)
x(193)
time(86746.278)
id(userdata: 0x1000df3e0)
phase(ended)
yStart(66)
xStart(193)
name(touch)


5. Sometimes I don’t have an Internet connection. Is there a way to access CoronaSDK documentation off-line?


만약 질문자께서 CoronaSDK subscriber라면 Daily Build page 로 가면 off-line 버전 CoronaSDK API document를 다운 방으실 수 있습니다. CoronaApiDocs file 각 daily build 마다 하나씩 가지고 있습니다. 다운받아서 여러분 컴퓨터에 unzip 하시기만 하면 됩니다. api 폴더를 열고 index.html을 double click을 하세요. 그러면 브라우저에 CoronaAPI document가 열릴겁니다.





여기까지가 오늘의 questions 입니다. 유익한 시간이셨기를 바랍니다.



반응형

Comment

  1. izowooi 2012.08.27 16:46

    잘 읽었습니다.
    저도 event 에 무슨 파라미터가 있는지 궁금했는데, 어차피 테이블이니, 테이블 조회 함수를 만들어서 넘기면 되는 거였군요! 좋은 정보 감사합니다 ^_^