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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형
Posted on . Written by


storyboard API를 사용해서 switch between scenes 한다는 말은 딱 들어면 뭔지 알겠죠? 단지 scene이 바뀔 동안에 어떻게 데이터를 관리해야 하는지가 애매할 뿐이죠.

이게 왜 애매하냐 하면 대부분의 스토리보드 scene들이 각 모듈별로 (e.g. scene1.lua, scene2.lua) 관리 되고 이렇게 다른 파일들간에 왔다 갔다 할 때 어떻게 파일들간에 데이터를 공유할 것인지를 다루는게 쉽지는 않기 때문이죠. 특히 scene들이 어느때든지 create 되고 destory 될 수 있기 때문에 더 그렇습니다.

오늘의 튜토리얼에서 저는 scene들 사이에서 데이터를 공유할 수 있는 몇가지 방법을 보여드릴 겁니다. 그리고 여러 scene들의 로딩과 unloading 을 거치면서도 여러분 앱 안에서 singular overall "state"를 관리하는 방법들에 대해서도 보실 수 있을 겁니다.




Parameter Passing


한 scene에서 다른 scene으로 전환하기 위해서 storyboard.gotoScene()을 부를 때 여러분은 파라미터를 보낼 수 있고 이 파라미터는 다음 화면의 createScene, willEnterScene, and enterScene들에서 받을 수 있습니다.

아래 예제에서 우리는 score 변수를 gameplay scene에서 gameover scene으로 pass 할 겁니다.


gameplay.lua


-- ...

storyboard.gotoScene( "gameover", {
    effect = "fade",
    time = 800,
    params = {
        score = 100
    }
})

-- ...


gameover.lua


-- ...

function scene:enterScene( event )
    local score = event.params.score

    print( "You scored: " .. score )
end
scene:addEventListener( "enterScene", scene )

-- ...


Persistent Variables


한 scene에서 다음 scene으로 어떤 데이터를 패스해야 할 때 바로 위에서 보여 준 파라미터 passing 방법이 제일 좋은 방법일 겁니다. 그런데 가끔 전체 앱에서 일관되게 공유되어야 할 데이터가 있을 수 있습니다. 혹은 모든 scene 에서 접근 가능한 데이터가 필요할 때가 있습니다. 이럴 경우에는 파라미터를 pass 하는 방법이 최선의 방법이 아닐 수 있죠.

이런 경우 global 변수를 사용하거나 (그렇게 추천할 문한 방법은 아닙니다.) 혹은 모든 scene에서 access 가능한 스토리보드 객체에 attach 되는 state 테이블을 생성하실 수 있습니다. (모든 scene들은 반드시 storyboard 모듈을 require 합니다.)

아래에 global 변수를 사용하지않고 모든 scene들에서 접근 가능한 score 프로퍼티를 어떻게 사용하는지에 대한 예제가 있습니다.


main.lua


local storyboard = require "storyboard"

storyboard.state = {}
storyboard.state.score = 0

-- ...


gameplay.lua


local storyboard = require "storyboard"

-- ...

storyboard.state.score = storyboard.state.score + 100;
storyboard.gotoScene( "gameover", {
    effect = "fade",
    time = 800
})

-- ...


gameover.lua


local storyboard = require "storyboard"

-- ...

function scene:enterScene( event )
    print( "Your score is: " .. storyboard.state.score );
end
scene:addEventListener( "enterScene", scene )

-- ...


모든 scene들은 require( “storyboard” )를 반드시 해야 됩니다. 그러면 그 scene들은 common object를 share 하게 되는 거죠. main.lua에서 state 테이블을 선언했습니다. 그러면 그 테이블에 원하는 만큼의 변수를 추가할 수 있게 됩니다. 그 변수들은 require( “storyboard” )를 한 모든 모듈에서 접근 가능하게 되는 것이죠. global namespace를 사용해서 소스를 지저분하게 하지 않고서두요.

scene들 사이에 데이터를 공유하는 다른 방법들도 있을 겁니다. 위에 제시한 방법은 저희들이 추천드리는 방법입니다. 여러분들이 사용하시는 multiple modules and scenes 사이에서 데이터를 share 하는 방법은 뭐가 있습니까?

반응형