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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형
Introducing Corona Twitter Contests

트위터 콘테스트를 엽니다. 경품은 코로나 SDK 1달 무료 이용권입니다.

매주 코로나 트위터 커뮤니티에 질문을 올릴겁니다. 첫번째는 오늘 시작합니다. (Tuesday, May 1)

응모 방법은 아주 간단합니다.

1. 트위터에서 @ansca을 팔로우 해 주세요.
2. Facebook에도 마찬가지구요.
3. @ansca로 여러분의 정답을 트윗 해 주세요. 트윗하실때 #coronaSDK 라고 hashtag를 넣어 주세요.




금주의 질문은......

“Tell us your best/favorite/most awesome app marketing tip in 140 characters!”
"여러분이 가지고 있는 가장 효과적인 앱 광고방법 혹은 가장 좋아하는 앱 광고방법 을 140자 이내로 트윗해 주세요."


다 음주 초에 당선작을 선정하겠습니다. 당첨되시는 분은 코로나 Pro license 1달 무료이용권을 받으실 수 있습니다. (기존 회원은 1달 연장 해 드립니다.) 마감은 5월 6일 일요일 11:59 pm PT (한국 시간으로 5월 7일 월요일 오후 3시 59분 인가요???) 입니다.

당선작은 코로나 커뮤니티에 마케팅 전문가로 추앙받으실 겁니다. 즐트윗하시고 good luck 하세요.



반응형


반응형

오늘은 Dallas 지역에서 Corona SDK 명예대사로 활동하고 있는 Charles McKeever 의 글을 소개 합니다.


==== o ==== o ==== o ====


I’m Now A Corona SDK Ambassador

I have great news to share with you. I’m pleased to announce that I am now a Corona SDK Ambassador. What that means to you is that you’ll be hearing a lot more about mobile development on Open Source Marketer and I’ll be letting you know about upcoming Corona SDK events in the Dallas area.

여러분에게 좋은 소식을 알려드립니다. 제가 코로나 SDK 명예대사가 됐다는 것을 알려드리게 되서 기쁩니다. 여러분 이 의미는 뭐냐 하면 여러분들은 오픈 소스 마케터의 모바일 개발에 대한 훨씬 더 많은 소식을 들을 수 있게 될것이며 달라스 지역에 코로나 SDK 이벤트(모임)을 열것이라는 것입니다.

What is the Corona SDK?

Well, essentially Mobile development is clearly the future of computing and it’s where the eyeballs are going. The Corona SDK makes it possible to rapidly prototype and develop mobile apps on iOS, Android, Nook, and Kindle devices without needing to learn a complicated programming language. That means you can spend more time being creative.

기본적으로 모바일 개발은 확실히 컴퓨팅의 미래입니다. 그리고 여러분들도 많은 관심이 있으실 겁니다. 코로나 SDK는 이것을 훨씬 앞당길 수 있는 툴입니다. 코로나는 iOS, 안드로이드, Nook, Kindle Fire 등의 그 복잡한 프로그래밍 언어를 배울 필요없이 간단하게 개발할 수 있도록 합니다. 이 말은 곧 모바일 앱을 개발하면서 여러분은 좀 더 창조적인 생각을 하는데 시간을 더 투자할 수 있다는 얘기입니다.





Last year I joined the Corona community after doing a lot of research on how to develop mobile applications for iOS, Kindle, and Android devices. Ansca Mobile’s Corona SDK was the most attractive solution I found because it uses the Lua programming language which shares a lot the the same syntax and programming style as PHP and JavaScript does, while still maintaining a high level of user experience for the end user. As a WordPress developer, the Corona SDK has allowed me to enter the mobile space without needing to completely retrain or retool. I’m able to reference Ansca Mobile’s documentation during development and use the same development tool that I’m already comfortable using.

저는 작년에 iOS, Kindle Fire, 안드로이드 디바이스를 위한 모바일 앱 개발을 어떻게 할 것인가를 많이 연구한 끝에 코로나 커뮤니티에 가입하게 됐었습니다. Ansca Mobile의 코로나 SDK는 제가 찾은 방법중에 가장 매력적인 것이었습니다. 왜냐하면 이 툴은 Lua 프로그래밍 언어를 사용해 PHP나 JavaScript와 거의 유사한 신택스를 가지고 있고 아주 높은 수준의 user experience를 제공하는 기능이 풍부했습니다. WordPress developer 처럼 코로나 SDK는 저를 뭔가 새로운것을 많이 배우지 않아도 모바일 세계에 입문할 수 있도록 도와 주었습니다. 개발하는 동안 Ansca Mobile의 튜토리얼을 참조할 수 있었고 이미 사용했던 다른 익숙한 툴처럼 이 툴을 사용할 수 있었습니다.

So what does it mean to be a Corona SDK Ambassador?

To me being a Corona SDK Ambassador means that I’ll be doing my part to help promote the Corona SDK and build a strong community of both mobile developers and non-techies. I believe anyone can be a creative person with great ideas and the Corona Community will help connect story tellers, writers, artists, programmers, business types, and others together so we can all use our individual skills to create great things together.

저에게 Corona SDK 명예대사가 된다는 의미는 제가 Corona SDK 의 프로모션을 도와주는 한 사람이 될 거라는 것이고요. 모바일 개발자와 프로그래밍을 모르는 일반인들을 위한 강력한 커뮤니티를 만들 거라는 겁니다. 여러분 모두 좋은 아이디어로 창조적인 사람이 될 수 있다고 믿습니다. 그리고 코로나 커뮤니키는 스토리텔러와 작가, 예술가 그리고 프로그래머들, 비지니스맨 등을 서로 연결시켜주는데 도움을 줄 것입니다. 그래서 우리의 기술들을 이용해서 다 함께 창조적인 결과물을 만들 수 있을 겁니다.

So, if you’re in the Dallas area, be sure to join the first ever Dallas Corona SDK Meetup group. The group is brand new and fully supported by the great folks at Ansca Mobile. Right now there are 19 Corona SDK Meetup Groups and growing. If you can’t join the Dallas Corona SDK Meetup Group, consider joining one close to you or contact Ansca Mobile directly to help them start a group in your area.

그러니까 만약 여러분이 달라스 지역에 계시다면 이 지역에 최초로 만들어진 달라스 Corona SDK 모임에 참가하세요. 이 그룹은 이번에 새로 만들어지는 그룹이고 Ansca Mobile 의 전문가들로부터 적극적으로 지원을 받고 있습니다. 지금까지 전 세계적으로 19개의 코로나 SDK 모임이 이뤄졌고 점점 더 늘어나고 있습니다. 만약 여러분이 달라스 코로나 SDK 모임에 참여할 수 없이시다면 여러분 가까이에 있는 모임에 참여하세요. 아니면 Ansca Mobile에 직접 연락하셔서 여러분 지역에서 모임을 시작하겠다고 말하고 논의하셔도 됩니다.

Let’s build something great together.

우리 함께 뭔가 근사한 일을 해 봐요.

Charles McKeever
Corona SDK Ambassador


=====  o ==== o ===== o ====


Charles 는 http://opensourcemarketer.com 에서 활동하는것 같습니다.  (아마 이 싸이트를 운영하는것 같애요.)


코로나 명예대사가 되어서 이제 모임을 결성하려나 봅니다.

지금 각 지역별로 오프라인 모임이 하나하나 진행중이거든요.


저는 미국에 있어서 오프라인 모임을 진행하는 것은 힘들고...

어떻게 해야 하는지 많이 고민이 됩니다.


제가 요즘 회사를 옮기게 되었습니다.

그래서 다음주에 New Jersey에서 Rhode island 로 이사해야 해서 조금 정신이 없습니다.


그리고 새 회사에서도 적응하는 기간동안에는 마음의 여유가 별로 없을 것 같구요.

그 회사에서는 Kurogo와 JQuery Mobile 기술을 주로 사용하나 봅니다. 그쪽으로다 공부 해야 할 것 같고..


하여간 여러모로 Corona SDK 명예대사로서 해보고 싶은 일이 많은데 좀 한계를 느낍니다.

그래도 하나하나 차근 차근 해 나가다 보면 언젠가는 아주 활성화 된 모임을 가질 수 있겠죠.

여러분들의 조언과 참여 부탁드립니다.


지금은 코로나에서 발표되는 새로운 기술이나 뉴스 등을 이 블로그를 통해서 전달하고 있는 수준인데요. 


우리도 달라스처럼 같이 모여서 뭔가 멋진 일을 한번 해 봐요... ^^


반응형


반응형

Scene Overlays and Parameter Passing

Posted by Jonathan Beebe

Storyboard API에서 가장 요구되어지는 두가지 사항들은 화면 전환하면서 custom data를 전달할 수 있는 기능과 한 scene 이 다른 scnen 위에 표시되는 pop up 기능입니다.

많은 분들이 그런 기능을 기다려왔는데 이제 더 이상 기다리지 않으셔도 됐습니다. Daily build 2012.797에 바로 이 두가지 기능이 모두 추가 됐습니다. 이름은 parameter passing과 scene overlays 입니다. (build 2012.785 에는 이미 parameter passing이 있었습니다.

이 기능들과 관련된 튜토리얼은 storyboard.gotoScene()의 parameter passing 과 storyboard.showOverlay()의 scene overlays 에서 보실 수 있습니다. 이렇게 튜토리얼이 있지만 여러분들의 이해를 돕기 위해 이 글에서 간단히 설명 드리겠습니다.

Parameter Passing

parameter passing은 한 scene에서 다음 scene으로 넘어가면서 custom data (하나의 변수 일 수도 있고 테이블-배열- 형식일 수도 있습니다.)를 쉽게 전달할 수 있도록 해 줍니다.

이것을 사용하게 하려면 storyboard.gotoScene() 의 신택스를 바꿔야만 했습니다. (걱정마세요. 이전 신택스도 계속 사용할 수 있습니다. 그러니 지금 진행하시는 프로젝트에는 아마 문제가 없습니다.) 아래 이 parameter passing을 사용하기 위한 새로운 신택스 예제가 있습니다.

local options =
{
    effect = "fade",
    time = 400,
    params =
    {
        var1 = "custom data",
        sample_var = 123,
    }
}
storyboard.gotoScene( "game_scene", options )


가장 크게 다른 점은 storyboard.gotoScene() 함수의 두번째 인수입니다. 이 인수가 optional key들과 optional table로 이루어져 있습니다. 위 예제에서는 모든 가능한 옵션들을 다 보여 줍니다. (effect,time,params). 새로운 부분은 params option 입니다. 이것은 변수가 될 수도 있고 테이블이 될 수도 있습니다.

이렇게 custom data를 pass 하면 그 다음 화면에서는 createScene이나 willEnterScene 그리고 enterScene event 리스너 등에서 event.params 로 이 데이터에 접근할 수 있습니다.

아래에는 game_scene.lua의 enterFrame에서 custom data를 access 하는 예제를 보여드리고 있습니다.

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

    print( params.var1 )    -- "custom data"
    print( params.sample_var )  -- 123
end





Scene Overlays

scene overlay 는 현재의 scene 위에 overlay 해서 다른 scene을 보여 주는 것입니다. 화면전환 효과를 사용해서 이 다른 scene이 나오지만 그 이전 scene이 없어지지 않고 그 자리에 그대로 있게 됩니다. 이 두 화면(scene)에는 두가지 이벤트가 추가 됩니다. 하나는 scene overlay가 display 됐을 때 dispatch 되는 이벤트하고요 그렇지 않을 때 dispatch 되는 이벤트입니다.

storyboard.showOverlay()

View Documentation

이 함수는 overlay를 보여주는 역할을 합니다. overlay 하기 위해 만든 scene은 다른 scnen과 같은 구조를 가졌을 겁니다. 어느 scene이든지 overlay 하고 싶으면 하시면 됩니다. 사실 overlay 가 display 되면 overlayBegin 이벤트가 현재 active 한 non-overlay scene에 dispatch 되게 됩니다. overlay 가 remove 되면 overlayEnded 가 dispatch 되죠.

아래 예제를 보세요. (scene1.lua에 있는 코드라고 생각해 봅시다.)

local options =
{
    effect = "fade",
    time = 400,
    params = { sample_var=456 }
}
storyboard.showOverlay( "overlay_scene", options )


이 scene1.lua의 어느 부분엔가 여러분은 옵션으로 overlayBegan과 overlayEnded 이벤트를 추가할 수 있습니다.

function scene:overlayBegan( event )
    print( "The overlay scene is showing: " .. event.sceneName )
    print( "We get custom params too! " .. event.params.sample_var )
end
scene:addEventListener( "overlayBegan" )

--

function scene:overlayEnded( event )
    print( "The following overlay scene was removed: " .. event.sceneName )
end
scene:addEventListener( "overlayEnded" )


위 리스너들에서 유심히 보셔야 될 것들이 두가지 있습니다. 첫번째는 일반적인 화면 전환에서와 같이 파라미터(custom data)들을  overlays scene에 params option을 사용해서  pass 할 수 있습니다. 그 custom data는 위에서 보신 예대로 리스너 함수에서 event.params 로 접근할 수 있구요.

두번째로 보셔야 될 부분은 event.sceneName 변수 입니다. 이것은 overlay scene의 이름을 나타냅니다. 이 변수는 overlayBegan과 overlayEnded 이벤트에서만 접근 가능합니다.

좀 더 자세한 사용법과 신택스는 storyboard.showOverlay() 문서를 봐 주세요.

storyboard.hideOverlay()

View Documentation

이 함수는 이름만 봐서도 어떤 일을 하는지 알 수 있겠죠? 그런데 한가지 알아두셔야 할 중요한 사항이 있습니다. 이것은 현재 보여지는 overlay를 hide 해줍니다. 하지만 그 이상의 무엇인가가 또 있습니다.

디폴트로 overlay scene은 완전히 remove 될 겁니다. (purge되고 메모리에서 그 모듈이 unload 될 겁니다. 현재 load된 scene이 일반적인 scene이고 overlay로 사용되고 있지 않다면요) 옵션으로 이 함수로 overlay scene을 간단하게 purge 시킬 수도 있습니다. 이것은 조만간 이 화면을 다시 사용하려고 할 때 유용하게 이용될 겁니다.

storyboard.showOverlay() 함수가 있는데요. 이 함수에서 storyboard.gotoScene()에서 사용할 수 있는 화면전환 효과도 사용할 수 있습니다.

좀 더 자세한 사용법과 신택스는 storyboard.hideOverlay() 문서를 참조하세요.

Important Notes

overlay scene과 관련해서 몇가지 알아 두셔야 할 점들이 있습니다.

첫번쨰로 한번에 단 한개의 overlay 화면만이 보여질 수 있습니다. 여러분이 storyboard.gotoScene(), storyboard.removeAll(), storyboard.purgeAll() 을 call 하거나 다른 overlay scene을 보여주려고 시도한다면 현재의 overlay scene은 remove 될 겁니다. 이 overlay scene은 그 이전에 있던 오리지널 scene에 종속돼 있는 것입니다.

또 다른 중요한 사항은 overlay scene들을 어떻게 call 하느냐에 대해 주의하셔야 합니다. 예를 들어 시간을 좀 delay 시킨 후 overlay를 보여준다면 화면전환 효과는 이 time delay가 끝날 때까지 일어나지 않을거라는 겁니다. 그리고 오리지널 scene에서 display.gotoScene()을 하기전에 이 overlay를 remove 해 주셔야 합니다.



반응형


반응형

Working with Time: Delays and Counting 

Posted by Jonathan Beebe

time 을 사용하는 앱이나 게임은 무수히 많습니다. 몇 초 후에 어떤 일이 일어나게 하던지 유저가 얼마 안에 특정 일을 끝내게 해야 한다던지 같은 시간을 컨트롤 해야 할 일들은 많습니다.

Corona SDK에서는 이러한 time을 빠르고 쉽게 콘트롤 함으로서 게임이나 앱의 개발에 도움을 줄 수 있는 가이드를 제공하고 있습니다.

이 튜토리얼에서는 코로나의 아주 유용한 timer.performWithDelay() 함수에 대해 소개하려고 합니다. 그리고 이 함수를 가지고 여러분의 앱에서 간단하게 활용할 수 있는 방법도 알려 드리겠습니다.

Time Delays


timer.performWithDelay() 는 특정 시간 이후에 특정 동작을 행할 수 있도록 해 줍니다. 이 함수 이름만 봐도 이 함수가 뭘 하는지 쉽게 짐작하실 수 있을 겁니다.

아래 신택스가 있습니다.

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


여러분이 이 함수를 call 했을 때 여러분은 얼마동안 delay 하는지에 대해 정해 주시면 됩니다. (단위는 밀리세컨드입니다.) 그리고 그 지정된 시간이 다 됐을 때 불리워질 함수를 넣으시면 됩니다. 옵션으로 이 작업을 몇번이나 반복해서 수행하는지도 iterarions 에 숫자를 넣어서 정해 주시면 됩니다. 디폴트는 1 입니다.

What are iterations?

timer iteration은 이 timer.performWithDelay 를 몇번 수행할지 정해 주시는 부분입니다. 이 숫자를 0으로 지정하시면 이 timer를 remove 하거나 앱을 종료할 때까지 무한으로 반복합니다.


다음에는 timer.performWithDelay() 함수와 함께 anonymous 함수를 어떻게 사용할 수 있는지에 대해 알려드리겠습니다.





Using a function

아래 예제에서는 1초 후에 hello_world() 함수를 call 하는 것을 단 1회 시작하도록 코딩 했습니다.

local function hello_world()
  print( "Hello world!" )
end

timer.performWithDelay( 1000, hello_world, 1 )


hello_world vs. hello_world()

계속 진행하기 이전에 많은 개발자 분들이 혼동하시는 부분에 대해 명확히 밝히고 넘어가겠습니다. 위 예제에서 timer.performWidhDelay() 함수의 두번째 인수로 hello_world() 를 사용하지 않고 hello_world 를 사용한 점입니다.

그 이유는 이것은 존재하는 함수를 단지 참조하라고 알려주는 것이라서 입니다. 그래서 우리는 그 함수의 변수명(variable name)을 사용하면 되는 겁니다. 만약에 여기에 hello_world()를 사용한다면 이 함수를 실제로 call 하게 되는 겁니다. 그러면 hello_world() 함수에서 return 되는 값에 따라 그 다음 동작이 일어날 수도 있고 안 일어 날 수도 있습니다. 기본적으로 함수의 디폴트 return 은 nol 이기 때문에 그렇게 하면 문제가 발생할 수가 있습니다. 그래서 함수명이 아니라 변수명을 사용하시는 겁니다.


Using anonymous functions

timer.performWithDelay() 함수의 두번째 인수가 함수가 들어가는데요. 여기에 anonymous 함수를 사용할 수도 있습니다. 그냥 이 부분에 함수를 구현하실 수 있다는 애기입니다. 아래 예제에서 보시는 대로 두번째 인수에 이 함수를 구현하시면 됩니다.

timer.performWithDelay( 1000, function()
  print( "Hello world!" )
end, 1 )


물론 이것을 1라인으로 만들 수도 있지만 이것이 함수인것을 좀 더 이해하기 쉽도록 하기 위해 저렇게 줄을 나눴습니다.

이 anonymous 함수를 사용하실 때 알아두셔야 할 점은요. 쉼표 (,) 사이에 전체 함수 (function() 에서 end 까지)가 들어가야 한다는 것입니다. 그래야지 timer.performWithDelay()는 이 인수가 valid 하다고 판단합니다.

좀 더 자세한 정보는 1년전에 Eric Wing이 작성한 using closures as function callbacks 튜토리얼을 보시면 아실 수 있을 겁니다.

Passing Arguments to the Listener

timer.performWithDelay()를 사용하면서 많이 나오는 질문이 호출하는 함수에 어떤 인자를 전달할 수 있느냐 입니다.

이것을 구현하는 방법은 아래와 같이 하시면 됩니다.

local function hello_world( arg1, arg2 )
  print( "Hello world!", arg1, arg2 )
end

timer.performWithDelay( 1000, function()
    hello_world( "first", "second" )
end, 1 )


어떻게 하는지 아시겠죠? timer.performWithDelay() 안에서 anonymous 함수를 사용해서 그 함수에서 외부 함수를 인수와 함께 호출했습니다.
좀 헛갈리시나요? 몇번 해 보시면 금방 익숙해 지실 겁니다.

Other functions

timer 함수는 timerId를 return 합니다. 그래서 다른 함수가 이 timerId를 가지고 어떤 동작을 하도록 컨트롤 할 수 있습니다. timer 함수에는 timer.pause, timer.cancel(), timer.resume() 등의 메소드가 있습니다. 이 메소드들은 이름만 봐도 어떤 일을 하는지 알 수 있겠죠? 자세한 내용은 timer API reference page 를 참조하세요.

Counting Time


앞서 얘기했듯이 앱에서 이 time을 컨트롤 해야 할 상황이 아주 많습니다. 예를 들어 게임을 시작하는 시간과 끝나는 시간을 한번 catch 해 봅시다.

이 게임을 시작하는 부분에 아래 코드를 넣습니다.

local markTime = os.time()

os.time()
이 함수는 현재의 시간을 return 합니다. (위와 같이 아무런 인자 없이 call 했을 경우) 이외에도 더 많은 기능이 있는데요. 그 기능은 여기를 참조하세요.



사용자가 game over 상태에 이르렀을 때 아래 코드로 게임 시간이 얼마나 길었는지를 얻어낼 수 있습니다.

local timePassed = os.time() - markTime


처음 시작했을 때의 시간이 markTime 이니까 끝날 때의 현재시간 (os.time()) 에서 markTime을 빼면 게임 시간이 나오겠죠? 여기서 timePassed 는 초단위로 값을 갖고 있습니다. 분단위로 표시하고 싶으면 이 값을 60으로 나누면 되겠죠. 밀리세컨드로 하려면 1000을 곱하면 되겠구요. 밀리세컨드로 곧바로 값을 받을 수도 있습니다. system.getTimer()를 이용하시면 됩니다. 이용하시는 방법은 위와 똑 같구요.

Time’s up!

이제 여러분은 timer.performWithDelay() 함수를 사용하시는데 프로가 되셨습니다. 그리고 여러분의 앱에서 어떻게 time을 관리해야 하는지에 대해서도 이해하셨을 겁니다.

time 과 관련된 다른 함수들들을 더 이해하고 싶으시면 os.clock(), os.date(), os.difftime(), system.getTimer() 함수들을 보시면 더욱 더 유용하게 여러분의 앱에서 time을 컨트롤 하실 수 있을 겁니다.

반응형


반응형

이번주에도 Corona SDK 에서 금주의 SDK FAQ 5개를 올렸습니다.

이 내용 번역해서 같이 공유 합니다.


FAQ Wednesday

Posted by Tom Newman 

수요일 입니다. 오늘도 자주 들어오는 5개의 질문을 골라서 답변해 드리겠습니다.

Question 1

코로나에서는 PNG 나 JPG 어떤 이미지를 써야 하나요?

Answer

이미지의 화질이나 앱 패키지의 사이즈 등에 따라 다를 수 있습니다. 코로나는 32비트 PNG 와 32비트 JPGs를 지원합니다. PNG는 손실없이 압축하면서도 투명 효과를 지원하고 JPG는 압축되지만 약간 손실이 있고 장점은 광범위한 Color range를 지원합니다. 같은 해상도에서 PNG는 일반적으로 JPGs 보다 사이즈가 큽니다. 이건 여러분의 앱 용량 제한 조건에 영향을 줄 수 있습니다.

texture 메모리 사용량에 대해  PNG와 JPG는 모두 같은 용량의 openGL 메모리를 차지합니다. 왜냐하면 이미지는 메모리에 로드됐을 때는 압축되지 않기 때문이죠. 또 한가지 알아두셔야 할 것은 이미지는 openGL 메모리에 로드됐을 때는 2의 제곱으로 (2, 4, 8, 16, 32, 64, 128, 256, 512, etc.) 로드 됩니다. 만약 여러분이 320*480, 280*400 두개의 이미지가 있을 때 이 이미지는 모두 512*512 만큼의 texture memory를 소비한다는 겁니다. 769*1024 이미지는 1024*1024 byte를 소비할 겁니다.





Question 2

가끔 began touch 이벤트는 있는데 ended 이벤트는 없는 경우가 있는데 왜 그런가요?

Answer

그런 현상은 버그가 아닙니다. 이런 일이 어떻게해서 일어나는지 그리고 어떻게 처리해야 하는지 개발자로서 잘 알아 두실 필요가 있습니다. touch 에는 began과 ended 이벤트가 있습니다. display object에 touch 리스너를 생성하셨다면 그 object를 touch 하면 일반적으로 began, moved, ended 이벤트를 받게 됩니다. 그리고 그 리스너를 어떻게 구현했는지 그리고 유저가 그 object에 대해 touch를 어떻게 발생했는지에 따라 touch 시에 특정 이벤트가 missing 될 수 있습니다.

아래 코드는 circle object에 대해 간단한 방법으로 touch 리스너를 단 예제입니다.

local circle = display.newCircle( 100, 100, 50 )

-- Touch listener
local function myTouch( event )
    print( "Touch event = " .. event.phase )
end

circle:addEventListener( "touch", myTouch )


만약 유저가 원을 터치하고 손을 떼면 리스너는 began과 ended 이벤트를 call 할 겁니다. 또 만약 손가락을 떼지 않고 화면에서 움직이면 moved 이벤트가 나올 겁니다.

유저가 그 원을 터치하고 움직이다가 원을 벗어났다고 생각해 봅시다. 그럴 경우에는 began 과 moved 이벤트만 생성되고 ended 이벤트는 생성되지 않을 겁니다. 왜냐하면 손가락을 뗀 행위는 그 원안에서 일어나지 않았기 때문입니다.

그러면 ended 이벤트는 어디로 갔을 까요? 답은 다른 object 리스너로 갔다 입니다. Runtime touch 리스너나 원이 아닌 다른 object 의 리스너로 간거죠.

그러면 그 다른 object의 이벤트는 어떨까요? 그 object에는 moved와 ended는 있지만 began이 없겠죠? 왜냐하면 touch 이벤트가 한 object에서 시작해서 그 object 를 떠나서 다른 object에서 마감을 했기 때문입니다.

만약 한 object에서 이벤트가 시작됐을 경우 그 이벤트의 끝이 그 object에서 작동하게 하려면 setFocus 를 쓰시면 됩니다.

local circle = display.newCircle( 100, 100, 50 )

-- Touch listener
local function myTouch( event )
    print( "Touch event = " .. event.phase )
  
    if "began" == event.phase then
        display.getCurrentStage():setFocus( circle )  -- set touch focus on circle
        event.target.focus = true
    end
  
    if "ended" == event.phase or "cancelled" == event.phase then
        if event.target.focus ~= true then
            return false
        end
        print( "Ended found" )
        display.getCurrentStage():setFocus( nil ) -- clear touch focus
        event.target.focus = false
    end

    return true
end

circle:addEventListener( "touch", myTouch )


이 예제에서 setFocus는 began 일 경우에 설정을 했습니다. 그리고 ended에서 이 setFocus를 해제를 했죠. 이러한 방법으로 해당 객체에서 이벤트가 시작됐으면 그 이벤트가 그 객체 밖에서 종료하더라도 해당 객체에 ended 가 적용되도록 만들 수 있습니다.

아래 문구에 대해서 주의 깊게 살펴 보실 필요가 있습니다.

event.target.focus = true

이 코드가 began 에서 사용됐죠 그리고 ended 에서도 false로 할당 하느라고 사용했습니다. 바로 이 코드가 해당 object에서 리스너가 일어나고 끝날 수 있게 컨트롤 해 주는 겁니다.

좀 touch에 대해 좀 더 자세히 알고 싶으시면 Detecting Touches in Corona 튜토리얼을 보시기 바랍니다.

Question 3

코로나에서 하수를 정의하는 두가지 방법에 대해서 봤습니다. 어떤게 올바른 건가요? 그리고 그 둘의 차이점은 뭔가요?

Answer

함수는 두가지 방법으로 생성하실 수 있습니다.

local function myfunc1()
    print( "function = ", myfunc1 )
end

and
local myfunc2 = function()
    print( "function = ", myfunc2 )
end


두개 모두 대부분의 경우 잘 동작합니다. 그런데 두번째의 경우에는 이 함수 내부에서  function name을 참조하는것이 필요한 경우에는 작동하지 않습니다. 왜냐하면 이 함수 변수인 myfunc2는 이 함수가 정의 되기 전까지는 아직 생성된게 아니니까요. 첫번째의 경우에는 함수 변수 myfunc1은 이 함수가 정의되기 이전에 생성된 겁니다. 그러니까 이 함수 내부에서 참조될 수가 있습니다. 위 두개의 코드를 시뮬레이터에서 실행하시면 첫번째는 myfunc1 값을 보실수 있지만 두번째는 nil을 보시게 될 겁니다.

myfunc1 함수는 아래와 똑 같습니다.

local myfunc1
function myfunc1()
...
end


저는 myfunc1 방식으로 함수를 사용하는 편입니다. 왜냐하면 저한테는 이게 더 전통적이라고 느껴지거든요. 그리고 함수 안에서 그 함수를 참조할 때 nil 값을 받을 염려도 없구요. 하지만 글로벌 함수로 이용한다면 두 함수 모두 똑 같습니다.

Question 4

config.lua 에서 스크린 사이즈를 640*960 (iPhone 4) 로 설정했습니다. 그랬더니 iPhone 3 에서는 이미지가 작게 나와요. 왜 그럴까요?

Answer

만약 여러분이 디바이스의 표준 해상도보다 큰 이미지를 로드하기 위해 display.newImage를 사용하신다면 이 이미지들은 config.lua 파일에 세팅된 width/height 에 근거해서 dynamic 하게 scale이 조절되기 전에 screen에 맞게 먼저 조절 됩니다. 예를 들어 600*100 픽셀짜리 이미지를 iPhone3 (320*480) 에 표시한다고 합시다. 이 이미지는 dynamic하게 scale 되기 전에 화면에 맞게 먼저 이미지가 작아질 겁니다. 이래서 iPhone4에 맞추면 iPhone3에서 이미지가 작게 보이는 이유입니다. 이것을 해결하려면 display.newImageRect (위의 경우에는 이미지 사이즈를 600*100으로 하시면 되겠죠)나 display.newImage와 isFullResolution flag를 true로 세팅하시면 됩니다. 이렇게 하면 native screen size에 근거해서 이미지가 scaling 되는 것을 건너 뛰게 해 줍니다.

Note : iPhone4에서 scale down 하기 위해 320*480 보다 큰 이미지를 사용하면 display.newImage에서 에러가 발생하는 버그가 있었습니다. 이런 현상은 dynamic scaling이 적용 되던 안되던 발생했습니다. 이 버그는 Daily Build 2012.788 에서 해결 됐습니다.

좀 더 자세한 정보는 Dyamic Image Resolution 을 참조하세요.

Question 5

iOS5 환경에서 코로나는 audio 관련 버그가 좀 있었습니다. 왜 애플과 관련해서계속 버그가 나오죠?

Answer


가끔 코로나의 버그들은 operating system 에서 발견된 버그에 기인하는 경우가 있습니다. 그 문제와 관련해서 해결책을 찾기위해 노력중입니다. 일단 최선의 방법은 그 OS에서 버그를 해결하는게 되겠죠. iOS5에서는 해결하기 어려운 openAL audio 버그들이 좀 있습니다. 저희들은 포럼들에 버그 메세지가 올라오는 것을 보고 그 버그를 지속적으로 수정하고 있습니다. 그리고 그 버그 해결과 관련한 글을 그 포럼들에 댓글로 답해주고 있습니다. 그리고 그 버그들을 정리하고 있습니다. 또 애플에 report를 하고 있구요.  더 많은 유저들이 이 버그에 대해 레포트를 한다면 애플에서 이 버그를 근본적으로 해결할 가능성이 커 지겠죠. Ansca 말고는 아무도 이 버그 레포트를 하지 않는다면 이 문제는 근본적인 해결이 어렵겠죠.

좀 더 자세한 정보와 애플 버그와 관련된 정보는 Apple Bug Reporter 에서 보실 수 있습니다.


 
 

반응형


반응형

지난주에 이 블로그에 댓글에 올리신 몇분의 질문을 Corona SDK 측에 모아서 보냈었습니다.

아침에 올렸는데 바로 그날 저녁때 답변이 왔었죠?


이번주에도 여러분들이 보낸 질문을 정리해서 Corona SDK 측에 보냈습니다.


댓글로 올라온 질문도 있고 방명록을 통해서 받은 질문도 있고 메일로 받은 질문도 있습니다.


답변이 오는 대로 정리해서 올리겠습니다.


오늘 보낸 메일과 질문 내용은 아래와 같습니다.

제가 질문을 잘 이해 못해서 그리고 영어가 좀 짧아서 충분히 Corona SdK 측에 내용을 전달 못한것이 있을 수도 있습니다. 그점은 제가 능력이 부족해서 이오니 이해해 주시기 바랍니다.





========= Corona SDK 에 보낸 메일 ==========


Dear David

I am Changsoo park one of Corona SDK.

Thank you for your quick reply from my question last week.
The people who post the question on my blog said that they are very happy from your quick and helpful reply.

I've got a couple of questions from Corona Developer on my blog in last week also.

Please check it out and reply me if possible.

======= o ===== o ==== o=====

* dk 2012/04/17

Two graphic designers in my company applied for the Corona Level Editor Icon Contest.
I can not get any result and can not see the article also.
Do you have any result?


* ABIZZANG 2012/04/14

Can I set gravities for each objects seperately like Angry bird space with Corona SDK?


* CHOI HANNYONG 2012/04/23

I am developing book app. I have some difficulties to make that one.
(I attached zip file for your reference.)

1. I can not develop the slide transition function with Story board.
   There was 'book' class function in 'Director Class' in recent version.
   Could you provide Slide page transition and page flip function in Storyboard?
   You can see 'book' folder in attached zip file.
   I tried to do this job in storyboard.
   I hope if there are slide page transition and page flip function in storyboard then it will be very helpful for me.

2. It is difficult to develop Scroll fungtion in Storyboard
   You can see magazine_sample. Touch event make slide page transition so it is difficult to add scroll function on it.
   When the image is biger then the screen then I need to use the scroll function.
   If I use touch event for scroll then slide function can not get the touch event.
   You can check the Scroll folder in the zip file.
   So if Storyboard make scroll function automatically if the contents if bigger then the screen then it will be very helpful for the developers who develop book app with Storyboard.
   
3. It is difficult to use Zoom in/out function in the book app.
   Many apps allow zoom in/out of screen.   
   The PinchZoomGesture provide the code in main.lua.
   When I tried to use the code in Storyboard, it is very difficult to do that.
   And there should be page slide transition and scroll function with the Zoom in/out function.
   That make me so difficult to develop it.
   Could you advice please?
   
   There are a couple of things what I faced as difficulties.
   
   a. User tried to zoom in when text is too small, then the images and the buttons on the screen also should be zoom in.
      It is very diffucult to do the job in magazine_sample, director class.
  Can I develop page slide transition and scroll function with zoom in/out?
 
   b. When user zoom in the screen then scroll function should be provided automatically. If it comes nomal then the scroll function should be invisible.
 
   c. when scroll reached end of the contents then I'd like to show user the next page.
   
   So how can I develop these sort of functions? Please help me.

===== o ===== o ====== o =====

Thank you very much 

Changsoo (Douglas) park


========= 원래 질문 내용 ========

dk 2012/04/17
저희 회사 디자이너 두분이 응모했는데,
딱히 결과 발표 이야기가 없네요? 공모 원문은 사라진 것으로 보이는데
혹시 어떻게 되었는지 아시나요?


어비짱 2012/04/14
제가 많이 부족한 탓에 다시 들렀습니다. 헤헤~

궁금한게 있는데요. 물리엔진에서 중력을 설정할때 일정 구역만 다른 중력으로 코로나에서 설정이 가능한가요?

예를 들면 앵그리버드 스페이스에서처럼요.

물리엔진으로 게임을 하나 만들고 싶은데요 이게 가능하면 좋겠네요.



최한뇽 2012/04/23

1. StroryBoard에서는 swipe 기능이 지원되지 않는다. 지원필요합니다.

   그리고 API 모듈의 내부를 알 수 없어 접근이 용이하지 않습니다.

   Swipe 기능은 슬라이드 구조처럼 밀거나 당겨서 슬라이드 페이지를 넘기는 효과입니다.

   DirectorClass에서도 없다가 Book이란 Class 함수가 추가되면서 구현이 되었죠.

   요즘 전자책들은 Page flip 효과보다는 swipe기능을 많이 사용합니다. ibook Author에서도 사용합니다.

   혹시 몰라 첨부된파일에 Book이란 폴더를 실행해 보시면 알게 됩니다. ( magazine_sample 은 Storyboard 사용) 

  즉, StroryBoard에서는 swipe 기능 및 Page flip 기능이 추가되고,

   StroryBoard.lua 파일도 제공이 되었으면 좋겠다.(개발자 참조용, widget.lua 등)

 

2. StroryBoard에서는 Scroll 기능추가 적용이 어렵다. 

    이유는 제가 만든 magazine_sample 에는 이미 터치로 페이지전환을 시도합니다.

    그 부분에 스크롤 기능을 추가시 어려움이 많습니다. 

    우선 해당 페이지에 배경그림이 큰 경우에는 가로 세로 스크롤이 되어야 하며, 그럴 경우 스크롤영역으로 터치이벤트가 

    가 실행시에는 페이지전환에 대한 이벤트의 처리가 안먹게 됩니다. ScrollView를 만들때 이미 그룹으로 영역을 지정하게

    되므로 그 영역에 지정된 스크롤뷰의 이벤트를 먹게 됩니다. (첨부의  ScrollView 폴더 참조)

    또한 페이지에 중복으로 스크롤을 잡는경우도 아주 복잡합니다.

     즉, StroryBoard에서는 컨텐츠에 따라 자동으로 Scroll(가로,세로) 기능추가가 되어야 한다.

 

3. Zoom 기능을 책에 도입시 어려움이 많습니다.

   아이폰이나 안드로이드폰에서 인터넷을 사용해 보았을 것입니다. 즉, 글자가 적으면 Zoom 기능이 되어 확대,축소가 됩니다.  Corona 샘플은 main에 적용을 한것인데 이 부분을 스토리보드가 적용된      magazine_sample , director class 에 적용된 book 소스에 적용하는데 어렵습니다. 페이지 개념과 스크롤기능이 자동으로 추가가 되어야 하기 때문에 어렵습니다.

 

Zoom으로 확대 및 축소를 할 경우,

1) 페이지내에 글씨만 존재하지 않고 그림도 있을 수 있으며, 또한 버튼도 있을 수 있습니다. 그래서 그룹을 지정하여 

   확대 및 축소를 하려고 합니다. 그런데 그럴경우 Zoom의 영향을 받는 곳이 최상단좌측에서 부터 진행이 됩니다.

   (코로나 샘플은 배경만 확대축소 할 경우 가운데 지점부터 확대 축소됨) 

 

2) 확대가 되면서 자동으로 스크롤이 지정되어 상하좌우 이동이 가능해야하고, 원래 사이즈인 경우는 스크롤영역이

   없어져야 합니다. 즉, 자동 스크롤 영역이 되어야 합니다.

 

3) 확대가 된 페이지가 되었을때도 스크롤 영역이 한계에 갔을 경우 페이지 전환을 하는 터치 이벤트가 실행이 되어야 합니다.

 

 즉, StroryBoard에서는 기본으로 Zoom 기능이 내장되어야 하며, 자동으로 Scroll(가로,세로)이 반응해야 한다.


================================================================================


반응형


반응형

코로나에서 지난 주부터 Corona SDK Ambassador 의 글을 하나씩 받아서 웹 싸이트 블로그에 올리겠다고 했습니다.

첫 글은 미국에서 코로나 SDK 책을 펴낸 Dr. Brian G. Burton 의 글입니다.

질문과 답변 형식으로 돼 있네요. 질문은 굳이 번역하지 않았습니다.

여러분들에게도 도움이 될 수 있을 것 같아 제 블로그에 올립니다.

==== o ==== o ==== o ==== o ====

Q&A with Dr. Brian G. Burton, Corona Ambassador

Dr. Brian G. Burton, Ed.D.은 Burton’s Media Group의 대표이고 Abilene Christian University의 교수이며 코로나 명예 대사 중 한명 입니다. 또한 그는 "코로나로 모바일 앱 개발하기 , Mobile App Development with Corona: Getting Started" 책의 저자이기도 합니다. 이 책은 코로나를 이용해서 모바일 앱과 게임을 개발하는 것을 도와주는 가이드죠.

Dr. Burton 당신의 얘기를 공유해 줘서 고맙습니다.

==== o ==== o ==== o ==== o ====




What is your background and experience in development?

몇몇의 코로나 개발자들 처럼 저는 1980년대에 시작했습니다. 고등학교 때 TRS-80(1977년에 발표된 Radio Shark 사의 개인용 컴퓨터)이 나왔습니다. 완전 매료 됐죠. 그 컴퓨터가 완전 유행이라는 말을 계속 듣긴 했지만 저는 안정적인 GM의 공장 일을 하는 직업을 선택해야만 했습니다. 그러다가 Ball State University 에서 Computer Science과 Management Information Systems을 공부하기로 결심했죠. 그러면서 저는 원래 계획했던 실리콘 밸리로 가는 것보다 진짜로 제가 가르치는것을 좋아하고 있다는 것을 깨달았습니다. 나는 중고등 학교때 computer science를 생각 했었습니다. 재가 그것을 석사 과정을 할 때 우리 가족들은 미주리주로 이사했습니다. 그리고 Ozark Mountains 와 사랑에 빠졌죠.

제 석사와 박사 과정을 할 때 computing을 할지 education을 할 지 정말 고민이 많이 됐었습니다. 그래 둘 다 같이하자! 컴퓨터 쪽을 가르치면 둘 다 만족할 수 있을 것 같았습니다. 석사 과정을 할 때 Freshman level 컴퓨터 코스를 가르치라는 제의를 받았습니다. 동시에 당시 제가 약간 인기가 있어서 college level에서 full time으로 가르치지 않겠느냐는 제의도 받았습니다. 제가 박사과정을 마쳤을 때 당시 14살이던 제 아들이 게임 디자인과 개발을 공부하고 싶다고 얘기하더라구요. 그게 2004년 이었습니다. 그 당시에는 그렇게 명망있는 게임이 없었습니다. 미주리 주립대학에서 Jeff Huff와 같이 일하는 동안 우리는 game level design 전공을 시작했습니다. 거기서는 프로그래밍과 그래픽 디자인을 가르쳤습니다. 그 강좌는 중부 미주리에서 인기있는 강좌가 됐습니다.

How and why did you become interested in developing mobile apps?

2007년 그 게임 개발 강좌가 성공했다는 것이 알려져 Alma Mater가 텍사스로 옮겨서 그런 강좌를 시작하는게 어떻냐고 제의를 했습니다. 이 시기는 애플 (Apple) 이 iPod Touch와 첫번째 세대 iPhone을 내 놓은 시기였습니다. 저도 어얼리 어답터 중의 한명이었습니다. 그래서 2009년 모바일 앱 개발 강좌를 가르치기 시작했습니다. (스탠포드가 그들의 첫번쨰 코스를 가르친 후 단 몇 주 후의 일이었습니다). 그 코스는 아주 성공적이었습니다. 그래서 그 강좌는 곧바로 정규 강좌로 채택 됐습니다.

2010년대 초 저는 제 학생들과 첫번 째 앱을 개발했습니다. iPad에서 학교 신문을 보여주는 앱이었습니다. (iPad 는 토요일에 나왔고 그 앱은 바로 다음 월요일에 선보였습니다) 그 프로젝트 이후로 학급에서는 꾸준히 다른 앱을 개발하자는 요구가 이어졌습니다.

How did you learn about Corona and what do you like about it?

2010년 초 앱을 개발하는데 좀 더 좋은 방법이 있다는 것을 알게 됐습니다. 저는 iOS 와 안드로이드에서 동시에 동작하는 모바일 앱이나 게임을 만들고 싶었거든요. 그렇게 할 수 있는 툴이 없을까 찾다가 보니까 그런 방법을 고민하는 그룹들이 별로 안 된다는 것을 알았습니다. iOS와 안드로이드 앱이나 게임 개발을 동시에 지원하는 회사는 오직 Ansca Mobile의 Corona 뿐이었습니다. 그래서 이 코로나를 한번 배워보자고 생각했습니다. 금방 매료가 됐죠. 여름 방학동안 제 블로그에 이 툴을 어떻게 사용하는지에 대한 정보를 올렸습니다. 그리고 그해 가을 그것을 거의 1/3 학기 동안 가르쳤습니다. 학생들은 코로나에 대해서 좀 더 보여주길 바랬죠. 그래서 금요일 수업은 코로나에 대해서만 공부하기로 했습니다. 그 클래스 프로젝트로 우리는 Space Explorer 의 초기 버전을 개발했습니다. (이 앱에 대한 내용은 제 책 9장과 10장에 있습니다.)

지금은 코로나로 인해서 컴퓨터 관련 학과 이에의 곳에서도 모바일 앱과 게임 개발 클래스를 해 달라는 제의를 받고 있습니다. 저는 코로나가 누구에게나 앱과 게임 개발을 가능하게 할 거라고 믿습니다.

What interesting projects have you worked on (Corona and non-Corona related)?

작년에 저는 제 클래스에서 사용할 코로나에 대한 책이 하나도 없다는 것이 문제라는 생각을 했습니다. 그래서 책을 쓰기로 작정했죠. 결과적으로 저는 두개의 책을 썼습니다. 하나는 학과 수업을 위한 것이구요. (Beginning Mobile App Development with Corona) 다른 하나는 제 학부 학생 뿐만 아니라 모든 분들을 위한 책입니다. (Mobile App Development with Corona: Getting Started)

말씀드리고 싶은 것은 이 책을 쓰기 시작했을 때는 단지 제가 가르치는 강좌를 위해서 였습니다. 처음에는 일반인을 대상으로 한 책은 염두에 두지 않았습니다. 그런데 하루는 학부 교재를 출판하는 회사의 영업사원이 제 사무실에 들렀습니다. 그 때 제가 그 책을 썼다고 말했죠. 48시간 만에 저는 계약 제안을 받았습니다. 그 책을 쓰고 그것을 지원할 웹 사이트를 만들고 그리고 몇가지 더 일을 해 달라는 것이었습니다. 그들은 책 판매의 10%를 주겠다고 했습니다. 그리고 다른 몇몇개의 출판사에서 비슷한 제의를 받았습니다. 그 때 저는 제가 쓴 책이 다른 사람들이 읽고 싶어 하는 내용일 수도 있겠구나 라는 생각을 했습니다.

그러다가 이런 생각이 들었습니다. 애플이나 아마존이나 구글에 앱을 출판하면 70%를 받는데 왜 이 책을 쓰고 70%보다 훨씬 못한 돈을 받아야 하나? 그래서 별도로 독립적인 루트를 통해서 출판을 하기로 결심했습니다. 출판사랑 같이 하면 훨씬 더 많은 광고를 할 수 있다는 걸 압니다. 하지만 저는 인디 작가, 인대 앱 개발자가 되는것이 훨씬 행복합니다. 그리고 또 가격도 낮출 수 있구요. 여러분이 제 책을 구매해 주시면 저의 indie work를 도와 주실 수 있습니다.

What projects are you working on next?

Beginning Mobile App Development with Corona를 집필하고 있을 때 몇가지 중요한 일들이 일어났습니다.

1) 모바일 앱 개발이 몇개 주에서 고등학교 수업 과정이 되었습니다.
2) 아주 많은 사람들로부터 모바일 앱과 게임을 개발하고 싶다는 말을 많이 들었는데 어떻게 해야 하는지를 모르고 있었습니다.
3) 제 웹사이트에 단지 코딩 하는 법만 올리는 대신 게임을 만들기 위한 전체 개발 과정에 대해서 알려달라는 요청을 많이 받았습니다.
4) Beginning Mobile App Development with Corona를 다른 나라 말로도 출판 해 달라는 부탁을 많이 받았습니다.

이러한 것들은 저를 지금 현재 하고 있는 몇가지 아주 신나는 프로젝트로 안내했습니다. 첫번째로 새로운 책을 시작했습니다. Learning Mobile Application Development 이 책은 모바일 앱과 게임 프록래밍을 배우기 원하는 프로그래밍 경험이 전혀 없는 사람을 위한 책입니다. 이 책은 고등학생이나 대학을 준비하는 혹은 프로그래밍 경험이 전혀 없는 사람들에게 맞도록 만들고 있습니다. 이 책은 2012년 여름에 나올 겁니다.

두번쨰로 저는 게임을 개발하기 위한 전체 과정에 대해 가르칠 수 있는 책 시리즈를 만들기 위해 몇명의 게임과 그래픽 아티스트 (14살 밖에 안 된 내 아들도 포함해서) 들과 일을 하고 있습니다. 이 시리즈 중 첫번째 책은 2012년 봄에 나올 겁니다.

마지막으로 저는 중국어,한국어,이탈리아어, 포르투갈어, 러시아어 그리고 스패니쉬어로 Beginning Mobile App Development with Corona를 번역하는 작업을 몇몇의 코로나 개발자들과 하고 있습니다.

그리고 제 여가시간에는 개인적으로 앱을 개발하고 있기도 합니다.


반응형

Corona SDK 수요일의 FAQ

2012. 4. 22. 01:12 | Posted by 솔웅


반응형

지난주부터 코로나에서는 새로운 블로그 코너를 만들었습니다.


매주 Corona SDK 웹사이트의 포럼이나 댓글에 달린 질문 중에 자주 질문되는 것 몇가지를 골라서  답을 주는 그런 코너입니다.


지난주 수요일에는 5가지가 올라와 있는데요.


저나 여러분한테도 도움이 될 것 같아 이렇게 번역해서 글을 올립니다.


====== o ==== o ==== o =====


FAQ Wednesday  

Posted by Tom Newman

이 블로그 포스트는 새로운 시리즈인데요. 매주 수요일 코로나 댓글이나 포럼등에서 자주 나오는 질문들 (FAQ)을 모아서 이에 대한 답을 올리려고 합니다. 그 질문들은 코로나를 사용하고 계신분들도 있고 아니면 처음 접하시는 분들도 계실 겁니다.

이제 시작하겠습니다.






Question 1

코로나 시뮬레이터를 돌릴 때 코로나 터미널에 print 메세지를 볼 수가 있는데요. Xcode iOS 시뮬레이터나 iOS 디바이스에서 돌릴 때는 print로 찍은 메세지를 볼 수 없습니다. 뭐가 잘못 된 것일까요?

Answer

만약 Xcode를 사용해서 앱을 로드하거나 iOS 디바이스를 테스트 한다면 Xcode 콘솔에서 print 메세지가 display 될 겁니다. Xcode iOS 시뮬레이터를 사용하고 계신다면 Mac의 콘솔앱을 start 하시면 그 메세지를 보실 수 있을 겁니다. 만약 안드로이드 디바이스를 테스트 하신다면 안드로이드 SDK를 다운받아서 adb logcat을 사용하셔야 print 메세지를 보실 수 있습니다.

Tip: 만약 print 메세지를 즉각즉각 확인하시지 못하신다면 main.lua 파일 맨 위에 아래 코드를 붙여 주세요.
io.output():setvbuf('no')


Question 2


display object의 x,y 위치를 세팅하는게 헛갈립니다. 제가 생성할 때의 값이 생성된 이후에도 똑 같은 건가요?

Answer


대부분의 객체들이 x,y 포지션으로 위치를 정의하면 top-left 를 기준으로 위치를 잡습니다 그리고 생성된 다음에는 객체의 중심으로 바꿉니다. 예외 적인 경우는 display.newCircle, display.newLine, display.newGroup 입니다. display.newCircle 객체는 원의 중심을 기준으로 생성됩니다. 그리고 display.newLine은 start와 end 포인트를 사용합니다. display.newGroup은 top-left 포인트를 기준으로 생성되고 생성 된 이후에도 x,y 레퍼런스 포인트가 바뀌지 않습니다. 다른 모든 display object 들은 생성되고 나서 center 기준점을 사용합니다. 이 말은 display 객체의 x,y  파라미터를 변경한다면 그 객체는 객체의 중심을 기준으로 해서 움직일 거라는 겁니다. object:setReferencePoint API 생성 후에 어떤 기준점을 사용할 것인지 정할 수 있도록 해 줍니다.

이런 혼란을 피하기 위해서 프로그래머들은 객체를 처음 생성할 때 (top-left 가 기준일 때) 0,0을 만들어 놓고 나서 생성된 후에 그 객체의 x,y 값을 세팅해 줍니다. 이렇게 하면 그 객체의 x,y 포지션은 (별도로 reference point를 변경하지 않는 이상) center를 기준으로 삼게 된다는 얘기입니다.


Question 3


멀티플 터치 객체들을 사용할 때, 스크린에서 그 객체들이 겹쳐질 때 touch 이벤트가 사용되는 것을 볼 때가 있습니다. 이런 경우 어떻게 stop 시켜야 하죠?

Answer

터치 리스너를 call 하게 되면 그 터치가 일어난 곳의 최상위 객체 (top-most object) 에 그 이벤트가 전달 됩니다. 만약 리스너가 true를 리턴한다면 그 event dispatcher는 그 touch event를 stop 시킬 겁니다. 만약에 리스너가 false를 return 하면 dispatcher는 터치된 위치에 있는 그  다음 객체의 touch listener를 볼겁니다. 이러한 작업은 계속 그 밑으로 밑으로 똑 같이 적용 됩니다. 리스너가 true를 return 할 때까지요. 일반적인 실수로는 return 값을 아예 주지 않는 경우인데요. 그렇게 되면 디폴트로 false가 return 됩니다. 그러니까 그 이벤트를 밑의 object에도 적용시키지 않으려면 항상 이벤트 리스너 마지막 줄에 return true를 해 주셔야 합니다.

Question 4

I’m getting build errors saying the code signing was wrong or invalid entitlements. What can cause this?
빌드할 때 code signing 이 틀리거나 invalid 하다고 나옵니다. 왜 그럴까요?

Answer

빌드할 때 에러가 난다면 코드의 syntax 에러는 아닙니다. build.settings를 지우고 한번 빌드를 해 보세요 그래도 에러가 나는지요. build.settings file이 없을 때 에러가 나지 않으면 build.setting 파일쪽이 문제가 있는 겁니다. 그리고 코로나의 샘플 앱을 한번 빌드 해 보세요. (Hello World 같은...) 그러면 여러분의 프로젝트에 문제가 있는지 없는지 알 수 있을 겁니다. 애플리케이션 이름(폴더 이름)을 test 같은 간단한 이름으로 한번 해 보세요. 그럼 애플리케이션 이름에서 문제가 있는지 없는지 알 수가 있을 겁니다.

Question 5

서브디렉토리에 있는 저의 Lua 코드를 로드하기 위해 require를 사용 합니다. 그리고 코로나 시뮬레이터에서는 잘 돌아 갑니다. 그런데 이것을 제 디바이스에서 돌리면 충돌이 일어납니다. 코로나에서는 서브디렉토리로부터 코드를 로딩하는 것을 지원하나요?

Answer

예 서브디렉토리안에 Lua 코드를 만드실 수 있습니다. 하지만 주의하셔야 할 부분이 있습니다. 코로나 시뮬레이터와 디바이스 사이에는 약간 다른 부분이 있습니다. 첫번째로 require 구문에 있는 파일 이름은 실제 파일 이름이어야 합니다. 일반적인 에러는 실제 파일 이름은 testlib 인데 그 구문에서는 require("Testlib") 이라고 하면 에러가 납니다. 코로나 시뮬레이터에서는 둘 다 작동을 하지만 디바이스에서는 작동하지 않을 겁니다.

두번째로는 subdirectory를 어떻게 표기 했는가 입니다. 맞는 표기는 . 을 사용하는 겁니다. 만약 여러분의 라이브러리 파일이 test.lua 이고 그것이 library 서브디렉토리에 있다면 test = require("library.test") 라고 해야 합니다.

코로나 시뮬레이터에서는 디렉토리 구분자로 . (마침표) 뿐만 아니라 / (슬래시)도 허용합니다. 하지만 디바이스에서는 / 를 사용하면 에러가 날 겁니다. 디바이스에서는 항상 구분자로 . 을 사용해야 합니다. 그러므로 루아 파일의 이름에는 . 가 들어갈 수 없습니다.

한가지 더 말씀 드리자면, 가끔 require 구문을 괄호 없이 사용하는 경우가 있습니다. 이것은 오직 한개의 함수 파라미터만 존재하고 그것이 스트링이거나 테이블일 경우에만 허용됩니다. 그래서 위에 썼던 예제를 이 형식으로 사용한다면 test = require "library.test" 가 될 겁니다.


여기까지가 오늘의 FAQ 입니다. 오늘의 FAQ를 통해서 뭔가 새로운 것을 배우셨기를 바랍니다. 만약 질문이 있으시면 forum들에 올려 주세요. 아니면 댓글에 올려 주시던가요. 여기에 짧게 댓글을 다셔도 됩니다. 하지만 되도록 forum 을 이용해 주실것을 부탁드립니다.

반응형


반응형

Director to Storyboard “Transition” Guide -2-


Switching Scenes

디렉터 클래스나 스토리보드 모두 화면 전환의 목적은 같습니다. 하지만 그 화면의 이면에서는 어떤 일들이 벌어지는지는 완전히 다릅니다. 그 다른 부분 중 어떤 것들은 여러분들이 컨트롤 해야 될 필요가 있고 어떤 부분들은 별로 신경을 쓰지 않아도 되는 부분이 있습니다.

Director Scene Transitions


아래 예제는 디렉터 클래스를 사용해서 scene1에서 scene2 로 전환하는 방법을 보여 드립니다.

-- somewhere in scene1.lua...
director:changeScene( "scene2", "moveFromRight" )


위 코드대로 하면 scene1은 움직여서 보여지지 않고 scene2 가 화면에 나타날 겁니다. moveFrimRIght로 해서 화면은 오른쪽에서 왼쪽으로 옮겨질 겁니다. (이런 화면 전환 효과를 사용하지 않으려면 changeScene의 두번째 파라미터를 없애면 됩니다.) 아래 내용들은 director:changeScene()이 call 됐을 때 화면 뒤에서는 어떤 일들이 일어나는지를 정리한 내용입니다.
   
    - 디렉터가 scene2.lua를 로드하고 제 위치에 위치 시킵니다.
    - 두 scene 모두 최종 목적지로 transition 됩니다.
    - 디렉터는 scene1의 display group이 clean()메소드를 가지고 있는지 체크하고 만약 있으면 메소드를 call 합니다.
    - scene1의 display group이 remove되고 scene1이 unload 됩니다.


아주 간단하고 직관적입니다. 만약 여러분이 디렉터 클래스 사용자라면 위에 정리한 내용이 아주 익숙할 겁니다. 이제 스토리보드에서는 같은 화면전환이면서 그 이면에 어떤 다른 일들이 일어나는지 살펴 보겠습니다.





Storyboard Transitions

아래 스토리보드 API 를 사용해서 scene1에서 scene2로 화면 전환하는 예제입니다.

-- somewhere in scene1.lua...
storyboard.gotoScene( "scene2", "slideLeft" )


아래는 위에서 처럼 gotoScene이 call 됐을 때 화면 뒤에서 어떤 일이 일어나는지를 정리한 내용입니다.

    - scene1 : "exitScene" 이벤트가 dispatch 됩니다.
    - scene2 : 만약 view display group 이 없으면 새로 생성해서 시작 위치에 위치 시킵니다. (시작 위치는 화면전환 효과에 따라 달라집니다.) 그리고 나서 createScene 이벤트가 createScene 이벤트가 dispatch 됩니다.
    - scene2 : 만약 view 가 이미 존재한다면 그것을 시작 위치에 위치 시킵니다.
    - scene2 : willEnterScene 이벤트가 dispatch 됩니다. scene1과 scene2가 제 위치로 이동합니다.
    - scene1 : didExitScene 이벤트가 dispatch 됩니다.
    - scene2 : enterScene 이벤트가 dispatch 됩니다.


아주 많은 것들이 진행 되는 것 같네요. 그것들이 모두 유용한 것들입니다.

위에서 ~event가 dispatch 된다는 것은 그 이벤트를 이용해서 listener 함수를 사용하고 그 안에서 여러분이 어떤 작업을 할 수 있다는 얘기입니다. (뭐든지 필요한 기능을 구현하시면 됩니다.) 너무 복잡하게 느끼실 필요가 없습니다. 스토리보드의 다양한 이벤트를 이용해서 무엇을 구현한다는 것은 필수가 아닙니다. 여러분이 필요한 부분만 사용하시면 됩니다. 만약 여러분이 willEnterScene 이벤트를 작성하지 않았다면 이 이벤트는 dispatch 된 다음게 그대로 cancel 될 겁니다.

Which one should you use?

이 글을 쓴 목적은 디렉터 클래스 대신 스토리보드 API를 사용하라거나 반대로 스토리보드 대신 디렉터 클래스를 사용하라고 설득하기 위해 쓴 것이 아닙니다. 이 글의 목적은 디렉터 클래스의 주요 기능들을 스토리보드 API를 사용할 때 어떻게 사용해야 하는지를 보여드리기 위해 쓴 글입니다.

스토리보드 API는 코로나 SDK에서 화면 관리하는 것을 지원하려고 만든 코로나 SDK의 공식 API 입니다. 그렇다고 해서 여러분이 필요한데도 디렉터 클래스를 사용하지 말고 스토리보드 API를 사용하라는 의미가 아닙니다. 어떤 분들은 간단하게 화면 전환을 컨트롤 할 수 있는 디렉터 클래스를 선호할 것입니다. 그리고 디렉터 클래스는 오픈 소스 스크립트 입니다. 그리고 다른 관점에서 보면 스토리보드를 이용해서 코로나 이벤트 모델을 사용함으로서 좀 더 유연하고 다양한 기능을 사용하기 원하는 분들은 스토리보드 API를 선호할 겁니다.

어느것을 선택하시든 여러분들의 프로젝트에 더 적합한 수단을 사용하시면 되고 이 글을 통해 그 사용 법을 익힐 수 있었기를 바랍니다. 만약 여러분이 디렉터 클래스를 사용하시다가 스토리보드를 사용하시는데 어려운 부분이 있었다면 이 글을 통해서 그 혼란 스러움이 다 가셨기를 바라는 마음입니다.

특별히 스토리보드에 대해 좀 더 알고 싶으시면 이 링크를 클릭하셔서 공식 Storyboard API 문서를 보세요.

반응형


반응형

Director to Storyboard “Transition” Guide -1-

Lights… camera… CUT!

조명... 카메라... 컷!

코로나의 Storyboard API 가 나온지 꽤 됐습니다. 그런에 이 사용법에 대해서는 아직까지 약간의 혼동이 있는 것 같습니다. 최근에 제가 소개해 드린 스토리 보드의 이벤트 에 대한 글이 그 혼동을 해소하는데 약간 도움이 될 수 있을 겁니다. 하지만 스토리보드에 대한 설명은 단 한번으로는 부족할 겁니다.

스토리보드 API 이전에 Corona SDK에서는 scene 관리를 위한 공식적인 솔루션은 없었습니다. 그래서 대부분의 사람들은 Ricardo Rauber의 Director 클래스를 사용 했었죠. scene 관리를 도와주는 정말 대단한 3rd-party 오픈 소스 라이브러리 였습니다. 또한 scene 전환은 여러개의 쿨한 화면전환 효과를 사용해서 구현 할 수도 있었죠. 스토리보드가 나왔을 때 그 디렉터 클래스와는 사용법이 많이 달랐습니다. 그래서 디렉터 클래스 사용자들이 스토리보드를 곧바로 사용하는것은 좀 어려웠었던 것 같습니다.

그래서 오늘 여러분이 Director class를 사용하고 있다면 어떻게 스토리보드를 사용할 수 있는지 간단하면서도 쉽게 설명 드리겠습니다. 그리고 만약 여러분이 director class 유저가 아니라면 곧바로 스토리보드를 배울 수 있는 좋은 기회일 겁니다. 그런 분들은 이 문서를 꼭 보실 것을 권장합니다. (그 곳에는 more information section 있습니다.)





Scene Templates

디렉터 클래스는 오래 전부터 있어 왔습니다. 그 클래스는 꽤 큰 feature set 입니다. 저는 이 튜토리얼에서 module structure와 scene 변환에 대한 기본적인것을 다룰께요.

우선 Director 1.4의 scene template 으로 시작하죠. (이 글을 쓰는 현재 가장 최신 버전입니다.)

template.lua (Director)

module(..., package.seeall)

--====================================================================--
-- SCENE: [NAME]
--====================================================================--

new = function () 
    ------------------
    -- Groups
    ------------------
  
    local localGroup = display.newGroup()
  
    ------------------
    -- Your code here
    ------------------
  
    --- CODE ---
  
    ------------------
    -- MUST return a display.newGroup()
    ------------------
  
    return localGroup
end


디렉터 클래스는 아주 간단하고 사용하기 쉽습니다. (그래서 개발자들이 아직까지 이 방법을 사용하고 있는 이유겠죠). 바로 위에 소개한 scene tamplate 에 대한 설명을 하겠습니다.

new() 함수안에 여러분의 scene과 관련된 코드가 들어갑니다. 그리고 중요한것은 모든 display 객체들은 같은 group에 insert 하셔야 합니다. 그리서 그 그룹이 마지막에 return 되야 합니다. (위 예제에서는 localGroup이 됩니다.)

화면전환 (scene transition)이 발생하면 디렉트 클래스는 현재 화면을 밖으로 보내고 그 다음 화면을 화면으로 불러옵니다. (이 때 화면 전환 효과를 사용하실 수 있습니다.)

화면 전환이 완료 되면 이전 화면은 remove 됩니다. 옵션으로 clean() 메소드를 화면의 group에 추가해도 됩니다. 이것은 화면을 remove 하기 바로 전에 call 됩니다. clean() 메소드는 timer들을 정지시키고 Runtime listener를 remove 하기에 좋은 메소드 입니다. 아래 예제는 이 clean() 에소드가 포함된 경우 입니다.

template.lua (Director)

module(..., package.seeall)

--====================================================================--
-- SCENE: [NAME]
--====================================================================--

local cleanUp = function()

    -- stop timers, transitions, listeners, etc.

end

new = function () 
    ------------------
    -- Groups
    ------------------
  
    local localGroup = display.newGroup()
  
    ------------------
    -- Your code here
    ------------------
  
    --- CODE ---
  
    ------------------
    -- MUST return a display.newGroup()
    ------------------

    -- add clean method
    localGroup.clean = cleanUp
  
    return localGroup
end


Storyboard Scene Template

위의 코드를 스토리보드 API를 사용해서 구현하려면 어떻게 해야 되는지에 대한 예제가 아래에 있습니다.

scenetemplate.lua (Storyboard)

local storyboard = require "storyboard"
local scene = storyboard.newScene()

--------------------

function scene:createScene( event )
    local group = self.view

    --
    -- Create objects here (e.g. scene creation)
    --
end

--------------------

function scene:enterScene( event )

    --
    -- Manipulate objects here (e.g. scene logic)
    --
end

--------------------

function scene:exitScene( event )

    --
    -- Optional cleanup code here
    --
end

--------------------

scene:addEventListener( "createScene", scene )
scene:addEventListener( "enterScene", scene )
scene:addEventListener( "exitScene", scene )

return scene


디렉터 클래스의 new() 함수에 해당하는 스토리보드의 이벤트는 두가지가 있습니다. createScene과 enterScene 입니다. 사실 좀 더 있지만 일단 이 두가지를 보기로 하겠습니다.

스토리보드에서는  self.view 를 사용해서 그 화면의 view display group에 접근 할 수 있습니다. 디렉터 클래스에서 localGroup에 해당 화면의 모둔 객체들을 insert 했듯이요. 스토리보드에서도 그 화면의 모든 객체들을 self.view에 insert 하셔야 합니다. 이것을 하기에 가장 좋은 장소는 바로 createScene event listener 입니다.

위 예제에서 마지막에 있는 이벤트 리스너는 exitScene 이벤트 입니다. 이 부분은 디렉터 클래스의 clean() 메소드와 비슷합니다. 이 함수에서 타이머나 transition들을 정지시키고 Runtime listener들을 remove 시키는 등의 일을 하시면 됩니다.

스토리보드에서는 왜 이렇게 세분화 해서 나눴는지 궁금하실 겁니다. 나중에 설명 드리겠습니니다. 일단 왜 스토리보드에서는 createScene과 enterScene이 나눠졌는지를 알려드릴께요.

It has to do with scene “purging”.

디렉터 클래스와는 다르게 스토리보드에서 화면이 사라질때 그 화면은 자동적으로 remove 되지 않습니다. 그냥 화면 밖으로 사라져 버릴 뿐입니다. 여러분이 purge를 사용해서 그 scene을 따로 remove 시켜야 합니다. remove 되지 않는 다는 것은 그 화면의 객체들이 여전이 메모리에 있다는 얘기고 그러면 그 다음에 다시 그 화면을 불러 올 때 더 빨리 불러 올 수 있다는 얘기입니다. 그래서 자동적으로 remove 시키지 않고 개발자가 따로 함수를 사용해서 remove 시키도록 돼 있습니다.

Caveat : 만약 OS가 메모리가 부족하다는 경고를 보내면 최근에 접근된 화면이 purge 될 겁니다. 이 경우가 유일하게 스토리보드에서 화면이 자동적으로 remove 되는 상황입니다. 다른 경우에는 purge 나 remove 함수를 사용해서 특정 화면이나 이전의 전체 화면을 remove 시킬 수 있습니다. purge나 remove 같은 용어들의 정확한 의미를 아시려면 Storyboard Scene Events를 살펴 보세요.

조금 전으로 다시 돌아가서, 다른 화면으로 전환했는데 이전 화면은 화면에서만 사라지고 실제로는 메모리에 있는 상황을 가정합시다. 그 경우에 그 이전 화면이 다시 call 됐을 때 그 화면의 createScene event는 불려지지 않을 겁니다. (왜냐하면 이전에 이미 불려졌기 때문이죠). 이것이 createScene과 enterScene 이벤트가 둘로 분리된 가장 큰 이유입니다.

위 예제에 있는 것 말고도 여러분들이 사용할 수 있는  몇개의 Storyboard scene event들이 더 있습니다. 이것들을 모든 경우에 다 사용하셔야 된다는 것은 아닙니다. 필요한 경우에 사용하시면 됩니다.

   -  createScene
    - willEnterScene
    - enterScene
    - exitScene
    - didExitScene
    - destroyScene

위 이벤트들에 대한 좀 더 깊은 설명을 보려면 Storyboard Scene Events Explained 글을 봐 주세요. 그 글에는 각 이벤트들이 실행되는 순서를 보여주는 다이어그램도 있습니다. 그러니까 스토리모드의 위 이벤트들에 대해서 이해하시기 어려우시거나 좀 더 확실하게 사용하시려면 위 글을 봐 주세요. 


---- o ---- o ---- o ---- o ---- o ----


다음 글에서는 디렉터 클래스와 스토리보드 API 의 화면전환에 대해 비교해 보겠습니다.


반응형