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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

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 를 시작하세요.

반응형

FAQ Wednesday #6

2012. 5. 25. 10:23 | Posted by 솔웅


반응형
FAQ Wednesday #6

Posted by

또 다른 FAQ를 다룰 수요일 입니다. 아래 5개의 질문과 답변이 있습니다.

Question 1

어떻게 Corona window를 데스크탑으로 다시 가지고 올 수 있죠?

Answer

윈도우 시스템을 사용할 때 발생할 수 있는 일입니다. 만약 external display 를 사용하고 있는데 프로그램이 display 없이 restart 했을 경우에 일어나죠. 프로그램이 hang 된 것이 아닙니다. 그냥 존재하지 않는 display에 표시하려고 하는 겁니다. Corona Windows Simulator에서 일어날 수 있습니다. (맥에서는 발생하지 않습니다.) 아래 윈도우로 다시 되돌릴 수 있는 방법이 있습니다.

- task bar에 있는 Corona Simulator tab에서 오른쪽 마우스를 누릅니다.
- move 를 클릭합니다.
- 화살펴 키를 누르세요.
- 없어진 window 가 display 에 보일 때까지 옮겨 주세요.
- move를 stop 하려면 Left click을 하세요.


이렇게 하시면 됩니다. 나중에는 윈도우에서 이런 상황이 발생하지 않도록 만들어지기를 바랍니다.

Question 2

Game Center에 제 최고 점수를 세팅했는데 없어졌어요. 왜죠?

Answer

최고점수를 세팅하거나 Achievement를 unlocking 하는 것을 Game Center 서버를 통해 전파하는데는 시간이 좀 걸립니다. 이 의미는 set 된 다음에 곧바로 새 점수나 achievement가 보이지 않는다는 얘기죠. gameNetwork.show API를 사용해서 새로운 정보를 return 받는데는 24시간 정도 걸릴 수 있다는 것을 예전에도 알려드린 바 있습니다. 최고 점수나 achievement unlock 을 하고 gameNetwork.request를 사용해서 loadScore 나 loadAchievement를 하는 것은 몇시간이 걸리지는 않습니다. 그냥 몇초 정도 걸릴겁니다. 단지 그것이 세팅되고 난 후 곧바로 그 정보가 count 되지는 않습니다. 곧바로 display 되어야 한다면 그 정보는 local에 저장되는것이 맞습니다.


Question 3

제 앱은 GameCenter에 대해 gameNetwork.init API를 사용합니다. Game center 로그인창을 띄우기 위해서죠. 유저가 로그인을 하지 않고 Cancel을 누를경우 제 앱에서는 이 후에 유저에게 다시는 sign in 하라는 메세지를 띄우지 않습니다. 이 Sign-in dialog 창(로그인 창)을 어떻게 하면 다시 띄울 수 있죠?

Answer

만약 유저가 게임센터 로그인창에서 Cancel을 누른다면 게임센터 initCallBall 은 event.data = false 라는 값을 return 할 겁니다. 로그인이 실패했다는 것을 알리는 것이죠. 유저기 앱에서 force quit 을 하지 않는 이상 혹은 native iOS Game Center 앱을 사용해서 다시 로그인을 하지 않는 이상 이 로그인 창을 다시 불러오는 방법은 없습니다. Note: false status를 받은 이후에 gameNetwork.init을 부르면 로그인 창이 다시 뜨지 않습니다.

성공적으로 로그인 하거나 앱이 resume 되고 유저가 계속 Game Center에 로그인 된 상태에서 initCallback은 event.data = true를 return 합니다. 이 true status를 받은 이후에 여러분의 앱은 다른 gameNetwork API를 call 해야 합니다.

이 behavior는 Corona에만 해당 되는 것은 아닙니다. Game Center의 흐름이 그렇습니다. 그리고 로그인 창이 다시 뜨지 않는것이 맞다고 생각합니다. 유저가 cancel을 했다는 것은 그 앱에서 Game Center를 사용하고 싶어하지 않는 다는 의미이기 때문입니다.

Question 4

왜 나는 안드로이드 디바이스에서 어떤 파일들은 access 할 수 없죠?

Answer

Corona에서 File access는 OS 에 근거해서 작동합니다. platform에 의존하는 것이죠. iOS 디바이스에서는 여러분은 Resource directory(main.lua 가 있는 곳)에서 file들을 access 할 수 있습니다. 그리고 Documents와 Temporary directory에서도 접근할 수 있습니다. 안드로이드에서는 Resource directory 접근에 제한이 있습니다. 왜냐하면 그건 실제 디렉토리가 아니기 때문이죠. 파일들은 zip 파일로 enclose 됩니다. 코로나는 audio와 image API를 사용해서 이미지와 오디오를 직접 로딩할 수 있도록 합니다. 하지만 file I/O API를 이용해서 Resource 파일에 접근하는데는 제한이 있습니다. 이 때문에 안드로이드에서는 Resource directory 나 그 subdirectory에 있는 파일에 접근하기 위해 Lua File System(LFS)를 사용할 수 없습니다. 안드로이드에서 Document와 Temporary directory에있는 파일과 서브디렉토리 접근은 가능합니다.

디렉토리를 생성하고 없애기 위해 LFS를 사용할 때 유념해야 할 부분들이 있습니다. 첫번째로 파일이다 디렉토리에 접근할 때 full path string을 사용하셔야 합니다. (system.pathForFile을 이용해서) 그리고 lfs.chdir이나 lfs.currentDir API를 사용하시면 안됩니다. 현재의 디렉토리 개념은 platform 별로 다릅니다.

Resource Directory는 platform 에 의존하는 것이죠. 이 디렉토리 안에 파일이나 서브디렉토리를 만들거나 작성할 수 없습니다.

Corona 파일 접근은 플랫폼의 파일 시스템 sandbox에 따라 제한을 받습니다. sandbox 는 OS와 다른 앱의 파일들로부터 독립적인 그 앱의 공간을 위한 제한을 둡니다.

서브디렉토리를 add 하는 것은 여러분 app 개발 하는데 필요할 겁니다. 하지만 거기에는 제한사항들이 있다는 것 (위에서 언급한 안드로이드 제한 등) 그리고 어떤 기능은 미래의 플랫폼에서는 implement 되지 않을 수도 있다는 것을 염두에 두셔야 합니다. 거기에 대한 대비책은 여러분의 파일이나 디렉토리를 최대한 simple하게 유지하셔서 미래의 변화에도 영향이 없도록 하는 방법이 있을 겁니다.

LFS는 Daily Build #2012.805 부터 implement 됐습니다. 좀 더 많은 정보는 여기를 보세요.

Question 5

어떻게 audoi stream 파일을 처음부터 restart 할 수 있죠?

Answer

Audio stream (audio.loadStream으로 audio를 로드 한 것)은 항상 남은 부분부터 play 합니다. 만약 다시 streaming 할 필요가 있으시면 audio.rewind나 audio.seek(0) 을 이용해서 오디오를 처음부터 다시 시작하도록 하실 수 있습니다.

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

반응형

수요일의 FAQ 5 번째 시간

2012. 5. 21. 06:58 | Posted by 솔웅


반응형

FAQ Wednesday #5


Question 1

Lua File System(LFS)를 추가하셨죠? /Documents directory 에서 파일 리스트를 얻으려면 어떻게 해야하죠?

Answer

Lua File System은 Corona build 2012.805 에서부터 추가됐습니다. 여기에서 튜토리얼을 읽어보실 수 있습니다.

LFS는 subdirectory도 만들고 지우고 접근할 수 있게 됐습니다. 구현은 디렉토리의 path를 담은 string을 만드는게 key 입니다. iOS와 Android에서는 3개의 main directory들이 있습니다. Resource, Temporary 그리고 Documents 가 그것입니다. 이것들은 Corona constant들을 사용해서 접근하게 됩니다. userdata constants들은 LFS에서 사용될 수  있으려면 string으로 변환 될 필요가 있습니다. system.pathForFile 는 userdata constant 로 변환 됩니다. (string 타입으로). 여러분은 base directory와 함께 파일이나 디렉토리명을 명시해주시면 됩니다. 그러면 그것은 전체 경로를 return 하게 됩니다.

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

위 코드는 다음과 같은 string을 return 할 겁니다. “/var/mobile/Applications//Documents/data”



아래에 file들 리스트를 LFS로 어떻게 출력되게 하는지에 대한 코드가 있습니다.


local lfs = require "lfs"

-- Print the files in the path
--
local function printDir( path )
    print( "\nFiles in path: " .. tostring( path ) )
 
    local pathType = ""
 
    -- Check to see if path exists
    if path and lfs.attributes( path ) then
        pathType = lfs.attributes( path ).mode
    end
 
    if pathType == "directory" then
        for file in lfs.dir( path ) do
            local str

            -- Skip the current and up-one directories
            if "." ~= file and ".." ~= file then
                str = file

                local fileAtr = lfs.attributes( path .. "/" .. file )
                if fileAtr then
                    str = str .. " --> (" .. fileAtr.mode .. ")"
                else
                    str = str .. " --> (none)"
                end

                print( str )
            end
        end
    else
        str = "Path is not a directory!"
        print( str )
    end
end


그리고 아래는 /Documents directory와 /Documents/data subdirectory 를 어떻게 불러서 출력하는지를 보여 줍니다. (만약 존재한다면)

path = system.pathForFile( nil, system.DocumentsDirectory)
printDir( path )
path = system.pathForFile( data, system.DocumentsDirectory)
printDir( path )


위 코드는 파일 이름들을 출력하는 대신 table(배열)에 담아서 활용할 수도 있을 겁니다.


Question 2


Resource 디렉토리의 파일에 접근을 시도할 때 warning과 error를 하나씩 받았습니다. 이거 버그인가요?


Answer

system.pathForFile 를 사용하고 베이스 디렉토리가 system.ResourceDirectory 일때  코로나는 file이 존재하는지 살펴보고 그 path에 대해 nil 값이 받아지면 warning 메세지를 발생시킵니다. 그런데 이것은 filename 파라미터가 실제로 디렉토리 이름이면 작동하지 않습니다. 이것을 이용해서 다음과 같은 트릭을 쓰기도 합니다. 

local path = system.pathForFile( nil, system.ResourceDirectory )


이렇게 하면 warning 메세지를 발생하지 않습니다. 그리고 Resource directory를 가리키는 string을 return 하죠. 이 Resource directory 밑에 subdirectory 의 경로를 생성할 필요가 있으면 다음과 같이 이것을 append 하시면 됩니다.

path = system.pathForFile( nil, system.ResourceDirectory)
printDir( path )
path = system.pathForFile( nil, system.ResourceDirectory) .."/".."data"
printDir( path )

Note : system.ResourceDirectory는 안드로이드에서는 Resource directory가 실제 file system의 일부분이 아니기 때문에 작동하지 않습니다.

그리고 Resource directory는 read-only 디렉토리라서 write 할 수 없다는 것도 기억하세요.


Question 3

single touch app에 Multitouch 세팅하기

Answer

이건 질문은 아니지만 하나의 tip으로서 알려드립니다. 코로나에서 디폴트는 multitouch off 입니다. 이 말은 touch listener 가 있다면 한번에 하나의 touch 이벤트를 받는 다는 말입니다. 만약에 유저가 스크린을 터치하고 있는데 다른 손가락으로 버튼을 tap 한다거나 다른 객체를 move 하면 아무 일도 일어나지 않습니다. 왜냐하면 이미 다른 touch 가 active 돼 있기 때문이죠. 이것은 landscape 모드에서 유저가 손가락을 스크린에 대고 있느라고 자주 발생할 수 있는 현상이죠.

해결 방법은 여러분 코드에 아래와 같이 구현하는 겁니다.

system.activate( "multitouch" )

이렇게 하면 스크린에 손가락으로 하는 모든 touch에 touch event를 발생할 겁니다. touch 리스너를 걸어놓은 객체를 터치하지 않는 이상 아무일도 발생하지 않을 겁니다. 그리고 리스너가 있는 객체를 터치하면 동작이 일어나구요. 그렇게 되면 좀 더 user friendly 한 앱이 될 겁니다.


Question 4

iOS에서 앱 아이콘의 badge number를 어떻게 clear 하게 할 수 있을까요?


Answer


Local Notification은 해당 Notification이 일어나면 앱의 아이콘에 badge number를 세팅할 겁니다.(그것은 뭔가 pending 된게 있다는 것을 알리기 위함이죠.) 하지만 이것을 어떻게 clear 시킬 수 있을 까요? 해답은 native.setProperty API에 있습니다.

native.setProperty( "ApplicationBadgeIconNumber", 0 )

이렇게 하면 앱 아이콘에 있는 badge number를 없앨 수 있습니다.

아래 badge를 clears 시키는 Local Notification code 예제가 있습니다.

display.newText( "Setting Local Notification ...", 10, 30 )

-- Options for iOS
local options = {
   alert = "Wake up!",
   badge = 1,
   sound = "alarm.caf",
   custom = { foo = "bar" }
}

-- schedule using UTC (Coordinated Universal Time) time + 60 seconds
local utcTime = os.date( "!*t", os.time() + 60 )
local notification = system.scheduleNotification( utcTime, options )

-- Local Notification listener
local notificationListener = function( event )
   display.newText( "Notification Received " ..  event.badge, 10, 70 )
   native.setProperty( "applicationIconBadgeNumber", 0 )
end

Runtime:addEventListener( "notification", notificationListener )

Note: badge number 가 증가하거나 감소하는것에 대해서 badge 관련된 부분의 documentation에 설명 돼 있습니다. 이것은 애플의 documentation에서 인용한 겁니다. 그리고 그 의미는 여러분이 코드 내에서 그 badge number를 증가시키거나 감소시킬 수 있다는 것이죠. 코드 내에서 여러분이 명시한 badge number는 icon 에 display 되게 됩니다. 이 badge number 를 0으로 세팅하면 badge를 clear(remove) 하게 됩니다.

Local이나 Push Notification은 아직까지 iOS에서만 가능합니다.

Question 5

유저가 스크린을 터치하지 않고 있으면 device가 sleep 모드로 가는데 제가 만든 게임을 하는 동안에는 그 현상이 안 일어났으면 좋겠습니다. 가능한가요?


Answer

Yes, and the solution is one of the “system” APIs that works on both iOS and Android (but not in the simulators).

가능합니다. system API를 이용하시면 iOS와 Android 모두에서 가능합니다. (시뮬레이터에서는 안 됩니다.)

system.setIdleTimer( false )  -- disable device sleep mode

idle timer를 false로 해서 디바이스가 sleep 모드로 가지 않도록 합니다. true로 가면 sleep 모드로 가게 됩니다. 디폴트는 true 입니다. 이것을 false로 하면 디바이스의 배터리가 더 빨리 닳을 수가 있다는 것을 감안해서 사용하시기 바랍니다.

여기까지가 오늘의 Question들 입니다. 여러분에게 유용한 정보가 되었기를 바랍니다.

감사합니다.


반응형

FAQ Wednesday #4 - Corona SDK -

2012. 5. 10. 08:51 | Posted by 솔웅


반응형

FAQ Wednesday #4

수요일입니다. FAQ 시간이죠. 아래에 자주 질문되는 5가지 문답이 있습니다. (FAQ)

Question 1

함수를 만들 때 가끔 함수 이름이 nil 이라는 에러 메세지를 가끔 보게 됩니다. 그것을 바로잡기 위해 이렇게 저렇게 코딩을 바꾸는데요. 함수 생성과 관련해서 올바른 방법은 뭔가요?

Answer

일반적으로 Lua 는 변수가 Local 일 경우에 변수에 forward references 를 요구합니다. 이 의미는 변수가 사용될 수 있게 하기 전에 변수가 정의 될 필요가 있습니다. 아래 예제를 보세요.


local function getTax( num )
    return num * 0.0825
end


print( getTax( 99.95 ) )

위의 코드는 정상적으로 동작할 겁니다. 왜냐하면 getTax가 먼저 정의 됐기 때문이죠.

print( getTax( 99.95 ) )

local function getTax( num )

    return num * 0.0825
end


The above doesn’t work because getTax is unknown and returns with a “nil” error. If you always define your variables or functions first (before being called), you won’t have any problems, but sometimes you can’t avoid it. Here is how you can fix 

위와 같이 하면 에러가 날겁니다. 왜냐하면 getTax가 아직 정의 되지 않았는데 print를 하니까 nil 에러가 날겁니다. 먼저 변수나 함수를 정의하면 (call 되기 전에) 문제는 없을겁니다. 그런데 좀 예외적인 경우도 있습니다.

local getTax -- forward reference

local function printTax()

    print( getTax( 99.95 ) )
end

function getTax( num )

    return num * 0.0825
end

printTax()

이 경우에는 작동합니다. 우선 변수 getTx가 먼저 정의 됐구요. 그 다음에 getTax 함수가 정의 되기 전에 이 getTax 함수를 call 했습니다. 그리고 나서 getTax 함수를 만들었습니다. 이 경우는 getTax는 함수이기 때문에 printTax 함수 안에서 이 getTax를 call 하는 경우는 getTax 함수가 이미 정의되고 값이 할당 된 후이기 때문에 제대로 작동합니다.

자주 하는 실수는 아래와 같은 경우가 있습니다.

local getTax -- forward reference

local function printTax()

    print( getTax( 99.95 ) )
end

local function getTax( num )

    return num * 0.0825
end

printTax()

이렇게 하면 nil 에러가 발생합니다. 그 이유는 getTax 함수가 local 로 선언됐기 때문입니다. 이미 getTax 변수를 local로 선언했습니다. 그러고 나서 함수 앞에 또 한번 local 을 붙인다면 Lua 는 새로운 local 변수를 정의하게 됩니다. 그래서 원래의 getTax 변수는 nil이 되 버리는 거죠. 직접 이 코드에 local을 붙였다 뺐다 하고 함수 선언의 위치를 여기 저기 바꾸면서 한번 테스트 해 보시면 많은 도움이 될 겁니다.

모든 변수를 global로 선언하면 이런 문제는 발생하지 않겠죠. global로 선언하려면 그냥 local 글자를 빼면 됩니다. 이렇게 global로 몇개의 변수를 선언하는 건 괜찮을 겁니다. 하지만 변수가 무수히 많거나 퍼포먼스가 문제가 된다면 이 방법은 추천하고 싶지 않습니다. 그리고 많은 변수들과 함께 모듈을 로딩하는 경우에도 추천하지 않습니다.

변수와 관련되서는 더 많은 부분을 보실 수 있습니다. Lua 5.1 Reference Manual을 보시기 바랍니다.

Question 2

native.webPopup으로 웹사이트에 접근 했을 때 어떻게 HTTP status code를 얻을 수 있을까요?

Answer

HTTP Status Code 는 웹서버에서 return 되구요 이것은 HTTP request가 성공적으로 동작했는지 아닌지를 알 수 있도록 해 줍니다. 아래 흔히 받을 수 있는 status code들이 있습니다.

  • 200 OK
  • 301 Moved Permanenly
  • 404 Not Found
  • 500 Internal Server Error

이것과 관련된 좀 더 많은 정보는 여기로 가서 확인하세요.

코로나에서는 native.wevPopupnative.webView은 HTTP status code를 제공하지 않습니다. 다만 network.request에서는 제공합니다. (현재까지의 버전에서는요.). wepPopup이나 webView 의 event.isError는 서버에 연결되지 않았을 때 발생하는 겁니다. 서버에는 접속했는데 404에러 (page not found) 가 났다면 isError는 발생하지 않습니다. 이 HTTP Status Code를 받으시려면 웹페이지에 처음 접속할 때 network.request를 사용하셔야 합니다.

아래 그 예제가 있습니다.

local function loadWebPage()
    native.showWebPopup(10, 10, 300, 300, url )
end

local function networkListener( event )

    if( event.isError ) then
        print( "Network error: ", event.response )
    else
        print( "Status Code: " .. event.status )
        if event.status == 200 then
            print( "Loading web page ..." )
            loadWebPage()
        else
            print( "Web page not loaded!" )
        end
    end
end

network.request( url, "GET", networkListener )

이 코드는 웹 페이지에 접근할 때 먼저 network.request를 call 합니다. status가 200이라면 loadWebPage가 call 될 겁니다. 그리고 페이지는 native.webPopup을 이용해 로드 될 겁니다.

Note: native.webBiew는 iOS에서 native.webPopup 대신에 사용하려고 만든 겁니다. 이 메소드가 웹페이지를 표시할 때 사용하시기를 추천합니다. 이 API도 조만간에 안드로이드, 맥, 윈도우에서도 사용할 수 있도록 하겠습니다.

Question 3

내가 빌드 할 때 Ansca가 저의 소스를 보나요? 제 소스를 빌드하기 위해 정보가 당신의 서버에 전달할 때 어떻게 보안이 유지 되나요?

Answer

온라인 빌드가 일어날 때 우리의 서버는 절대 여러분의 raw source code를 보지 않습니다. 마찬가지로 여러분의 프로젝트 이미지, 사운드 또는 다른 asset들도 보지를 않습니다. Lua script는 우리 서버로 보내지기 전에 미리 bytecodes로 컴파일 됩니다. 서버에는 이 컴파일된 데이터를 처리할 코로나 엔진이 있습니다. 이 서버에서도 그 컴파일 된 파일을 절대 저장하거나 모아두지 않습니다.

Question 4

제가 API 페이지 (댓글란)에 버그 report를 했습니다. 그런데 왜 고쳐지지가 않죠?

Answer

API 페이지의 댓글란은 버그를 report 하거나 질문을 하는 곳이 아닙니다. 이 부분은 API documentation의 에러나 빠진 정보에 대해 report 하는 부분입니다.

만약에 API의 버그를 발견하셨다고 생각하시면 bug report를 해 주세요. 링크는 Forum과 Documentation 페이지의 윗쪽에 링크가 있습니다. 그리고 보내실 때는 되도록 자세히 적어서 보내 주세요. build number, 디바이스, OS 정보까지 포함해서요.

그리고 버그가 발생하는 경우의 전체 코드(config 파일등을 포함해서) 를 보내주시는 것이 중요합니다. 단지 코드 몇줄만 넣고 이 부분이 잘 안 된다고 설명만 하신다면 우리의 to do 리스트의 우선 순위에서 멀리 밀려날 겁니다. 저희는 아주 많은 버그 레포트를 받습니다. 이것을 가지고 샘플 테스트 케이스를 만들어서 문제점을 테스트 하는 것은 시간이 걸리는 일 입니다. 가끔 config.lua 파일이나 build.settings가 없어서 문제점을 찾지 못할 때도 있습니다. 버그가 여러분 문제를 해결하는데 중요한 부분이라면 그 전체 파일을 보내주시고 그 버그를 보려면 어떻게 해야 하는지에 대한 설명을 같이 보내 주세요.

저희는 지금 새로운 documentation system 을 만들고 있습니다. 그리고 곧 발표하게 될 겁니다. 이 새로운 시스템은 댓글란이 없습니다. 그 때는 API 관련 질문은 포럼이나 bug report를 이용하셔야 됩니다.

Question 5

제 코드를 디버그 하려고 print 구문을 넣었습니다. 그런데 nil 에러가 많이 나요. 이 에러를 피할 수 있는 방법이 있나요?

Answer

아마 아래 코드처럼 해서 그런 문제가 발생할 겁니다.

print( "lineNumber = " .. lineNumber )

scoping problem이나 이전에 set  때문에 lineNumber가 nil 이라면  print 구문은 이렇게 나올 겁니다. “attempt to concatenate ‘lineNumber’ (a nil value)”.

이걸 해결 하려면 두 변수를 분리하기 위해 , 를 사용하실 수 있습니다.

print( "lineNumber = " , lineNumber )

이 경우에 concatenation error를 피할 수 있습니다. 그런데 이렇게 하면 lineNumber 값을 print 하기 전에 원하지 않는 공간이 생길 겁니다.

“tostring”. 또 다른 방법으로는 tostring을 사용하는 방법이 있습니다.

print( "lineNumber = " .. tostring( lineNumber ) )

이렇게 하면 해당 값이 string으로 변환 됩니다. number, string , table, display object 등을 가리지 않고 심지어 그 값이 nil이라도 string으로 변환되죠.  이렇게 하면 print error 없이 print 구문을 사용할 수 있도록 해 줍니다.

여기까지가 오늘의 질문들 입니다. 여러분께 많은 도움이 됐기를 바랍니다.


반응형


반응형

이번주에도 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 수요일의 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 을 이용해 주실것을 부탁드립니다.

반응형

Corona SDK로부터 받은 답변

2012. 4. 18. 07:35 | Posted by 솔웅


반응형

안녕하세요?

제가 이 블로그에서 받은 Corona SDK 와 관련된 질문 댓글 중 제 수준에서 답할 수 없는 것을 두건 Corona SDK에 문의 했었습니다.

오늘 아침 (4.17)에 보냈는데 오후에 답변이 왔네요.

feedback이 정말 좋네요. 고맙게도...


지금부터는 여러분들이 올리는 질문 (코로나 SDK에 대해) 에 더 성실히 답하고 모르는 건 이렇게 Corona SDK에 질문을 할 테니까 질문 많이 많이 올려 주세요.


오늘은 Kow님이 올리신 질문과 이상봉님께서 보내신 질문을 문의했었습니다.


오늘 온 답변 메일은 아래와 같습니다.





Changsoo,


Here are some answers to your questions from one of our team members:
아래 우리 팀원 중 한명이 당신이 보낸 질문에 대한 답변을 해 왔습니다.


1. 2012.03.28  KOW 
    Can I control 'MENU' Button on Android device with Corona SDK?  


You can override the Menu key by using Corona key listener as documented here...
Corona key 리스너를 사용해서 Menu를 오버라이드 할 수 있습니다. 문서는 아래에 있습니다.

 
2. 2012.03.26  Lee,Sangbong
    Regarding Image Sheets. If I use MASK on an object, screen becomes black except the object on Galaxy 2 LTE. There is no problem on other device. 



This sounds like the masking issue that was introduced in build 759 where textures are disappearing on devices with low-end graphics hardware.  It typically happens on devices with whose OpenGL max texture units are 2, the absolute minimum the OpenGL spec allows. We will work on this soon.

이 건은 빌드 759에서 나왔던 이슈 같습니다. low-end graphics 하드웨어에서 디바이스에서 texture가 사라지는 문제였는데요. 이 이슈는 특히  OpenGL max texture units 가 2인 디바이스에서 일어났습니다. 이 건에 대해서는 곧 해결하도록 하겠습니다.

You should be able to work-around this issue by reverting to build #758.

아마 빌드 758로 되돌아 가시면 이 현상은 일어나지 않을 겁니다.

이 상입니다.

이상봉님이 질문하신 내용은 빌드 759 이상에서 나오는 문제 같습니다. 오히려 그 이전 버전인 빌드 758로 돌아가면 그 문제가 없을 거라네요.

그리고 지금 그 버그를 수정중에 있다니까 조만간 그 정된 버전의 Corona SDK를  다운 받아 사용하실 수 있게 될 것 같습니다.

다른 분들도 질문이나 건의 또는 건설적인 의견이 있으면 댓글 달아 주세요.

Corona SDK 측에서 이렇게 확실히 신속하게 응답을 해 주니까 저도 여러분에게 좋은 답변을 드릴 수 있을 것 같습니다.

1번 KOW님의 질문에 대한 답변에서 보라고 했던 document는 제가 곧바로 번역해서 올리겠습니다.
혹시 테스트까지 하면 샘플을 올릴 수도 있겠죠?
아님 여러분 중에서 테스트 해 보신 후 성공하시면 샘플을 보내 주세요.

서로 공유하면서 필요한 자료를 share 하면 많은 도움이 될 것 같습니다.

감사합니다.



추천~~꾸욱~~


반응형


반응형

오늘은 Corona SDK 를 만든 회사인 Ansca의 CEO 강연을 하나 소개해 드리겠습니다.
얼마전 Carlos 공동 창업자가 2선으로 물러나면서 단독 CEO 가 된 Walter Luh 가 스탠포드 대학에서 한 강연입니다.

Corona SDK는 Lua 라는 Script Language를 사용하고 있는데요. 이 Lua 는 요즘 게임에 많이 사용되는 언어입니다.
앵그리버드도 이 Lua로 만든 겁니다.

이 Lua Language를 만든 사람이 Roberto Ierusalimschy 인데요. 스탠포드에서 교수로 있나 봅니다.
이 Roberto가 자신의 수업에 Walter를 초청해서 대신 수업을 진행한 화면입니다.

이 동영상을 보시면 Corona SDK에 대한 이해를 도울 수 있을 겁니다. 스탠포드 대학 학생들이 수업하는 분위기도 느낄 수 있구요.
한번 스탠포드 대학 수업에 같이 참여해 보시죠.





반응형
이전 1 2 3 4 5 6 7 8 다음