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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

How to Use Custom Events in Corona

2012. 6. 28. 02:46 | Posted by 솔웅


반응형

How to Use Custom Events in Corona

Posted on . Written by



1년 쯤 전에 (2011년 6월), Corona Event Model 에 대해서 다뤘었습니다. 거기서 코로나에서의 이벤트가 정확히 무엇인지 설명을 했었죠. 이벤트가 발생했을 때 어떻게 여러분이 hook 해서 코로나의 여러 기능들을 적용할수 있는지에 대해서도 다뤘었습니다.

하여간 지난번에는 코로나에서 제공하는 built-in 이벤트들에 대해서 그 API를 주로 다뤘었습니다. 그 때 제가 다루지 않았던 부분은 개발자가 스스로 custom 이벤트를 정의할 수 있다는 것입니다. 그리고 그 이벤트가 발생했을 때 listen 할 수 있다는 것하구요.(개발자 스스로 완벽하게 컨트롤 할 수가 있죠)


이 튜토리얼은 여러분만의 custom 이벤트를 어떻게 정의하고 dispatch 하는지에 대해 알려드릴겁니다.  여러분은 여러분의 게임이나 앱에 이 기능들을 적용할 수 있겠죠. 만약 여러분이 코로나 이벤트 모델에 대해서 그렇게 친숙하지 않다면 우선  The Corona Event Model Explained부분을 읽고 난 후 아래 부분을 읽기를 권장합니다.






The Scenario


이 튜토리얼의 시나리오를 한번 짜 보면 한개의 object와 하나의 player 가 있습니다. 여기에 그 건강상태와 관련된 많은 이벤트를 적용해 볼 겁니다. 우리는 이것을 health 이벤트라고 부르겠습니다. (이름은 여러분이 원하는대로 붙이시면 됩니다. 단지 다른 Corona event와 이름이 중복되거나 이미 있는 다른 custom event와 이름이 겹치지만 않으면 되요.)


Dispatching an Event


게임이 시작되면 어떻게 되는지 한번 얘기해 봐요. player의 건강은 75%일 겁니다. 그는 med pack을 집을거고 그러면 그의 건강의 100%가 될겁니다. 이 부분에서 우리는 health 이벤트를 dispatch 할 겁니다. event.type을 full로 할거구요. 여기서 여러분이 첫 번째로 할 일은 event table을 만드는 겁니다. 이 테이블은 listener 함수에 보낼 모든 데이터를 가지고 있게 될 겁니다. 일단 event table 셋업이 완료 되면 여러분은 object:dispatchEvent() 메소드를 call 할 수 있습니다.


local event = {
    name = "health",
    type = "full",
    healthPercent = 100
}
player:dispatchEvent( event )


event table에 있는 name 키는 object:dispatchEvent() 메소드에 전달될 건데요. 이게 유일하게 반드시 있어야 될 항목입니다. 나머지는 완벽하게 여러분 마음에 달려있습니다. 옵션이죠.

아래에 보면 health level이 low나 empty일 때 어떻게 health를 dispatch 하는지 보여 드립니다.


local event = {
    name = "health",
    type = "low",
    healthAmount = 10
}
player:dispatchEvent( event )
local event = {
    name = "health",
    type = "empty",
    healthAmount = 0
}
player:dispatchEvent( event )


Listening to Events


custom event에 object listen을 갖게 하는 방법은 코로나의 predefine된 이벤트에 listen을 다는 것과 똑 같이 하시면 됩니다. 간단하게 event name을 명시하고 (dispatch 했을 때 명시된 이벤트 이름이요) 그런 type의 event가 receive 됐을 때 그 함수가 call 되게 됩니다.

아래 예제는 player object가 dispatch 된 health 이벤트들에 어떻게 object listen 하게 되는지를 보여드리고 있습니다.


local function health_listener( event )
    if event.type == "full" then

        print( event.healthAmount )  -- 100
        turn_health_bar_green()    

    elseif event.type == "low" then

        print( event.healthAmount )  -- 10
        warn_player()
        turn_health_bar_red()

    elseif event.type == "empty" then

        print( event.healthAmount )  -- 0
        initiate_game_over()
    end
end
player:addEventListener( "health", health_listener )


table listener를 사용함으로서 self object로 그 object를 reference 할 수 있게 됩니다.


local function health_listener( self, event )
    if event.type == "full" then

        print( event.healthAmount )  -- 100
        turn_health_bar_green()    

    elseif event.type == "low" then

        print( event.healthAmount )  -- 10
        warn_player()
        turn_health_bar_red()

    elseif event.type == "empty" then

        print( event.healthAmount )  -- 0
        initiate_game_over()
    end
end
player.health = health_listener
player:addEventListener( "health", player )


어떻게 리스너 함수에서  healthAmount 변수가 접근 될 수 있는지 주목해 주세요. 이것이 Corona의 이벤트 모델이 진정 가치있는 부분입니다. 언제든지 이벤트의 특정 타입으로 object를 respond 하기를 원한다면 여러분은 object:addEventListener() method를 사용해서 그렇게 하실 수 있습니다. 역으로 object:removeEventListener() method를 사용해서 그 object의 listening을 stop 시킬수도 있습니다.


Things to Keep in Mind

믿으실지 모르겠지만 custom event의 dispatch와 listening 을 모두 끝냈습니다. 이제 여러분이 custom event를 사용하실 일 만 남았는데요. 몇가지 염두에 두셔야 할 것을들 정리했습니다.
  • 코로나에 이미 내장된 코로나 이벤트와 비교해서 살펴보면 custom event에서는 이벤트가 dispatch 될 때 반드시 여러분이 컨트롤 해야 합니다.
  • 코로나에 이미 내장된 코로나 이벤트와 마찬가지로 이벤트를 dispatch 되게 하기 위한 object listening을 하지 않으면 아무 일도 일어나지 않습니다.
  • object:dispatchEvent() method에 pass 된 이벤트 테이블은 name 키가 필요합니다. 그 나머지는 옵션입니다.


물론 여러분은 이벤트를 dispatching 하는 대신 direct로 함수를 call 하실 수 있습니다. 이벤트를 사용하는 가장 큰 이유는 여러분이 원하면 언제든지 그 이벤트에 대한 listening을 stop 시킬수 있다는 겁니다. (만들고 관리하고 함수를 call 할 때마다   Boolean 변수를 사용해서 항상 체크하고 하는것보다 훨씬 간편합니다.).

이벤트를 사용하는것은 또한 간단한 코딩을 지원합니다. 그러므로 유지보수를 더 수월하게 하죠. 어떤 종류의 custom 방식으로 코로나의 이벤트 모델을 사용하실건가요?




반응형

Corona SDK: New public release

2012. 6. 22. 09:12 | Posted by 솔웅


반응형
Posted on . Written by


이번에 public release로 2012.840 이 릴리즈 됐습니다.

새로운 버전에는 아주 많은 기능들이 추가 됐고 버그들도 많이 수정됐습니다. 유료사용자분들은 이미 알고 계시겠지면 새로운 분들을 위해서 아래 주요한 내용들을 정리해 드리겠습니다.


  • In-app purchase on (Google Play/Android Marketplace)
  • Remote push notifications (iOS)
  • Game Center (iOS)
  • Facebook Single-sign on
  • Lua File System for creating, removing, getting contents of directories
  • Native video and web display objects (iOS)
  • And much more — you can read them all in the release notes.


저희는 지금 여러 기능들을 추가하고 고품질의 daily build를 제공하기 위해 새로운 지점에 와 있습니다.


다음주에 시작해서 최근에 말씀드린 첫번째 feature cycle을 시작할 겁니다. 바로 2-on-2 development의 일부분입니다. push 기능과 버그 수정입니다. 이 사이클이 끝날 즈음에는 여러분들이 이 기능을 앱 스토어 -iOS App Store, 구글 플레이, Nook Store, Amazon App Store- 에 출판할 수 있게 될 겁니다.


여러분들이 많이 원하시는 기능들에 대한 개선도 있습니다. 어느 정도 개발 이 완ㄹ 되면 daily build를 통해 여러분께 선보일 겁니다. 그리고 진짜 cool 한 SDK feature와 관련되서도 작업을 하고 있습니다. 여러분들께 말씀 드릴 수 있는 것은 저희 내부 적으로 부르는 이름인데요. Aloha 와 Flatland 입니다. 이게 공식적인 이름이 될지는 아직 모릅니다. 다만 daily build release에 이 기능이 추가 되서 언급이 되면 여러분들이 생소하지 않으시라고 이름을 알려 드립니다.




Posted on . Written by


Corona Labs Celebration Sweepstakes에 이미 참가하시고 새로운 페이스북 페이지에 support 해주신 많은 분들께 감사드립니다. 콘테스트가 아직 반도 안 왔습니다. 아직 여러분께 알려드릴 많은 상품들이 있습니다. 단지 여러분이 하실 일은 한번  enter 하세요 그리고 저희의 새로운 Corona Labs Facebook page 에 Like 를 남겨 주세요. 아주 쉽죠? 일찍 enter 하실 수록 상품을 탈 가능성이 점점 커집니다. 주저하지 마세요.


콘테스트를 실시한 이후로 3명의 당첨자가 나왔습니다. 깔끔한 Corona Swag Pack 을 받으신 Justin Giles 그리고 100불 상당의 아이튠즈 상품권을 받으신 Nick Anderson씨에게 축하드립니다. 그리고 조만간 Corona Book Collection 당첨자가 나올 겁니다.



What are the prizes and when will winners be announced?


이번 콘테스트에서 대상은 3천불 상당의 Corona Enterprise license입니다. 저희들은 매일 정오에 다른 상들에 대해 추첨을 할 겁니다. 그 스케줄은 아래와 같습니다.


Friday, June 22: 1 seat to a year-long Corona Levels subscription (currently in Beta)
Monday, June 25: 6 month Corona Pro subscription
Tuesday, June 26: 1 hour of Premium Support
Wednesday, June 27: 1 seat to a year-long Corona Enterprise license (worth $3,000!)



How can I enter the contest?


아주 간단합니다. form을 작성해 주시고 Facebook 의 Corona Labs에 Like를 남겨 주세요. 일찍 enter 할 수록 당첨될 확률이 더 높습니다. 마감은 6월 28일 정오까지 입니다. (미국 Pacific Time)


Thanks for entering and good luck!



Posted on . Written by




Roberto Ierusalimschy 씨가 Corona Labs의 가족이 되서 technical advisor and mentor 로 도움을 주시게 된 것을 진심으로 진심으로 환영합니다.  많은 분들이 아시듯이 Roberto는 Lua 의 핵심 architect 입니다. 코로나 앱이 이 언어를 사용하고 있고 gaming 부분에서는 표준으로 통하고 있죠.

저는 2010년에 Game Developer’s Conference (GDC SF)에서 Roberto를 처음 만났습니다. 그는 참 겸손했습니다. 올해 초 그는 스탠포드 대학교의 visiting professor로 초청됐습니다. 몇달 전 저녁식사 자리에서 스탠퍼드에서 연구한 결과에 대해서 아주 강조했던 것을 기억합니다. 그러면서도 자신의 공은 별로 없는 듯이 얘기 하더군요. 그래서 제가 농담 겸 해서 그와 그의 동료들이 있었기 때문에 GDC 가 존재할 수 있었다는 것을 다시 상기 시켜 줬습니다.  Roberto를 부끄러워하게 만들 수 있는 한가지 방법은 그를 과도하게 칭찬하는 겁니다.


Roberto와 그의 동료인 Luiz Henrique de Figueiredo 그리고 Waldemar Celes 의 업적에 의해 얼마나 많은 삶들이 영향을 받았는지 모릅니다. Lua는 embedded device에서 스마트폰 그리고 데스크탑 컴퓨터까지 애플리케이션을 만드는데 아주 광범위하게 사용되고 있습니다. 얼마나 많은 사람들이 Rovio의 앵그리 버드를 사용하는지를 한번 생각해 보세요. 얼마나 많은 사람들이 얼마나 오랫동안 World of Warcraft를 즐기는지를 생각해 보세요. 얼마나 많은 사람들이 Adobe Photoshop Lightroom으로 사진을 편집하나요.


Roberto는 분명히 이 우주에 그의 족적을 뚜렷이 남겼습니다. 우리의 목표를 향해 나아가는데 이 보다 더 좋은 멘토는 없을 겁니다.




반응형


반응형

Guided Tour of Corona’s API Reference

Posted on . Written by



이번주의 튜토리얼은 약간 다른겁니다. 코로나의 다른 기능들에 대해 다루기 보다는 어느 특정 기능보다도 더 중요하다고 할 수 있는 전체 코로나 개발에 대한 측면에서 바라볼 겁니다. 여러분이 오늘 배우실 것은 여러분이 코로나 프로젝트를 진행하면 반드시 사용하셔야 하는 분야 입니다. 바로 Corona SDK API Reference 이죠


Corona API Reference는 코로나의 특정 기능을 어떻게 사용하느냐에 대해서 배울 수 있는 문서 입니다. 특정 이벤트나 객체 타입에 대한 정보도 얻을 수 있고 항상 사용하셔야 할 자원입니다. 그러므로 이에 대한 튜토리얼을 소개하는 것은 당연하게 필요한 것이겠죠.


만약 여러분이 아직까지 API Reference를 충분히 활용하지 못하고 계신다면 처음에는 너무 많은 정보와 배울것들이 있다고 느낄겁니다. 오늘 제가 전반적인 내용을 훑어서 알려드리겠습니다. 그리고 이 Corona API reference가 더 좋아질 수 있도록 여러분이 도움을 주실 수 있는 방법도 알려드리겠습니다.


Interface Overview


코로나로 앱을 개발하기 위해 API를 많이 참조하시는 분은 지난주 이 API reference 웹 페이지가 새로 개편된 것을 보셨을 겁니다. 예전 페이지를 많이 참조하셨던 분들은 이번에 인터페이스가 완전히 바뀌어서 약간 불편해 하시는 분도 계실 수 있습니다. 하지만 조금 더 써보시면 훨씬 좋아졌다는 것을 느끼실 겁니다. 새 창이나 새 탭에 Corona API Reference를 띄우시고 아래 내용을 쭉 따라가 보세요.


Navigation and Sidebar


위쪽 sidebar에 있는 navigation bar는 보시면 아실 겁니다. 코로나의 전체 documentation을 크게 3부분으로 나눠서 각 section으로 갈 수 있도록 만들었습니다.

왼쪽은 각 세부 섹션들에 직접 갈 수 있는 링크들이 있습니다.  Jump to... 드롭 다운 메뉴도 이 좌측 링크들과 비슷한 역할을 합니다. 하지만 좌측 메뉴는 그 세부 섹션 페이지로 가는데 반해 이 드롭다운 메뉴는 현재 페이지 내에서 해당 항목으로 가는 겁니다. (페이지가 바뀌지는 않습니다.)





이 API Reference page는 코로나의 모든 함수, 이벤트, 프로퍼티, object methods 그리고 data type 들에 대한 리스트가 있는 index 입니다. 여러분이 무엇을 찾는지 확실하게 아신다면 ctrl+F 를 누르셔서 검색하는 게 가장 빠른 방법입니다. 또 다른 유용한 기능은 아래쪽에 있는 바로 breadcrumbs 라고 합니다. 이 하단의 바는 항상 있는데요. 여러분이 지금 어디에 있는지 알려주는 역할을 합니다.






API Reference Columns


API Reference index (home) page에 보면 3가지 주제로 나뉘어져 있는 걸 보실 겁니다. -Libraries, Events, Types -




Libraries  컬럼은 Corona에 내장된 함수의 리스트 입니다. (display.newImageRect()나  storyboard.gotoScene() 같은). Events 리스트는 다양한 이벤트의 종류를 열거했습니다. 그리고 각 이벤트들에 대한 연관된 프로퍼티들도 있구요.Types 는 코로나의 여러 데이터 타입들을 포함하고 있습니다. 그리고 Library 함수들에 의해 생성된 객체들하구요 그와 관련된 프로퍼티와 메소드들(특정 객체 타입에 attached 된 함수들)이 있습니다.


Reference Pages


각각의 API reference 페이지들은 특정 함수와 프로퍼티 등에 대해 여러분들이 알아야할 모든 정보가 있습니다. 만약 여러분이 이 library 함수에 대한 아무 페이지나 보시게 되면 -예를 들어 display.captureScreen() 같은 - 아래 이미지와 같은 내용을 보실 겁니다. 보시면 아시겠지만 이전의 API reference 보다 더 많은 정보들이 있습니다.


딱 보면 어떤 종류의 객체(혹은 데이터 타입)를 이 함수가 return 하는지 Revision (Build)이 뭔지, parent library 는 뭔지 그리고 관련된 키워드는 무엇이 있는지 그리고 연관된 링크(다른 API나 튜토리얼, 외부 웹페이지 등) 등을 보실 수 있습니다. 다른 타입의 API 페이지는 윗 부분에 다른 내용들이 있을 겁니다. 그건 그 타입에 걸맞는 내용들입니다.




좀 더 아래쪽에는 overview가 있습니다. 여기에는 일반적으로 조심해야 될 부분이나 헛갈리는 부분에 대한 설명이나 syntax structure, 관련된 함수 파라미터들 그리고 예제들이 있습니다.


Searching the Documentation


만약 여러분이 특정 API 페이지를 찾으셔야 한다면 home/index 페이지로 가세요. 그리고 브라우저에서 page search 를 하시던가 좌측 메뉴 링크를 이용하시던가 Jump To 드롭다운 메뉴를 이용하세요. 그런데 그 API의 정확한 이름을 모르신다면 전체 Corona Docs에서 키워드를 사용해 검색을 하실 수 있습니다. (구글에서 검색하시는 것처럼요). 검색 필드는 오른쪽 위에 있습니다. (아래 이미지를 참조하세요.)





검색 결과는 구글이 코로나 내의 블러그나 API reference page 들에서 검색한 내용입니다. images를 타입하시고 엔터키를 쳐 보세요. 그 정확도에 놀라실 겁니다.


Help Improve the API Reference


새로운 API reference는 이전 API reference 보다 많이 개선 되었습니다. 하지만 완벽한것은 아니라는 것을 저희들은 압니다. 우리가 중요한 것을 간과하거나 잊어버리고 만들었을 수도 있습니다.  (그것이 이전 API reference에 있었을 수도 있고 없었을 수도 있구요.)  어딘가 오탈자가 있을 수도있구요. 예제가 있어야 되는데 빠져 있을 수도 있구요.


코로나 API Reference 웹사이트는 계속 보완을 해 나갈 겁니다. 그리고 저희 스스로도 계속 보완할 내용을 찾는 작업을 할테고 여러분의 feedback 도 계속 받겠습니다. 특정 API 페이지에서 어떤 잘못 된 것을 발견하시거나 빠진것을 발견하시면 저희에게 알려 주세요. 그 방법은 아주 간단합니다. 각 API Reference Page의 아래쪽에 3개의 링크를 보실 수 있을 겁니다. 관련된 링크를 누르고 그 내용을 넣어 주시면 됩니다.




그러니까 API 에 관련해서 잘못 된 부분을 알려주시려면 이 블로그 글의 댓글을 달기 보다는 해당 API 페이지에 가셔서 밑에 있는 링크를 누르고 알려 주시면 감사하겠습니다. 그 링크를 누르시면 몇개의 checkbox들이 있을 겁니다. 그리고 comment 필드도 있구요. 관련 사항에 체크하시고 가급적이면 자세하게 코멘트를 달아 주세요.


여러분들 중에 이미 많은 분들이 이 feedback form을 사용해 보셨을 겁니다. 이 웹사이트를 지난주에 오픈했는데도 이미 많은 글들이 올라왔거든요. 저희들의 실수를 지적해 주신 모든 분들께 감사드립니다. 그리고 의견을 올려 주신분들도 감사드리구요. 여러분들 중에 몇분은 아주 잔인할 정도로 정직하시더라구요. 그게 바로 저희들이 원하는 겁니다. 계속 와 주세요. 지금 코로나의 함수들, 이벤트들 그리고 객체 프로퍼티와 메소드들에 대해 정통한 정보를 찾아서 사용 하세요.


Still confused?


만약 API Reference 페이지가 아직 헛갈리시면 그리고 어디서부터 시작해야 할 지 모르시면 우선 보실 필요가 있는 곳이 Guides 섹션 입니다. 여기에는 초보자 분들을 위한 Corona SDK Quick-Start 가 있습니다.



반응형


반응형

Applying Basic Animation with Transitions

Posted on . Written by


하지만 그 외에도 display objects에 대해 기본적인 애니메이션 효과를 제공하도록 하는 기능들도 유용하게 사용 하실 수 있습니다. 객체를 계속 회전시킨다던지 투명도를 주었다 뺐다 하던지 한 곳에서 다른 곳으로 이동을 시킨다던가 아니면 위 세가지를 모두 합쳐서 어떤 효과를 낸다던가 하는 일을 코로나의 transition library 를 통해서 구현하실 수 있습니다.


이 글은 주로 이 transition.to()함수에 대해 다룰 겁니다. 코로나의 transition library를 사용할 때 가장 많이 사용해야 할 함수죠. 대략적으로 정리하자면 transition.to() 는 두개의 파라미터를 사용합니다. 애니메이션 효과를 줄 객체와 그리고 회전, 투명도 x,y 값의 combination으로 구성되는 ending property 들의 조합인 table로 구성돼 있습니다. 그리고 이 transition에 걸릴 시간과 옵션으로 이 transition이 끝났을 때 호출될 함수도 넣을 수 있습니다. 이 transition이 시작되면 이 객체의 현재 value들은 여러분이 정해준 값으로 "tweened" 됩니다.


여러분이 코로나를 이용해 게임등의 앱을 개발하면서 충분한 시간을 투자할 수 없는 상황이라면 아마도 이 함수를 사용하실 겁니다. 이 함수는 아주 많이 유용하거든요. 여러분도 아시게 되겠지만 이 함수는 사용하기에 아주 많이 쉽기도 하거든요.




Fading an Object


아주 기초적인것 부터 시작하겠습니다. 우리는 객체를 생성할 거고 이 객체가 점차 투명해져서 사라지도록 만들 겁니다. 여러분들도 이미 아시겠지만 display object의 alpha 프로퍼티가 그 객체의 opacity를 담당하고 있습니다. 그래서 그 프로퍼티를 transition.to() 함수에 pass 해서 1.0에서 0 이 되도록 만들 겁니다. (1.0은 투명도가 전혀 없는 상태고 0은 완전 투명해서 안 보이는 상태입니다.)

아래 예제를 보세요. 우리는 이렇게 객체가 사라지는 시간을 3초로 정할겁니다. (3000 milliseconds)


local obj = display.newImage( "image.png" )

-- center the object

obj.x = display.contentWidth*0.5
obj.y = display.contentHeight*0.5

-- fade object to completely transparent

transition.to( obj, { time=3000, alpha=0 } )


위 코드는 객체를 생성하고 "tweens" 해서 그 alpha 프로퍼티를 1.0에서 0으로 3초동안에 변화 시키도록 하는 겁니다. 아주 간단합니다. 이제 저 객체가 완전히 투명해져서 안 보이게 되면 그 객체를 완전히 remove 해 버리죠. 이 transition이 끝났을 때 실행 될 함수를 call 할 수 있습니다. 그걸 하려면 onComplete 파라미터를 사용하시면 됩니다.


local obj = display.newImage( "image.png" )

-- center the object

obj.x = display.contentWidth*0.5
obj.y = display.contentHeight*0.5

local function removeObject( object )

    object:removeSelf()
    obj = nil   -- nil out original reference (upvalue)
end

-- fade object to completely transparent

transition.to( obj, { time=3000, alpha=0, onComplete=removeObject } )


NOTE: 저 객체의 transition이 첫번째 argument에서 onComplete 리스너 함수까지 어떻게 진행되는지 그리고 구현하는것이 얼마나 쉬운지 보세요. 이것을 활용해서 여러 transition들에 대해 이 한가지의 listener를 만들어서 사용하실 수 있습니다. 또는 저 객체가 out of scope 일 때도 그 리스너를 사용하셔도 됩니다.


Moving Objects


transition.to() 함수의 아주 유용한 부분중의 하나는 한번에 tweening 하는데 한가지만의 프로퍼티만 사용하라는 법이 없다는 겁니다. 우리 첫번째 예제를 조금 바꿔서 그 객체를 좌상단에서 우 하단으로 움직이면서 투명해지도록 해 보죠.


local obj = display.newImage( "image.png" )

-- set starting position (top-left of screen)
obj.x, obj.y = 0, 0

local function removeObject( object )
    object:removeSelf()
    obj = nil   -- nil out original reference (upvalue)
end

-- some variables to be used in the transition
local end_x = display.contentWidth
local end_y = display.contentHeight

-- fade object to completely transparent and move the object as well
transition.to( obj, { time=3000, alpha=0, x=end_x, y=end_y, onComplete=removeObject } )


Easing Library


코로나의 Easing Library 는 transition.to() 함수와 함께 쓰여서 transition 프로퍼티를 통해 transition의 behavior 를 하는데 다루는 데 사용되어 질 수 있습니다. 디폴트로 이 transition 프로퍼티는 easing.linear로 세팅돼 있습니다. 이것은 transition이 처음부터 끝까지 같은 공간에서 꾸준히 tween 되는 상태를 말합니다.

각 transition 프로퍼티 behaves를 설명하는 것은 약간 어렵습니다. 백문이 불여일견이라고 샘플 앱에서 Transition1과 Transition2 예제를 보실것을 권장합니다. 이 샘플은 아래 경로에 있습니다.

  • /SampleCode/Graphics/Transition1
  • /SampleCode/Graphics/Transition2


이 샘플 예제를 보시고 다른 transition type들을 적용하면서 실행해 보세요. 이렇게 하는게 가장 쉽고 확실하게 배우는 길입니다. 그리고 여러분이 배운 Corona의 transition library에 대한 모든 것을 확실히 다져 주세요.


Canceling Transitions


In the event you need to stop a transition mid-way through, you can do so by using the transition.cancel() function. However, this function requires that you store a reference to an id of the specific transition you need to cancel.

여러분이 transition이 일어나는 중간에 이를 stop 시킬 필요가 있다면 여러분은 그렇게 하실 수 있습니다. transition.cancel() 함수를 사용하시면 됩니다. 이걸 이용하시려면 해당 transition의 id를 사용하셔야 합니다.

그러니까 이 transition을 cancel 하기 이전에 그 transition의 id를 variable에 store 할 필요가 있습니다. 아래 첫번째 예제를 약간 바꾼 샘플이 있습니다. 해당 transition 아이디를 transition_id 라는 변수에 대입을 했습니다.


local obj = display.newImage( "image.png" )


-- center the object
obj.x = display.contentWidth*0.5
obj.y = display.contentHeight*0.5

-- fade object to completely transparent
local transition_id = transition.to( obj, { time=3000, alpha=0 } )

Now, we can cancel the transition at any time by passing that stored id as the first parameter to transition.cancel(). In the following example, we’ll cancel the transition after 1.5 seconds.

local obj = display.newImage( "image.png" )

-- center the object
obj.x = display.contentWidth*0.5
obj.y = display.contentHeight*0.5

-- fade object to completely transparent
local transition_id = transition.to( obj, { time=3000, alpha=0 } )

timer.performWithDelay( 1500, function()
    if transition_id then
        transition.cancel( transition_id )
        transition_id = nil
    end
end, 1 )


위에서도 언급했는데요. 우선 transition을 cancel 하기 이전에 그 transition이 존재해 있어야 합니다. 여러분이 실전에서 코딩을 하실 때는 반드시 해당 transition이 선언돼 있는지 확인하시기 바랍니다.

그리고 여러분이 transition.cancel()을 call 할 때는 그 transition id를 저장하기 위해 사용한 변수를 nil-out 시키시기 바랍니다. 그렇게 하지 않으면 skeleton table이 남겨져 있게 됩니다. (마찬가지로 object:removeSelf() 한 이후에도 반드시 그 변수를 nil-out 시켜 주세요.)


WARNING: Do not remove currently transitioning objects!


만약 현재 tweened 되고 있는 객체가 remove 된다면 여러분의 앱은 crash를 일으킬 겁니다. 이것은 scene change 할 때 종종 일어나는 현상인데요. scene change를 하기 전에 transition.cancel()을 현재 active 상태에 있을 법한 변수에 적용하는 것이 에러가 일어날 가능성을 미리 방지하는 방법일 겁니다. 이 부분은 exitScene 이벤트 리스너에서 수행하는것이 가장 이상적입니다. 좀 더 자세한 사항은 Storyboard Scene Events Explained를 확인하세요.

Corona의 transition library에 대한 좀 더 많은 정보는 Transitions API reference 페이지를 참조하세요. 좀 더 많은 정보들이 있습니다.

반응형


반응형

Posted on . Written by


6 월은 코로나에게 아주 바쁜 달이었습니다. 오늘에야 새 회사 이름을 announced 했네요. Corona Labs Inc. 를요 그리고 멋진 새 웹사이트도 선보였구요 (www.coronalabs.com) 트위터 주소도 바뀌었습니다. (@CoronaLabs) 페이스북 페이지도요. (facebook.com/CoronaLabs). 


We’re ready to celebrate!

오늘부터 우리는 ‘Corona Labs Celebration Sweepstakes’ 를 시작합니다. 그리고 여러 상품도 준비했습니다. (대략 $3800 어치 선물). 이제 숫가락을 드시고 그 상품을 어떻게 먹을 수있는지 아래를 잘 살펴 보세요.


What prizes are we looking at?

Grand Prize: $3000 상당의 1년간 Corona Enterprise license 입니다. 아래 내용들을 잘 살펴 보세요.



More great prizes:

  • 1 hour of Premium Support (worth $225)
  • 6 month Corona Pro subscription
  • 1 year Corona Levels subscription (currently in beta)
  • $100 iTunes gift card
  • 1 Corona Book Collection: “Corona SDK Mobile Game Development: Beginner’s Guide” by Michelle Fernandez and Mobile App Development with Corona” by Brian Burton
  • 1 Corona Swag Package: mug, t-shirt, stickers and more!


How can you win these awesome prizes?

아주 간단합니다. 여러분이 해야 될 일은 6월 28일 정오까지 (Pacific Time)  Corona Labs Celebration Sweepstakes 에 enter 해 주세요. 그리고 페이스북에 저희에 대해 Like 해 주세요. 그냥 이렇게만 해 주시면 위 상품을 탈 수 있는 기회를 가질 수 있습니다.


How and when will we select the winners?

저희는 아래 날짜들 정오쯤에 랜덤하게 entrants 하는 분 들 중에 당첨자들을 뽑을 겁니다.

  • June 15: Corona Swag Package
  • June 18: Corona Book Collection
  • June 20: $100 iTunes gift card
  • June 22: 1 year Corona Levels subscription
  • June 25: 6 month Corona Pro subscription
  • June 26: 1 hour of Premium Support
  • June 27: 1 seat to a year-long Corona Enterprise license


그러니까 좀 더 일찍 enter 하시면 당첨될 확률이 훨씬 더 커지는 거죠.

여러분들이 행운의 당선자가 되면 저희가 축하 이메일을 보내드릴거구요 Corona Labs Facebook wall 에도 글을 올리겠습니다. 한 사람당 1개의 상품만 탈 수 있습니다.

망설일게 뭐 있겠어요. 오늘 당장 페이스북하고 트위터에 글 올려주시고 contest에 참여해 주세요.


Good luck team Corona!


반응형


반응형

코로나가 새출발 하는 기분으로 이름을 Corona labs로 바꾸었습니다.

지난주에 Ambassador 들에게는 미리 메일이 왔었는데요.

며칠 지나지 않아서 공식 발표하고 새로운 싸이트도 선 보였네요.


이번에 Corona Labs로 회사 이름이 바뀌면서 CEO 월터가 올린 글을 소개합니다.


Introducing Corona Labs!
Posted on . Written by

Team Corona,

오늘부터 우리는 우리를  Corona Labs라고 부르기로 했습니다. 여러분들 중에 미리 알고 계신분들도 계시겠지만 모르시는 분들을 위해서 몇가지 질문들에 대한 답변을 드리겠습니다.

왜 Corona Labs죠?

글쎄요. Corona는 당연하겠죠? 그런데 왜 Labs 가 들어갈까?

작년 12월에 말했듯이 코로나는 그냥 단순한 목적에서 만들어지지 않았습니다. 실제 사람들의 삶을 바꾸기 위해 만들어 졌습니다. 그 기준으로 우리가 목표로 삼을 수 있는 곳이 어딜까요? 벨 연구소 입니다.


벨 연구소
벨연구소는 1925년 설립된 세계 최고 수준의 민간 연구개발 기관이다. 설립 이래 3만 3000개가 넘는 특허와 13명의 노벨과학상 수상자를 배출했다. 20세기에는 정보통신 네트워크 시대를 이끌었고 21세기 들어서는 커뮤니케이션 혁신에 집중하고 있다. 원래 벨 시스템 사의 연구개발 연구소로 설립됐다. 1925년 당시 AT&T 사장이던 월터 기포드가 독립적인 성격의 기관으로 벨연구소를 설립했다. 연구소 명칭은 세계 최초 전화기 발명가인 알렉산더 그레이엄 벨의 이름을 땄다. 2006년에는 AT&T에서 프랑스의 알카텔-루슨트로 주인이 바뀌었다.

벨연구소가 개발한 제품으로 대표적인 것에는 전화교환기에서부터 전화선 피복, 트랜지스터 등이 꼽힌다. 1947년에 트랜지스터를 발명한 존 바딘, 윌리엄 쇼클리, 월터 브래튼은 1956년 노벨 물리학상을 수상했다. 디지털 카메라 기술도 벨연구소에서 나왔다. 1970년 윌라드 보일과 조지 스미스가 디지털 카메라 핵심 기술을 발명해 발표했고 두 사람은 2009년 노벨 물리학상을 받았다. 이 밖에 광케이블, 통신 위성기술 등도 벨연구소의 작품이다. 2005년 외부 출신으로는 처음 벨연구소 사장으로 한국인 김종훈 씨가 영입되기도 했다. 미국 뉴저지 주에 있다.



유닉스와 C 가 어디에서 나왔을까요. 태양광 모듈을 어디에서 나왔을까요? 디지털 카메라에 있는 CCD는 어디서 나왔을 까요. 이것 말고도 더 많이 있습니다. 이 기술들에 대한 핵심 기술과 기반 혁신은 벨 연구소에서 나왔습니다.

그들은 말 그대로 현대의 컴퓨터 세계를 만들어 냈습니다. 우리는 과학계에 그런 근본적이고 결정적인 영향을 주고 싶습니다. 그래서 "Corona Labs" 입니다.

이제 coronalabs.com 으로 접속하셔도 됩니다.





왜 이름을 바꿀 생각을 했을까요?

우리는 Corona 가 앱 개발자들에게 그냥 가족처럼 친숙한 이름이 됐으면 합니다. 지금까지 우리는 회사이름으로 Ansca 그리고 제품 이름으로 Corona를 사용했었는데요. 이게 내외적으로 좀 혼란스러웠거든요.

지난 몇년간 우리는 대부분의 사람들이 우리를 Corona를 만든 사람들로 생각하는 것을 관찰해 왔습니다. 그들은 Ansca라는 존재에 대해서도 몰랐습니다. 그 예로 고객들이 그들의 신용카드 영수증에 Ansca라는 이름이 찍혀있는걸 보고 이게 Corona 제품을 산 것에 대한 영수증이라는 것을 많은 사람들이 알아차리지 못했거든요.

사람으로 치면 회사가 진짜 이름하고 별명 두개를 갖고 있었던 거죠. 모두들 우리의 별명을 부르고 있었고 별명으로 기억하고 있었습니다. 그리고 모든 사람들이 그 별명을 좋아했습니다. 그래서 우리는 공식적으로 우리의 별명을 이름으로 사용하자고 결정했죠.

바뀐 이름에 어떤 큰 의미가 있을까요?

큰 의미가 있다면 Corona Labs는 평범한 lab이 아니라는 겁니다. 예전에는 labs (연구소)는 일종의 동굴 같았습니다. 외따로 떨어져있었고 밀폐된 환경이었습니다.

우리가 생각하는 Corona Labs는 근본적으로 다릅니다. 우리는 가장 개방적인 연구소로 만들 생각입니다. 다른 연구소들이 비밀을 간직할 때 우리는 좀 더 투명해 지려고 노력할 겁니다. 그 일환으로 여러분들은 지금까지의 site에서 우리늬 bug들을 보실 수 있었던 겁니다. 그리고 왜 우리들은 우리들의 roadmap에 대해 여러분들의 feedback을 받을까요. 바로 더 투명해 지려는 노력중 하나입니다.

그리고 마지막으로 코로나 팀들의 노고가 거기에 있었습니다. 여기 Corona Labs의 인간들은 정말 비범하게 헌신적입니다. 그러나 팀이란 그 인간들만을 말하는 것은 아닙니다. 그 팀에는 여러분 모두도 해당됩니다. 우리의 정말 대단한 Corona community 가 우리 한 팀입니다.

여러분들이 우리에게 영감을 주었고 우리의 삶을 바꾸어 놓았습니다. 우리는 Corona Labs가 다음세대에도 계속 왕성하게 활동함으로서 그에 대한 화답을 하기를 바랍니다.

추신: 페이스북 주소 facebook.com/coronalabs 를 기억해 주시고 @coronalabs 로 트위터도 follow 해 주세요. 그리고 우리들의 celebration promotion에 대해 주목해 주세요.

반응형

FAQ Wednesday #7

2012. 6. 14. 09:55 | Posted by 솔웅


반응형

FAQ Wednesday #7

Posted by

수요일이 왔습니다. 다시 FAQ 시간이 됐네요. 아래 5개의 FAQ 가 있습니다.

Question 1

왜 시뮬레이터하고 디바이스하고 텍스트 spacing/positioning이 약간 다른가요?

Answer


시뮬레이터와 디바이스는 서로 폰트들이 다릅니다. native.systemFont는 OS에 따라 다르게 됩니다. 맥에서는 LucidaGrande 24 pt이고 iOS에서는 Helvetica 입니다. 그리고 윈도우즈는 또 다릅니다. 다른 폰트는 사이즈가 같더라도 약간 다른 공간을 차지합니다. 그래서 alignment에 다른점들이 있게 됩니다.

같은 폰트라도 OS가 랜드링을 하면서 다를 수가 있습니다.  맥OS와 iOS는 비슷한 code paths를 사용하지만 기본 text drawing은 약간 다릅니다. 같은 폰트라도 약간 다르게 glyph를 랜더링 할 수가 있습니다. 그것은 저희쪽에서 어떻게 할 수 있는 문제가 아닙니다.

이렇게 서로 다르게 나타나는 것을 방지하려면 bitmap fonts를 사용하는 수밖에 없습니다.





Question 2


display.newText로 text를 aligning 하는데 문제가 있습니다. 제대로 잘 하려면 어떻게 해야죠?

Answer

display.newText는 x,y 파라미터를 top, left를 위치시키는데 사용하게 됩니다. 여러분이 객체를 생성하고 난 후  x,y를 세팅하면 디폴트로 text의 중앙을 세팅하게 됩니다. object가 생성될 때와 같은 alignment를 사용하려면 bject:setReferencePoint( display.TopLeftReferencePoint )를 사용하실 수 있습니다. (좀 헛갈리죠? 그래서 이런 factory methods로 x,y 파라미터의 alignment를 컨트롤 할 수 있도록 준비하고 있으니 조만간 나오는 Daily Build 에서 반영 될 겁니다.)

그리고 display.newText가 call 되는 방법에 따라 width(w)와 height(h)를 어떻게 계산하는지도 이해하는게 헛갈리기도 합니다.

    w,h 가 제공되지 않으면 display.newText는 한줄짜리 객체를 생성하고 제공된 string에 맞게 대략적으로 사이즈도 생성됩니다. 이 w,h에 따라 x,y 포지션이 결정됩니다.
    w,h 가 정해져 있으면 display.newText는 제공된 width/height 를 사용해 포지션을 계산합니다. 그렇게 해서 x,y가 top left 가 됩니다. (만약 h가 0dlaus height는 해당 string에 따라 달라집니다.)

그러니까 생성하고 난 후 x,y를 세팅할 때 (예. txt.x = xAlign) 여러분은 디폴트로 object의 center를 세팅하게 됩니다. 그래서 두개의 text 객체가 같은 string 이지만 다른 width를 가질 수 있습니다. 그렇게 되니까 center로 세팅하면 좌측 정열이 되지 않는겁니다.

Question 3

여러 API를 사용해 baseDirectory를 봤는데요. 왜 이건 subdirectory를 지원하지 않죠?

Answer

display.newImage와 다른 API들이 사용하는 baseDirectory 파리미터는 시뮬레이터나 디바이스에서 사전에 지정된 시스템 디렉토리를 명시하기 위한 optional parameter 입니다. 이 파일 시스템은 sandboxed 입니다. 그래서 baseDirectory는 다음과 같은 것들 중 하나 입니다.:system.ResourceDirectory, system.TemporaryDirectory, system.DocumentsDirectory. 만약 아무런 baseDirectory가 명시돼 있지 않으면 디폴트로 system.ResourceDirectory가 됩니다.

만약 subdirectory를 참조할 필요가 있으면 그 디렉토리는 file name에 추가 되야 합니다. baseDirectory 파라미터에 추가 되지 않습니다. 아래에 Resource directory와 Document directory안에 myImages 라는 서브디렉토리의 이미지에 접근하기 위한 몇개의 샘플코드가 있습니다.

local image1 = display.newImage(  "myImages/redBall.png", 10, 200 )

-- This next line is the same as the previous
local image2 = display.newImage( "myImages/redBall.png", system.ResourceDirectory, 10, 200 )

local image3 = display.newImage( "myImages/redBall.png", system.DocumentsDirectory, 10, 200 )


Note: Documents directory는 이미지나 파일들을 저장하는데 사용될 수 있습니다. 이 때 어플리케이션은 반드시 먼저 그 디렉토리에 파일을 create/copy 해야 합니다.

여러분은 system.pathForFile인 디렉토리를 명시하거나 subdirectory의 path를 명시하는데 사용될거라고 생각할 수 있습니다. 하지만 baseDirectory가 필요한 곳에서는 제대로 작동하지 않을 겁니다.

Question 4

. 와 / 를 사용해서 subdirectory들에 접근하는게 잘 혼동되요.

Answer


간단하게 답변을 드리면 . 는 require API로 로드된 서브 디렉토리안의 모듈에 접근하는데 사용되고 / 는 다른 모든 API들에 사용됩니다. (이전 질문 답에서 보여드렸던 display.newImage 같은 겁니다.) storyboard.gotoScene도 require를 사용하므로 . 가 서브디렉토리의 scene 모듈에 접근하는데 사용되는 겁니다.

만약 movieclip.lua 모듈과 Image가 assetes 서브디렉토리에 있다면 어떻게 접근해야 하는지 아래에 예제가 있습니다.

local movieclip = require( "assets.movieclip" )
local image1 = display.newImage( "assets/redBall.png", 10, 200 )


Question 5

File I/O API에서 baseDirectory를 찾아 볼 수가 없어요. 어떻게 이 디렉토리를 명시하죠?

Answer


io.open API는 파일을 읽고 쓰기 위해 open을 사용합니다. 여기서 디렉토리와 파일 이름이 포함된 스트링인 path를 명시하죠. 이 스트링은 system.pathForFile로 생성됩니다. 아래에 File I/O를 사용해서 어떻게 디렉토리를 명시하는지 보여드립니다.

local path = system.pathForFile( "data.txt", system.DocumentsDirectory )

-- Open a file path
local fh, reason = io.open( path, "r" )

if fh then
    -- Read all the contents of the file into a string
    local contents = fh:read( "*a" )
    print( "Contents of " .. path .. "\n" .. contents )
else
    print( "Reason open failed: " .. reason )
end


만약 서브디렉토리 안의 파일에 접근하실 필요가 있다면 파일 이름에 서브디렉토리를 append 하시면 됩니다. 아래 예제는 Resource directory에서 서브디렉토리로 접근하기 위해 path를 사용하는 방법을 보여 드립니다.

local path = system.pathForFile( "myFiles/data.txt", system.ResourceDirectory )


오늘은 여기까지 입니다. 즐거우셨기를 바라구요. 새로운거 몇가지를 배울 수 있는 기회가 됐다면 좋겠네요.

반응형

애플에 버그 report 하기

2012. 6. 9. 04:45 | Posted by 솔웅


반응형

A Complete Guide to Filing Bugs with Apple


모든 소프트웨어에는 버그들이 있습니다. Corona와 Apple도 예외는 아닙니다. Corona 팀 멤버와 빼어난 프로그래머 Eric Wing은 bug reporting 의 프로입니다. 그는 애플의 500개의 버그를 찾아냈습니다. (그리고 많은 부분이 개선 됐습니다.) 이전에 Eric이 올린 reporting bugs와 특징에 관한 글들을 읽어 보세요. 여러분도 발견한 버그가 있으시면 Apple Radar에 올려보세요.

Report your Apple Bugs and Features


앱 스토어에 iOS 앱을 올리시나요? 애플에 1년에 99불을 지불하시나요? 개발하실 때 Xcode를 사용하시나요? 어떤것에든 yes를 대답하셨다면 여러분은 Apple Developer 입니다.


모든 소프트웨어는 버그들을 가지고 있습니다. 코로나도 예외는 아니죠. 우리는 지원하는 다양한 플랫폼에서 발생하는 버그로부터 여러분을 보호해 드리려고 열심히 일하고 있습니다. 하지만 완벽하지는 못하죠. vendor 가 그 문제를 고쳐야 될 때도 있습니다.


애플 디벨로퍼로서 사람들은 가끔 이 버그때문에 절망하기도 하죠. 하지만 사실 애플은 bug report를 꾸준히 받고 있고 또 꾸준히 고치고 있습니다. 다른 큰 회사들이랑 다르죠. 큰 회사에 bug를 report 해 보세요. 그 방법을 찾는게 쉽지는 않을 겁니다. 하나 예를 들자면 저는 몇년전에 Southwest 항공에 버그를 report 하려고 시도했었습니다. Southwest는 의도적으로 온라인을 통해서 그들을 접촉하는 통로를 만들어 두지않았습니다. 그래서 저는 직접 편지를 썼습니다. 그들이 메일을 받았다는 연락은 받았지만 지금까지 그 bug는 고쳐지지 않았습니다.


애플은 unique 합니다. 그들은 외부 개발자들이 그들의 내부 bug/feature tracking system에 bug를 report 할 수 있도록 오픈했습니다. 그들은 이것을 Apple Radar라고 부르고 애플의 직원들이 정기적으로 그 report들을 관리합니다. 만약 task 가 Radar 에 있지 않으면 애플의 기술자들은 그 문제에 대해 일을 하지 않을 것이고 bug가 고쳐지지도 않을 겁니다.





*YOU* Must File Bugs to Get a Fix! (Not somebody else)


개발자들로부터 이런 얘기들을 많이 듣습니다. "누군가가 bug를 신고 할거야" 혹은 "애플이 이미 이 bug를 알고 있을거야". 이말은 잘못된 겁니다. 아무도 bug를 신고하지 않으면 Apple은 이것에 대해 알 수가 없습니다.


그리고 그 말이 사실이라고 해도 문제가 안 됩니다. Radar는 voting/priority 시스템이기 때문입니다. Radar는 report가 얼마나 많은 사람들에 의해 중복해서 보고 됐는지를 조사합니다. 더 많은 사람들이 올린 이슈에 대해 애플은 우선순위를 두어서 bug를 fix 할 겁니다. 그렇기 때문에 애플이 이미 알고 있더라도 누구나 bug를 report 해야하는 겁니다.


Test Betas and File Early


애플은 beta(seeds)를 release 합니다. 그들은 뭔가가 제대로 작동하지 않는지에 대해 알고 싶어 합니다. 이 때 제대로 잡아야 재앙을 막을 수 있습니다.


여러분들 중 iOS 5.0 에서 OpenAL 관련해 진짜 악성 bug가 있었다는 것을 기억하시는 분이 계실겁니다. 정말 재앙이었습니다. 왜냐하면 충분히 막을 수 있었거든요. 그런데 아무도 거기에 대해서 참여하지 않았습니다. iOS 5.0 beta 4에서 OpenAL API 에서 제대로 작동을 멈추게 하는 부분 관련한 audio code에서 무언가 문제점이 있었습니다. 그래서 audio 가 완전히 망가졌었죠. 몇몇 개발자들은 사실 beta 4에서 이 사실을 발견 했습니다. 그런데 애플이 알 거라고 집작했거나 아니면 누군가가 report 했을 거라고 생각해서 아무도 report를 하지 않았죠. 결국 beta 7 에서 그 문제점에 대해 제대로 인식하기 시작했고 제가 그 버그를 report 했습니다. 그런데 이미 때는 늦었습니다. 애플은 이미 코드 단에서 bug fix에 대해  lock down 해 버렸습니다. 그래서 애플은 이후에 보안 이슈같은 아주 critical 이슈들만 fix 했죠. 그래서 그 문제는 5.1 버전까지 fix 되지 않은 채로 있었습니다.


그러는 동안 우리는 Corona에서 이 문제와 관련되서 문제점을 극복하려고 몇주간의 시간을 투자했습니다. 우리가 그 solution을 찾았을 때까지 이 문제로 인해 bad performance 를 감수해야 됐습니다. 우리는 그 문제를 해결할 수 있었던 것을 행운이라고 생각합니다. 그것 이외에도 아직 fix되지 않은 iOS에 이미 있었던 버그들이 우리들의 일에 지장을 주었습니다.  그래서 그런 버그들이 또 다른 버그들을 야기하기도 했죠.


애플은 이것을 iOS 5.1에서 fix 했습니다. 문제는 계속 iOS 5.0 을 쓰고 있는 사람들에게는 그 bug가 계속 나타날 거라는 거죠. 그러니까 iOS 5.0 이 완전히 사라질 때까지 우리는 그 bug의 피해를 계속 받을 수밖에 없는 겁니다. (다행히 대부분의 유저들이 2주만에 over-the-air update를 통해서 5.1로 업그레이드 했습니다. 5.0과 관련된 문제가 훨씬 일찍 해결 될 거 같긴 합니다. )


여기서 배운 점은 누군가 beta 4에서 bug를 발견해서 report 하기만 했다면 이 문제는 5.0 이전에 해결 됐을 거라는 겁니다.


Write Good Bug Reports


애플이 제공하는 좋은 bug report 쓰기를 보시려면 여기로 가세요.


아래 몇가지 참조할 만한 사항을 추가합니다.


- 가급적 자세한 정보를 보내세요. 누군가가 그 버그에 대해 report 했을 수 있습니다. 하지만 여러분이 표현한 다른 현상이 버그를 고치는데 더 도움을 줄 수 있습니다.

- 현상을 간단하게 재현해 볼 수 있는 test case 를 제공해 주세요.

- 애플팀에게 어떤 버전에서 그 문제가 일어났고 어떤 OS와 device에서 테스트를 해 봤다는 것을 알려주세요.

- 관련된 다른 버그를 아시면 bug report 에 그 bug number를 포함해 주세요.

- Corona를 사용하고 있다는 것에 대해 그리고 모든 detail하게 알지 못하는 것에 대해 말하는데 부담 갖지 마세요. 애플은 여러분의 binary 파일로도 테스트를 할겁니다. 그러니까 bug report 에 여러분이 built 한 바이너리 파일도 넣어 주세요. 그리고 애플과의 discussion에 우리(Corona) 도 넣어 주세요. 애플에 버그를 submit 할 때 Corona에도 같이 submit 해 주세요. 그리고 애플의 bug report 를 copy 해주시면 감사하겠습니다. (bug number랑요)

- 애플은 좀 더 많은 정보가 필요하면 여러분을 contact 할 겁니다. 거기에 follow up 해 주세요. 애플이 여러분에게 contact 했는데 어떻게 제공할지를 모르면 저희에게 알려 주세요. 저희들이 애플이 필요로하는 정보를 얻는데 도움을 드리겠습니다.


Be Polite


제 경험상으로 애플 기술자들은 그들의 일에 자부심을 가지고 있고 그들의 제품을 사용하는 유저들을 사랑하고 있습니다. 그들은 좋은 bug report를 받는 것을 좋아합니다. 자신들의 상품을 좀 더 좋게 변화시키는 일을 할 수 있으니까요. 여러분도 정중하게 너무 꾸짖는 톤으로 들리지 않도록 신경 써 주세요.


Types of Bugs – Apple or Corona?


어떤게 애플 버그인지 어떤게 코로나 버그인지 어떻게 구분하죠? 가끔 이를 구분하기 어려울 때가 있습니다. 아래 몇가지 hint를 드리겠습니다.


Regression: 같은 device이고 수정하지 않은 같은 프로그램인데 이전 iOS 버전에서 잘 돌아가는데 새로운 iOS 버전에서 에러가 발생한다면 이것을 regression bug라고 합니다. 이것은 대부분 Apple bug 이고 bug report 를 해야할 사안입니다. 빨리 report 해 주세요.


Device specific:  iPad 1과 iPad 2 에서 뭔가 다른 이상한 점들이 있다면 이것은 Apple bug일 가능성이 큽니다. 이럴 경우 어느쪽 버그인지 확실하지 않으면 Apple 과 Corona에 같이 bug report 해 주실것을 부탁드립니다.


Similar problems with apps *not* made with Corona: 코로나를 사용하지 않은 다른 앱에서도 같은 버그가 발생하면 Apple bug일 가능성이 큽니다.


We tell you it’s an Apple bug:  우리가 이미 알고 있는 Apple bug들도 있습니다. 우리가 그것은 Apple bug라고 하면 그것을 애플에 report 해 주세요. (priority를 높이기 위해서요)


Feature requests: Radar 는 feature request도 할 수 있습니다. Siri API access 같은 것을 원하면 애플에게 그것을 오픈해 달라고 요청하실 수도 있습니다. 이런 것들도 bug report 해도 됩니다.


My Personal Results


저는 여러분에게 거짓말하고 싶지 않아요. 많은 버그들이 fix 되지 않을 겁니다. 그리고 애플 엔지니어들로부터 여러분이 report 한 버그에 대한 추가 정보를 요청 받는 경우도 아주 드물겁니다. 그런데 말씀 드릴 수 있는 것은 적지 않은 버그들이 response 받고 fix 된다는 점입니다. 저는 애플에 500여개의 버그를 report 했습니다. 그 중에 25% 가량이 fix되거나 해결 된 것 같습니다. 25%면 꽤 괜찮은 비율이라고 생각합니다. 구글이나 마이크로소프트에 report 한 버그는 0% 거든요. 제 bug report 를 그들이 읽었는지 어떤지에 대해서도 저는 전혀 모릅니다.



Bugs Every Corona User Should File


아래 몇개의 버그들을 소개해 드리겠습니다.


Lua support for Xcode:


Xcode 4에는 Lua 에 대해 syntax highlighting 을 제공하지 않습니다. 모든 Corona 유저들이 이 bug를 report 했다면 (feature request) 이 기능은 제공 됐을 겁니다. 왜냐하면 여러분은 이 report를 최고 우선 순위로 올려 놓을 만큼 충분한 머릿수가 되거든요. 이렇게 되도록 만듭니다. 오늘 bug report 를 해 주세요. 애플이 그 버그 레포트가 duplicate 인것을 알아 차리도록 bug report  rdar://9321859 부분을 알려 주세요.


Layer-backed WebView sometimes crashes on Mac:


맥에서 코로나의 Native object들은 애플의 layer-backed views라고 불리는 Core Animation technoloty와 아주 세련되게 잘 어울리도록 돼 있습니다. 하지만 WebView는 이 기술과 2007년 선보인 이래로 OpenGL과 작동하는데 심각한 문제가 있습니다. (제 original bug 가 그 때부터 보고 됐었거든요.) 많은 개선이 있었지만 아직까지 Corona Simulator와 crash 하는 문제점은 있습니다.  만약에 이 webview가 Corona Simulator에서도 잘 작동이 된다면 개발자들에게 아주 편리한 기능이 될 겁니다. 이 bug를 지금 fix 합시다. 여러분의 bug report 에 rdar://1326401 도 추가해 주세요.


Switching between recording and playback causes a momentary freeze:


불행히도 iOS5에는 1개 이상의 심각한 audio bug가 있었습니다. 다른 버그는 recording mode와 playback mode가 서로 교차할 때 일 순간 어플리케이션이 freeze 되는 현상을 유발합니다. Corona에서 제공하는 샘플 앱을 보면 iOS5에 대해 Lua 에서 이 부분을 피해가는 제 2의 방법을 사용하고 있는 것을 볼 수 있을 겁니다 . 그 제 2의 방법을 보면 recording과 playback 모드가 서로 switch 하는 것을 피하기 위해 동시에 playback 과 record 모드를 작동시키고 있습니다. 이런 방법으로 해결은 하고 있지만 이 방법은 비용이 많이 드는 방법입니다. 그래서 performance에도 악영향을 주고요. 아이폰은 큰 이어폰대신 작은 이어폰을 사용하기 위해 playback speaker를 switch 합니다. 아마도 feedback noise를 피하기 위해서 일 겁니다. 여러분들 중에 playback과 recording을 동시에 작동시키기를 원하지 않는 분들은 저희들에게 컴플레인을 하실겁니다. 하지만 small ear speaker를 사용하는 것은 애플의 디자인입니다. 동시에 작동하도록 만드는 것은 저희들이 어쩔 수 없이 선택한 겁니다. 애플만이 이 문제를 fix할 수 있습니다. 그러니까 bug report를 해 주세요.  rdar://145440 도 bug report에서 언급해 주시구요.


I have publicly mirrored these bugs at Open Radar:

저는 Open Radar에 이 버그들을 공개적으로 미러링하고 있습니다.


http://openradar.appspot.com/9321859

http://openradar.appspot.com/radar?id=1326401

http://openradar.appspot.com/radar?id=1454403



Open Radar


이것은 옵션사항입니다. 애플 개발자들은 이미 발견된 버그에 대해 같이 고민해보고자 그 버그를 share 하는 커뮤니티를 시작했습니다. 이 Open Radar에 여러분의 bug report를 공유해 보세요.


What are you waiting for?


여러분은 애플에 개발자 certificate를 위해 99불을 지불 하셨습니다.  여러분은 Mac을 구입하셨습니다. iOS device를 구입하셨습니다. Bug들은 개발시 여러분의 시간과 비용을 증가시킵니다. 그러한 것들은 여러분의 고객을 놓치게 합니다. 그대로 두면 나중에 다시 여러분의 일에 문제를 불러 일으킬 겁니다. 여러분의 투자금을 보호하세요. 그리고 미래의 골치 아픈 문제를 방지하세요. 그 버그들을 오늘 report 하세요.


Apple Radar


Apple Radar에 file report 를 시작하세요.

반응형

Local Notifications Guide (iOS)

2012. 6. 6. 23:35 | Posted by 솔웅


반응형

Local Notifications Guide (iOS)


이번주 화요일의 튜토리얼은 코로나의 Local Notification 기능에 대해 다루겠습니다. 현재 iOS 플랫폼에서만 가능합니다.

여러분 앱의 사용자가 local notification을 받으면 alert 하게 될 거고 소리가 날 거고 메세지가 뜰 겁니다. 그리고 그 notification과 관련된 어떤 행동을 할 수 있는 옵션들이 제공 될 겁니다.

notification을 받을 때 여러분의 앱이 foreground에 있지 않으면 (예를 들어 유저가 인터넷 서핑을 한다 던지, 페이스북을 한다 던지 등등) 유저에게 메세지를 보여줄 수 있습니다. 그리고 여러분의 앱으로 돌아갈 수 있도록 하는 옵션을 줄 수 있습니다. 그러면 여러분 앱을 좀 더 많이 사용할 수 있도록 하겠죠.

Notification은 아주 customizable 합니다. 소리를 내게 할 수도 있고 메세지를 보일수도 있고 앱 아이콘에 badge count를 넣을 수도 있습니다. 또한 user가 특정 notification에 답했을 때 정확히 여러부닝 필요로하는 것을 수행하기 위해서 custom data를 여러분 앱에 pass 할 수도 있습니다.

오늘 다룰 튜토리얼에서는 코로나의 이 local notification 에 대해 알아야 할 모든것에 대해 다루겠습니다.





Local vs. Push Notifications


Local Notification하고 Push Notifications 하고 헛갈리지 마세요. 유저 입장에서 보면 alert이나 message, sound, badge icon 등등 모두 똑 같겠지만 개발자 입장에서는 분명히 다르니까요.

Push와 Local Notification의 다른점은 Push notification은 원격 서버에서 와서 유저에게 push 되는 겁니다.(내부적으로-locally- 따로 정해진 스케줄에 따라 일어나는 것이 아닙니다) 이건 셋업하는데 조금 더 복잡합니다 (보안 문제 같은것들을 생각해야 하거든요.) 그리고 서버를 셋업해야 되기 때문에 비용도 높은 편입니다. (유저가 많을 경우에는 더 그렇겠죠.)

Local notification을 보면 모든것이 유저의 device에서 locally 처리 됩니다. 그리고 미리 지정된 시간이나 간격 등이 세팅돼 있습니다. (scheduled) 그러니까 원격 서버가 필요 없는거죠. (추가적인 비용 발생이 없다는 겁니다.) 또 다른 잇점은 코로나에서 이 Locall Notification을 셋업 하는 것은 아주 쉽다는 겁니다.

사실 여러분들이 Push notification으로 하고자 하는 많은 것들을 local notification으로 할수 있는경우가 많습니다. 또 Local 로만 할 수 있는 것들도 있구요. 예를 들어 여러분들의 앱에서 원격에서 데이터를 가져올 필요가 없다면 Push 보다는 Local을 사용하는 것이 훨씬 더 나을 겁니다.


Scheduling Notifications


Notification에 대한 일정을 잡기 위해 (schedule) system.scheduleNotification() 함수를 사용해야 합니다.

신택스는 아래와 같습니다. 두 방법 모두 유효합니다.


system.scheduleNotification( secondsFromNow [, options] )
system.scheduleNotification( coordinatedUniversalTime [, options] )


이 함수는 나중에 notification을 cancle 하는 데 사용할 수 있는 reference ID를 return 합니다. 나중에 이 cancel 부분을 구현하려면 system.cancelNotification() 함수를 사용하시면 됩니다.

이 notification을 일정 시간 후로 일정을 잡으려면 secondsFromNow를 사용하거나 universal time을 사용해서 특정 date/time을 지정해 주시면 됩니다.

다룰 것들이 많이 있지만 오늘은 secondsFromNow를 사용해 보겠습니다. 만약 여러분이 coordinated universal time option을 사용하고 싶으시면 coordinatedUniversalTime argument에 대해 좀 더 자세한 설명이 있는  system.scheduleNotification() API 문서를 보세요.

두번째 argument는 secondsFromNow 를 선택했느냐 coordinatedUniversalTime를 선택했느냐와 관계 없이 사용하는 겁니다. 이것은 여러분의 notification에 대해 특정 정보를 보관하고 있는 options 테이블 입니다.

  • alert – 유저에게 보여지는 메세지 
  • badge – 앱 아이콘에 보여지는 badge number
  • sound – notificatin을 받으면 play 될 sound file
  • custom – Custom data/params to be used by your app, relevant to the notification (can be a variable, table, JSON string, etc).


개와 관련된 앱을 만든다고 가정하고 들어주세요. 여러분 앱은 10분(600초) 후에 강아지에게 먹이를 주어야 하는걸 알려주기 위해 notification 일정을 잡을겁니다. 그 예제는 아래와 같습니다.


local badge_count = native.getProperty( "applicationIconBadgeNumber" )

local notifyOptions =
{
   alert = "Time to feed your pet!",
   badge = badge_count + 1,
   sound = "woof.caf",
   custom = { scene = "pet_shop" }
}
local feed_notifier = system.scheduleNotification( 600, notifyOptions )



맨 처음에 native.getProperty( “applicationIconBadgeNumber” )를 사용해서 현재 application badge number를 받았습니다. 그리고 options table에서 그 숫자를 1 증가시켜서 세팅했습니다.

나머지는 그냥 보시면 아실겁니다. notification을 600초(10분)로 일정을 잡았고 두번째 인자로 notifyOptions table 을 전달했습니다.

notifyOptions table 안에 custom data로 launch_scene key 를 pass 했습니다. 이것은 이 notification을 받을 때 pet_shop으로 가도록 하기 위해 notification listener안에 있는 이 데이터를 보관하게 하는 겁니다. 나중에 이 데이터를 사용해서 pet_shop scene 으로 가겠죠. 이 custom 옵션에 무엇을 넣느냐는 전적으로 여러분 마음입니다.


Notification Listener


이 notification을 scheduling 하는 것은 단지 첫번째 step일 뿐입니다. 이제 이 notification을 받으면 어떤 것을 하도록 만들어야 합니다. 이 작업은 notification event listener 를 사용해서 작업합니다.

예제를 보여드리기 전에 여러분의 notification event listener function에 pass 될 event data를 알려드리겠습니다.

  • event.name – evnet.name은 항상 "notification” 입니다.
  • event.custom – 여러분이 custom option 을 통해서 pass 한 custom data 입니다.
  • event.type – 이 값은 항상 “local”이 될 겁니다.
아마 event.custom에 대해 궁금하시고 흥미로워 하실 겁니다. 

아래 notification listener 와 관련된 예제가 있습니다.


local function notificationListener( event )
    -- notification received, go to specified scene
    if event.custom.scene then
        storyboard.gotoScene( event.custom.scene )
    end
end
Runtime:addEventListener( "notification", notificationListener )


이 전에 notificatin schedule을 잡을 때 custom data로 scene key를 설정했죠? 위에서 보듯이 이 값은 event.custom에다 해당 key 값을 넣어서 그 value를 받아오도록 돼 있습니다. 프로그래밍을 하면서 다양하게 사용될 수 있겠네요.


NOTE: 위에서 보듯이 global Runtime object를 사용해서 notification event를 add 하실 수 있습니다. 


Canceling Notifications


system.cancelNotification() function를 사용하면 notification을 cancel 하실 수 있습니다. 이 함수를 call 할 때 두가지 옵션이 있습니다. system.scheduleNotification()에서 return 된 reference ID를 첫번째 argument에 넣어서 특정 notification을 cancel 할 수 있구요,  아니면 아무것도 안 넣고 현재 있는 모든 notification들을 cancel 할 수도 있습니다.


위에 예제로 만든 notification을 cancel 하려면 아래와 같이 하시면 됩니다.


system.cancelNotification( feed_notifier )

아래와 같이 하면 현재 schedule 된 모든 notification 이 cancel 됩니다.


system.cancelNotification()


launchArgs (Important)


유저가 여러분의 앱을 사용하고 있지 않을 때 local notification 이 왔다면 그 notification의 성격에 따라서 유저에게 알리거나 특정 scene으로 안내하고 싶으실 겁니다. 위에서 보았듯이 이런 작업은 notification event listener를 통해서 handle 해야 합니다.

문제는 여러분의 앱이 suspend 되거나 close 됐을 때 그 notification listener는 active 상태가 아니라는 겁니다.

경우에 따라 위의 예제의 경우 앱을 실행 할 때 main scene 이 아니라 pet_store로 가도록 해야 할 수도 있습니다. 이럴 때 launchArgs를 사용합니다. 


main.lua


local launchArgs = ...

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

local function notificationListener( event )
    -- notification received, go to specified scene
    if event.custom.scene then
        storyboard.gotoScene( event.custom.scene )
    end
end
Runtime:addEventListener( "notification", notificationListener )

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


if launchArgs and launchArgs.notification then

    -- call the event listener manually:
    notificationListener( launchArgs.notification )
end


위에서 보듯이 notification listener는 이전 예제에서 보여 드렸던 그 리스너랑 똑 같습니다. 다른 점은 main.lua 의 첫번째 라인에서 launchArgs  변수를 선언해서 실행 될 부분을 assign 한다는 겁니다.(the “…” is literal; not placeholder text).

notificationListener() function 내 어딘가에 launchArgs 에 attached 된 notification table 과 함께 앱이 시작됐는지 체크해야 합니다.

그러면서 이 listener function을 manually invoke 하게 됩니다. 이 listener 함수는 첫번째 argument로 launchArgs.notification 를 전달 했다는 것을 기억해 두세요.


여기까지 입니다. 코로나에서 local notifications 의 일정을 잡고 어떤 동작을 하도록 하는 것에 대해 모두 배우셨습니다. 이것을 활용하셔서 다양한 효과를 내실 수 있을 겁니다.

반응형


반응형


이사오고 나서 적응하느라고 바빴는데 메일함에 소포가 왔다가 갔다는 쪽지가 있었어요.


사람이 없어서 쪽지만 놓고 간 것 같은데.


찾아왔더니 코로나에서 보낸 소포더라구요.




저 멀리 캘리포니아에서 왔어요.

보낸 주소 보이시죠?

거기가 코로나 회사 주소인데요.

한가지 바뀐게 있습니다.

원래 코로나 SDK 의 회사 이름은 Ansca 였었는데 바뀌었습니다.

Corona Labs 나 Corona Labs Inc. 로 바뀌었습니다.

저도 이틀전에 공지가 와서 알게 됐어요.


회사 홈페이지와 트위터 그리고 페이스북 주소도 바뀔거랍니다.

아직 준비중이라서 공개하지 말아달라고 하던데요.

공식적으로 발표 되면 글 올릴께요.



명예대사들에게 티셔츠를 보낸다고 해서 그것만 기대했는데.. 센스있네요.



머그잔하고 가볍고 잘 튀는 고무공 그리고 공책, 펜, 스티커 이렇게 보내 줬네요.


공 하나만 더 보내주면 저글링을 할텐데... ^^


아주 열정적으로 회사를 운영하는 것도 Corona SDK 를 좋아하는 이유 중 하나입니다.

물론 SDK 자체도 아주 훌륭하고요. 계속 발전해 가고 있구요.


Corona Labs Inc. 화이팅입니다.


반응형