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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형
아래 싸이트에 Corona SDK로 cross platform 앱 개발시 지켜야할 10계명이 올라왔더라구요.

http://fullycroisened.com/10-strategic-tips-for-cross-platform-development-using-corona-sdk/

읽어보니까 많이 공감이 되네요.

그 10가지를 아래 소개합니다.



Corona SDK로 cross platform 앱 개발시 주의해야 할 10가지

1. 실제 기기에서 초기부터 그리고 자주 테스트 하라. 에뮬레이터를 너무 믿지 마라. 실제 기기에서 테스트 하라.
2. 시작하기 전에 해상도에 맞는 이미지 사이즈들을 어떻게 다이나믹하게 다룰지를 먼저 계획하라.
   (각 해상도에 맞춘 이미지들을 미리 계획한다면 많은 시간을 절약할 수 있다.)
3. build.settings 파일에 어떤 퍼미션들을 넣어야 하는지 알고 있어야 한다.
예)
    androidPermissions =
    {
      "android.permission.INTERNET",
      "android.permission.VIBRATE",
      "android.permission.READ_PHONE_STATE",
      "android.permission.CALL_PHONE",
     },
4. 좀 더 테스트 하라.
5. 각 플랫폼에 대한 API들의 제한 사항들을 알고 있어라.
   어떤 기능들은 플랫폼에 따라 기능이 제한 돼 있다.
6. 코딩을 하기 전에 모든것을 Sketch 하라.
   (이렇게 하면 분명 많은 시간을 절약 할 수 있다.)
7. 메모리 사용량과 texture map size 를 항상 체크하라.  
   이렇게 함으로서 쓸데없이 메모리를 차지하는 경우 (이를 일찍 발견하게 돼) 메모리 컨트롤을 더 쉽게 할 수 있다.
8. 지금 하고 있는 것을 다른 곳에서는 어떻게 처리 했는지 research를 해 봐라. 그리고 나서 진행하면 도움이 된다.
   그리고 이것을 공유하라 그리고 당신이 어떻게 좀 더 낫게 구현했는지 살펴 봐라.
9. 커뮤니티를 활용하라. 거기에는 도움을 줄 아주 많은 소스들이 있다.
10. 즐겨라. 코딩이 제일 잘 되는 시간은 밤 11:34부터 새벽 3:07분까지이다.

==> 대부분 공감을 하는데 10번은 공감을 못하겠네요.
일은 일하는 시간에 해야지... 그래야 능률도 더 잘 오르고......
이러면 완전 폐인 되잖아....
초창기에는 나도 밤 새 코딩을 하기도 했는데...
이제는 근무시간에만 딱 하는게 제일 좋더라구요.
밤에 할거면 차라리 일찍 자고 새벽에 일어나서 하던지.....
그리고 6번은 좀 더 강조 하고 싶어요. 단순히 스케치를 하라가 아니고 제대로 된  스토리 보드 만들고 다이어 그램 만들고 클래스/객체 설계도 만들고 진행하라고요. 제대로 기획을 해야 코딩도 제대로 하죠. 앱 만들 때 중요도 기획 80% 코딩 20%.  (내 의견)


  가시기 전 여기 손가락 꾹 ~~~~ ^^        추천 추천...
반응형

system.openURL() 로 전화 걸기

2012. 2. 3. 07:17 | Posted by 솔웅


반응형
안녕하세요?

제가 지금까지 잘 못 알고 있었던 것 같네요.

얼마전에(작년 12월 24일) 코로나에서는 native.showPopup() API를 새로 선 보였습니다.
이 API로 메일과 SMS를 보낼 수 있죠?
아래 제목의 글을 보시면 자세히 알 수 있습니다.
CoronaSDK 2011.715 버전 Email, SMS 기능 추가

이 API에서는 전화걸기 기능이 아직까지 지원되지 않고 있거든요.
그래서 코로나에서는 전화걸기 기능이 안되나? 했거든요.
그런데 예전부터 있었던 system.openURL()을 이용하면 코로나 앱에서 전화걸기 기능이 지원 되고 있습니다.

이 system.openURL()에 대해서 정리 해 놓고 가야겠습니다.

system.openURL()은 브라우저에서 웹페이지를 오픈한다던가 이메일을 생성한다거나 전화를 걸때 사용할 수 있습니다.

신택스는 아래와 같습니다.
system.openURL(url)

예) system.openURL("http://coronasdk.tistory.com")

파라미터로는 url을 사용하는데요.
아래 3개의 url이 올 수있습니다.

 * Email address: "mailto:nobody@mycompany.com"
    : 이메일 주소에는 물론 제목과 내용도 넣을 수 있습니다.
      예) "mailto:nobody@mycompany.com?subject=Hi%20there&body=I%20just%20wanted%20to%20say%2C%20Hi!"
-- %20은 한칸띄기입니다. url에서 사용되는 기호들은 여기를 참조하세요.
  * Phone number: "tel:415-867-5309"
  * Web link: "http://coronasdk.tistory.com"

Return값으로는 아무것도 받지를 않습니다.
그래서 제대로 동작이 수행 됐는지 안 됐는지를 알 수는 없겠네요.
(native.shouPopup()에서는 boolean으로 result값을 받습니다.)

CoronaSDK의 David라는 친구하고 이메일 주고 받다가 알게 됐습니다.
CoronaSDK DOC를 전부 정리하고 넘어간 줄 알았는데 이렇게 중요한걸 빠뜨렸었군요.

혹시 잘못된 정보로 혼란스러우셨던 분들께는 죄송합니다.

그럼...

반응형

New Game Center Request APIs

2012. 1. 29. 07:04 | Posted by 솔웅


반응형
얼마전에 Corona SDK의 Apple Game Center관련 새로 지원되는 기능에 대해 다뤘었습니다. (보시려면 여기를 누르세요.)

Corona는 거기에 덧붙여서 gameNetwork.request()에 몇개의 기능을 추가했습니다.
오늘은 이 추가된 기능에 대해서 살펴 보겠습니다.
이 기능을 테스트 하려면 Daily Build 2012.730 버전을 다운 받으셔야 합니다.


loadPlayerPhoto

이 Request는 유저의 게임센터 아바타를 로드할 겁니다. 그리고 이것을 display object로 생성할 겁니다.

gameNetwork.request( "loadPlayerPhoto",
{
        playerID = "G:0123456789",
        size="Small" -- "Small" or "Normal"
        listener=requestCallback
})

이 예제에서 보듯이 player의 아바타인 이 display object는 event.data(photo property)내의 requestCallback 함수를 통해서 접근할 수 있습니다.
이 request와 관련된 다른 중요한 property들이 더 있습니다.

그러므로 이 기능을 여러분의 앱에 사용하시기 이전에 업데이트된gameNetwork.request() documentation을 참조해 주세요.
(loadPlayerPhoto 부분을 참고 하시면 됩니다.)

    playerID (string)
    alias (string)
    isFriend (boolean)
    isAuthenticated (boolean)
    isUnderage (boolean)
    friends (array)
    photo (display object)


loadAchievementImage

이 기능은 loadPlayerPhoto request와 비슷합니다. 이미지를 로드하는 대신에 특정 achievement를 로드하는 것만 다릅니다.
이것은 achievement를 위해 여러분이 iTunes Connect에 올린 이미지를 가리킵니다. 그러니까 그 이미지가 코로나에서 지원하는 이미지에 합당해야 합니다. (24-bit PNG 파일이 가장 좋습니다.)

gameNetwork.request( "loadAchievementImage",
{
        achievementDescription=
        {
                identifier="com.appledts.twenty_taps"
        },
        listener=requestCallback
})

loadPlayerPhoto 처럼 이 request도 Corona display object를 생성합니다.
다만 이것은 event.data 테이블 내의 image 프로퍼티를 통해 접근합니다.
좀 더 자세한 사항을 보시려면 gameNetwork.request() API documentation의 loadAchievementImage부분을 봐 주세요.

title (string)
achievedDescription (string)
unachievedDescription (string)
maximumPoints (integer)
isHidden (boolean)
image (display object)

Placeholder Images
이 외에 소개될 2개의 기능은 애플의 complete/incomplete achievement image에 대한 것들입니다.
- loadPlaceholderCompletedAchievementImage
- loadIncompleteAchievementImage

이것은 Corona display object 형태로 애플에서 제공하는 achievement image(confirm/inconfirm)들을 리턴합니다.
만약에 유저가 자신의 이미지를 올리지 않았을 경우에 표시될 이미지들 입니다.
이 기능과 관련한 API는 loadAchievementImage와 같습니다. 다만 특정 achievement data를 명시하지 않는것만 다릅니다.
display 객체는 callback 리스너의 event.data 테이블의 image 프로퍼티를 통해서 접근될 수 있습니다.

Other Requests

loadFriends 같은 다른 request들도 있습니다. 이 request들도 위 request들을 사용하는 것과 같은 방식으로 코딩을 하시면 됩니다.  API documentation을 참조하세요.
아직까지 애플(iOS)의 게임센터 지원은 코로나 유료 사용자에만 한합니다.

이 글에 원본은 여기 가시면 보실 수 있습니다.

반응형

New Native Web and Video API’s 소개

2012. 1. 25. 07:07 | Posted by 솔웅


반응형
Using the New Native Web and Video API’s

native webView와 native video 객체와 관련한 새로운 API가 새로 나왔습니다.
이전의 Web Popupsvideo playback 의 한계를 많이 보완했습니다.

***** Web Views vs. Web Popups

이 두가지 콘셉은 상당히 비슷하지만 몇가지 다른 것이 있습니다.
- 한번에 한개 이상의 WebView를 가질 수 있음
- WebView는 다른 display객체들 처럼 회전시키거나 이동시킬 수 있다.
  (이 객체들이 native 객체들이기 때문에 아직까지는 group에 포함시킬수는 없음)
- phisics body를 적용할 수 있다.
- WebView는 반드시 확실하게(명시적으로) remove시켜야 함

***** Video Objects

Native 비디오 객체들은 그것을 계승한 media.playVideo보다 훨씬 유연합니다.

- 비디오 객체의 사이즈를 specify할 수 있다.(전체 스크린이 아니어도 된다.)
- 한 화면에 여러개의 VIDEO 객체들이 있을 수 있다.
- 비디오의 특정 위치를 프로그래밍으로 찾아서 사용할 수 있다.
- 프로그램에서 비디오를 play 시키고 pause 시킬 수 있다.
- 다른 display 객체들처럼 비디오 객체들도 움직이거나 회전시킬 수 있다.
  (이 객체들이 native 객체들이기 때문에 아직까지는 group에 포함시킬수는 없음)
- physics body를 적용할 수 있다.



***** native.newWebView() 사용법

신택스(syntax)는 아래와 같습니다.
native.newWebView( left, top, width, height [, listener] )

보다 자세한 사항은  API documentation 에 있습니다.

아래 예제가 있습니다.
local webView = native.newWebView( 0, 0, 320, 250 )
webView:request( "http://coronasdk.tistory.com" )

이 예제는 320*250 크기의 웹뷰를 생성하고 그 안에 http://coronasdk.tistory.com 를 display합니다.
request()함수 안에는 local HTML파일도 불러올 수 있습니다.

아래 예제는 웹뷰에 리스너를 단 예제입니다.

local function webListener( event )
    local url = event.url  -- reference to url being requested

    if event.errorCode then  -- is nil when there is no error
        native.showAlert( "Error!", event.errorMessage, { "OK" } )
    end
end

local webView = native.newWebView( 0, 0, 320, 250, webListener )
webView:request( "http://fakewebsitethatshouldthrowerror.com" )

보시면 webListener라는 리스너를 달아서 에러가 발생하면 alert화면을 띄워 줍니다.
이벤트의 파라미터로는 event.url, event.errorCode, event.errorMessage 가 있습니다.

아래 예제는 WebView를 회전(rotate) 시키는 예제 입니다.

local webView = native.newWebView( 0, 0, 100, 100 )
webView:request( "http://coronasdk.tistory.com/" )
webView.x = 200
webView.y = 240
webView.rotation = 45

-- let's close the webView
webView:removeSelf()
webView = nil

좀 더 자세한 사항은 API Documentation을 참조하세요.

그리고 샘플 코드는 /SampleCode/Interface/WebViewPhysics 에 있습니다.
(이 샘플 파일은 Corona build 2012.731 이후 버전에 있습니다.)

- 로컬 content를 load 할 때 약간의 버그가 있습니다. 이 버그는 조만간 수정될 예정입니다. -

***** native.newVideo()usage

native video object는 리스너가 없기 때문에 이해하가 더 쉽습니다.
비디오 객체를 생성하고 위치를 찾거나 이동시키거나 회전시키거나 physics를 적용하는 일만 하면 됩니다.
그리고 이 모든 일이 끝났으면 remove시키면 됩니다.

신택스는 아래와 같습니다.
native.newVideo( left, top, width, height )

보다 자세한 내용은 여기를 참조하세요.

아래 예제는 비디오 객체를 생성하고 비디오 파일을 로딩하고 특정 지점을 찾고 움직이고 회전시키고 그리고 최후에는 이 객체를 remove 시키는 예제 입니다.

local video = native.newVideo( 0, 0, 220, 275 )
 
-- load a video and jump to 0:30
video:load( "myvideo.m4v", system.DocumentsDirectory )
video:seek( 30 )
 
-- play video and move/rotate
video:play()
video.x = 50
video.y = 150
video.rotation = 90
 
-- pause the video and remove
video:pause()
video:removeSelf()
video = nil

예제 파일은  SampleCode/Interface/VideoViewPhysics 에서 볼 수 있습니다.
(이 샘플 파일은 Corona build 2012.731 이후 버전에 있습니다.)
보다 자세한 사항은 API documentation을 이용하세요.

위 내용 원본은 여기에 있습니다.
이 원본을 바탕으로 제가 간단히 요약 번역 했습니다.

native display들은 시뮬레이터에서 지원하지를 못합니다.
그리고 Corona build 2012.731 버전은 2012년 1월 24일 올라왔고 아직 유료 사용자에게 밖에 공개가 안 돼 있습니다.

다음에는 샘플코드를 분석해 보도록 하겠습니다.


반응형

iOS - armv6 (-19033) error

2012. 1. 25. 00:56 | Posted by 솔웅


반응형
최신 버전으로 Corona SDK를 업데이트 하고 새 앱인 Fireman을 아이폰용으로 빌드하려고 했더니 아래 메세지가 나오더라구요.

Your application built but failed to pass Apple's validation tests.
Your application cannot be uploaded to the App Store until it passes Apple's validation tests, though you may install it directly to provisioned devices.

warning: iPhone/iPod Touch: application executable is missing a required architecture.  At least one of the following architecture(s) must be present: armv6 (-19033)


이 에러는 찾아 봤더니 Corona SDK 710 버전 이후 부터는 Xcode 버전 4.2 이상이 되어야 한 답니다.

제 Corona SDK 버전은 726 이고 Xcode 버전은 3,2.5 라서 안 됐나 봅니다.

이와 관련된 질문과 대답은 아래 코로나 SDK 포럼에 있습니다.
http://developer.anscamobile.com/forum/2011/12/20/warning-armv6-19033

그리고 Xcode 다운로드는 아래 사이트에서 하시면 됩니다.
http://developer.apple.com/xcode/



반응형


반응형
새로 나오는 코로나 SDK 책 표지 디자인 공모

오는 2월 MobiDojo studio 의 Michelle Fernandez가 Corona Game Development Beginner's Guide라는 책을 출판 할 예정입니다.
현재 출판을 위한 집필은 모두 완성된 상태이며 단지 표지 디자인을 고민 중입니다.
1월 28일까지 이 책에 쓰일 표지 디자인을 공모합니다.
채택이 되면 아래와 같은 혜택이 있습니다.
1) 표지 디자인이 책에 사용되어질 겁니다.
2) 출판 되면 책 두권을 무료로 드립니다.
3) $100 의 상금을 받게 됩니다.
4) Corona SDK PRO 1년 사용권

이 외에 표지 디자인에 사용되지는 않지만 별도로 두명의 작품을 더 선정해서 Packt Game Library의 연회원으로 가입 시켜 드립니다.
이 연회원비는 $120 인데 이 비용을 지불할 필요없이 연회원이 되실 겁니다.

응모하실 작품은 photography@packtpub.com 으로 보내 주시면 됩니다.
보내실 작품은 아래 사항을 따라 주시면 됩니다.
1. 300dpi 해상도
2. 최소 너비 7인치 높이 5인치 (최대 길이는 제한 없음)
3. CMYK 칼라 모드
4. JPEG 파일 (채택이 되면 TIFF나 .PSK 파일을 주셔야 합니다.)
5. 파일 사이즈 2MB 이하

심사위원은 Ms. Fernandez와 팀원들이 할 겁니다.
예술적인 부분과 게임을 연상시키는 visual impact를 볼 겁니다.
물론 코로나도 연상되어야 하겠죠.

Deadline은 2012년 1월 28일  입니다.
참고로 이 링크1, 링크2 는 예전에 코로나 아이콘 콘테스트 등의 링크 입니다.

시간이 얼마 없지만 도전하고 싶은 분들 그리고 도전하실 분들 건투를 빕니다.



앵그리버드 (Angry Bird) 게임 만들기

아래 동영상은 영국 Brighton에서 진행된 Corona SDK 데모 중  Seb Lee-Delisle 가 30분만에 앵그리버드 같은 게임 만드는 방법이란 주제로 진행한 내용입니다.
도움이 될 것 같아 공유합니다.




반응형


반응형
그동안 작업하던 Fire Man이라는 게임이 안드로이드 마켓에 올라 갔습니다.

아직 Lite 버전이라 부족한 부분이 많습니다.
무료이니까요 Fire Man 많이 다운 받아 주시구요.
안되는 기능 있으면 많이 알려 주세요.
점점 더 완성도 있는 게임이 될 수 있도록 도와 주세요. ^^
(안드로이드 마켓의 게임 카테고리에 있는데 한국에서 다운 받을 수 있죠???)

Fireman이 세계를 돌아 다니면서 유적지에 붙은 화재를 진화한다는 Story입니다.
지금은 Italy 한곳만 돼 있구요. 곧 USA,China,India 도 업그레이드 될 겁니다.
Korea도 나올 거구요.


아이폰 앱스토어 용으로도 곧 나올 겁니다.
(지금 테스트 중 입니다. 아마존의 Kindle Fire용으로도 나올 예정이구요.)




유튜브에 올라온 게임 설명 동영상입니다. 참고하세요.

참고로 안드로이드 마켓에서 NOWBYTE로 검색하시거나  링크를 클릭하시면 제가 만든 앱들을 보실 수 있습니다.


반응형

Facebook Single Sign-On

2012. 1. 21. 00:46 | Posted by 솔웅


반응형
이 글은 Implementing Facebook Single Sing-On 으로 올라온 Corona SDK 튜토리얼을 번역한 글입니다.
이번주에 Corona SDK에서 새로 추가된 주요 기능에 대한 튜토리얼은 Game Center Integration, ScrollView Widget, Facebook Single Sign-On 이렇게 세가지 입니다.
오늘 facebook Single Sign-On을 다루면 모두 다 소화하고 가는 거네요.

Implementing Facebook Single Sign-On
Jonathan Beebe

Corona SDK 의 Facebook Single Sign-On 기능은 iOS와 Android 모바일 디바이스에서 가능합니다. (그리고 만들기에 안드로이드 쪽이 사용이 훨씬 간편합니다.)
이 기능은 Corona Build 2011.707 이후 버전에서만 지원 됩니다.
오늘 날짜 기준으로 Corona에서는 Build 2011.704를 무료 배포 버전으로 오픈했기 때문에 유료 구매자가 아니면 707 버전이 공개될 때까지 기다리셔야 됩니다.

***** Your Facebook App

우선 여러분의 앱을 Facebook에 등록해야 합니다.
그러면 여러분은 App ID를 받으실 수 있습니다. 그 이후에 앞으로 진행하는 일들을 하실 수 있습니다.
아래 링크를 따라가서 여러분의 앱을 등록 하세요.

https://developers.facebook.com/apps

저도 이 부분은 등록을 한적이 한번도 없어서요 자세히 설명을 드리지는 못하겠네요.

우선 위 링크로 가면 이 화면이 나옵니다. (facebook에 로그인을 안 했으면 로그인 하라는 화면부터 나올 겁니다.)



Create New App 버튼을 누르면 App Display Name 과 App Namespace를 넣으라는 화면이 나옵니다.

오른쪽에 ?에 마우스를 올려 놓으시면 그게 뭔지 설명이 나옵니다.

그리고 동의란을 체크하고 Continue버튼을 누릅니다.




다시한면 Security Check를 위한 화면이 나오고 해당 텍스트를 입력 한 다음에 submit을 누르면....




이렇게 핸드폰 번호나 신용카드로 인증과정을 사전에 거쳐야 다음 사항을 진행 할 수 있다고 나옵니다.
그 다음 과정은 진행해 보지 않았습니다.
지금 회사라서 주말에 집에서 차근차근 해 봐야겠습니다.

일단 이 과정들을 모두 거쳐서 햅이 등록됐다고 치고 다음 단계를 보겠습니다.


앱이 등록된 후 Native iOS App 이나 Native Android App를 체크해야 합니다.

iOS앱에서는 iOS Bundle ID가 Corona를 빌드한 provisioning profile과 같아야 합니다. 그리고 iPhone App Store ID 란에 여러분의 iTunes App ID를 넣어야 합니다. 여러분의 앱이 iTunesConnect 포탈에 추가 됐으면 여러분의 앱에 App Store ID가 부여 됐을 겁니다. (앱을 업로드하기 이전에도 받을 수 있습니다.)

아직 여러분의 앱이 iTunes App ID가 없다면 다른 iTunes App ID를 쓰셔도 됩니다. 하지만 나중에 앱이 ID를 받게 되면 곧바로 바꾸셔야 합니다.

제대로 된 bundle ID와 정확한 iTunes ID를 입력하는 것은 아주 중요합니다. 그렇지 않으면 여러분 앱에 Facebook을 implementation 하지 못합니다.

***** build.settings
이 부분은 iOS에만 해당 되는 것입니다. 안드로이드용 앱에는 build.settings에 아무것도 할 필요가 없습니다.

iOS는 CFBundleURLTypes키를 넣어야 합니다. 그 안에 CFBundleURLSchemes 키를 넣기 위해서요.
아래 샘플 코드가 있습니다.
settings = {
    iphone = {
        plist = {
            UIApplicationExitsOnSuspend = false,
            CFBundleURLTypes =
            {
                {
                    CFBundleURLSchemes =
                    {
                        "fbXXXXXXXXXXXXXX",
                    }
                }
            }
        }
    }
}
괄호가 너무 복잡하게 돼 있죠? 그냥 이거 복사해서 쓰세요.

디폴트로 UIAppLicationExitsOnSuspend는 기본으로 false로 세팅돼 있습니다.  그래서 이 부분을 명시하지 않아도 false로 세팅됩니다.
위에 굳이 false로 선언한 것은 만약 이것이 false가 아니면 작동하지 않기 때문에 그것을 remind하기 위해 넣었습니다.
"fbXXXXXXXXXXXXXX 부분에 X표시들은 여러분의 Facebook App ID를 넣으셔야 할 부분입니다.
이 CFBundleURLSchemes에 더 많은 URL schemes를 넣으실 수 있습니다.
CFBundleURLSchemes =
{
    "fb1234567890",
    "YourCustomScheme",
    "AndAnotherOne"
}

Test, test, test!
이렇게 세팅하면 facebook 싱글 사인 온 작업을 할 수 있습니다.
하지만 반드시 테스트를 해 보는건 기본이죠.

facebook.login()함수를 call했을 때 Facebook app이 디바이스에 인스톨 돼 있으면 그것이 나올 겁니다. 그리고나서 당신의 앱을 인증하라고 나올 겁니다. (아직 한번도 인증과정을 거치지 않았다면요)
facebook앱이 없다면 웹브라우저가 실행 될 겁니다. 그리고 유저가 로그인 과정을 다 거치면 다시 원래 앱으로 돌아 올 겁니다.
(이 과정에서 UIApplicationExitsOnSuspend 에 false로 선언되어 있어야 제대로 동작합니다.)

자 여기까지가 Facebook Single Sign-On 을 implemation하는 과정입니다.
facebook쪽 등록하는 부분하고 Corona SDK에서 iPhone인 경우 build.setting에 등록하는 부분이 좀 작업을 해야 하네요.
반면에 안드로이드 쪽은 Facebook쪽에만 등록을 시키면 그 다음엔 별다른 세팅 없이 진행 시킬 수 있나 봅니다.

여기까지 완료 됐으면 이제 facebook single sign on 을 할 기본 환경이 갖춰진 것이구요.
이제 여러분이 코딩하면서 facebook을 이용하면 됩니다.


여기를 클릭하시면 위와같이 Corona SDK의 facebook관련 API를 보실 수 있구요.


SampleCode-Networking-facebook으로 가시면 위와같은 샘플 앱이 있습니다.

이 부분은 나중에 자세히 다뤄 보겠습니다.

반응형

Game Center Integration (iOS)

2012. 1. 20. 06:26 | Posted by 솔웅


반응형
Tutorial: Game Center Integration (iOS)
Jonathan Beebe

iOS의 게임센터를 이용할 수 있는 기능이 daily build 2012.725에 포함 됐습니다.
이 iOS 의 Game Center를 어떻게 이용해야 하는지 살펴보겠습니다.
이번에 선보인 iOS Game Center 이용 기능은 기존의 gameNetwork API의 연장입니다.

iOS Game Center를 이용하기 위해 Apple side에서 어떤 일을 해야 하고 (iTunes Connect), 코로나에서는 어떤 셋업이 필요한지 그리고 여러분의 앱에서 이 기능을 제대로 이용하려면 어떻게 해야 되는지에 대해 간단히 알아보겠습니다.

Game Center는 다른 game networks(OpenFeint, Papaya)와 비교해서 좀 다른식으로 적용해야 합니다. build.settings와 System Event 파트를 다룰 때 이 부분을 이야기 하겠습니다.

***** iTunes Connect
Link: Visit the iTunes Connect Portal

Game Center를 이용하기 위해 Apple 쪽에서 해야 할 일에 대해서는 자세히 언급하지는 않겠습니다.
간단히 말해서 여러분은 여러분의 앱에서 Game Center 기능을 이용하기 위해 우선 Leaderboard(high score boards)와 Achievements 를 생성해야 합니다.
또한 개개의 Leaderboard와 Achievement ID도 할당해 줘야 합니다.

1. Manage Your Application 링크를 클릭


2. 여러분의 앱 아이콘을 클릭


3. 오른쪽에 있는 파란색의 Manage Game Center 버튼을 클릭



4. Enable 버튼을 클릭


5. Leaderboard 와 Achievements 부분에 있는 Edit(Set up) 을 클릭


6. Leaderboards와 Achievements를 추가


7. 각각의 Leaderboard ID와 Achievement ID



물론 여러분의 게임에 Achievements(혹은 Leaderboard)를 넣고 싶지 않다면 이 부분은 그냥 지나가셔도 됩니다.

***** build.settings

주목:이 파트는 여러분들이 Game Center를 이용하려고 하던지 OpenFeint와 Game Center를 동시에 이용하려고 하던지 어떤 경우에도 아주 중요합니다.
만약 여러분이 OpenFeint를 사용하지 않고 오직  Game Center만 사용하려고 한다면 코로나에 openfeint 컴포넌트를 앱에서 빼내 버리고 컴파일 하라고 알려줘야 합니다.

그 방법은 아래와 같이 components 테이블에 빈 대괄호만 넣어 주면 됩니다.
settings =
{
    iphone =
    {
        components = {}
    }
}

OpenFeint와 Game Center 를 모두 사용하시려면 openfeint 컴포넌트를 사용할 거라고 build.settings에서 확실히 알려 줘야 합니다.
settings =
{
    iphone =
    {
        components = { "openfeint" }
    }
}

build.settings와 관련해서 알아야 할 또 하나는 Leaderboards 와 Achievements를 셋업하지 않고 테스트만 하고자 할 경우 여러분은 GKTapper Xcode 샘플을 이용해서 구현 할 수 있습니다.
그러기 위해서는 아래와 같이 하시면 됩니다.
settings =
{
    iphone =
    {
        plist =
        {
            CFBundleIdentifier = "com.appledts.GKTapper",  -- temporary line for testing!
        },
        components = {}
    }
}

***** System Events and initCallback
일반적으로 gameNetwork.init()은 main.lua 처음 시작할 때 불려 집니다. 그리고 앱이 끝날 때까지 다시 불려질 일은 없습니다. Game Center를 이용하는 방법은 이 gameNetwork.init()과 비교해서 크게 두가지 다른 점이 있습니다.
Game Center는 iOS안의 system-wide 프로세스입니다. 유저들은 앱이 suspend될 때마다 Game Center에서 로그 아웃 됩니다. 그래서 앱이 applicationStart 시스템 이벤트를 Receive 받을 때마다 gameNetwork.init()을 불러야 할 겁니다. 이것이 첫번째 다른 점 입니다.
두번째 다른 점은 init request가 마무리 됐을 때 한번 불려지는 initCallback 함수 입니다.

아래 소스는 network 제공자로 Game Center를 사용할 때 gameNetwork.init()을 어떻게 사용해야 하는지를 보여주는 코드입니다.

local gameNetwork = require "gameNetwork"
local loggedIntoGC = false

-- called after the "init" request has completed
local function initCallback( event )
    if event.data then
        loggedIntoGC = true
        native.showAlert( "Success!", "User has logged into Game Center", { "OK" } )
    else
        loggedIntoGC = false
        native.showAlert( "Fail", "User is not logged into Game Center", { "OK" } )
    end
end

-- function to listen for system events
local function onSystemEvent( event )
    if event.type == "applicationStart" then
        gameNetwork.init( "gamecenter", initCallback )
        return true
    end
end
Runtime:addEventListener( "system", onSystemEvent )

initCallback 리스너 함수를 보면 event 테이블에는 한개의 프로퍼티 event.data 가 있습니다. 이것은 Game Center 에 로그인이 성공하면 true가 되고 실패하면 nil이 됩니다.
유저가 로그인 상태가 아닐 경우 체크해서 어떤 핸들링을 할 수가 있습니다.
좀 더 자세한 사실은 gameNetwork.init() documentation 를 보세요.


***** Game Center Request
Game Center를 사용할 때 아래 열거한 것들을 gameNetwork.request()와 함께 사용될 수 있습니다.
    •    setHighScore
    •    loadScores
    •    loadLocalPlayer
    •    loadPlayers
    •    loadFriends
    •    loadAchievements
    •    unlockAchievement
    •    resetAchievements
    •    loadAchievementDescriptions
    •    loadFriendRequestMaxNumberOfRecipients
    •    loadLeaderboardCategories

보다 자세한 용도를 보려면 gameNetwork.init() documentation 를보세요.
대부분의 위 request들은 요청한 데이터를 받기 위한 리스너를 가질 수 있습니다.
Game Center request(요청) 들에서 가장 헛갈리는 부분은 이 이벤트 테이블을 통해서 어떤 데이터가 당신의 callback 리스너에 전달 되느냐 입니다. 다시 한번 말씀드리자면 보다 자세한 사항은 gameNetwork.init() documentationOfficial Game Kit Documentation 안의 해당 페이지를 통해 알아 볼 수 있습니다.
만약에 fail일 경우 JSON 스트링을 통해 event table에 encode됩니다. 그리고 전화기의 native alert으로 전화기 화면에 표시 됩니다. 아래 샘플 예제를 참조하세요.
local gameNetwork = require "gameNetwork"
local json = require "json"

-- callback listener for Game Center requests
local function requestCallback( event )
    if event.type == "loadFriends" then
        local data = json.encode( event.data )
       
        -- show encoded json string via native alert
        native.showAlert( "event.data", data, { "OK" } )
    end
end

gameNetwork.request( "loadFriends", { listener=requestCallback } )

***** Corona GCTapper Sample
이상으로 GameCenter의 아주 기본적인 사항들을 살펴 봤습니다.
Corona SDK에서는 Apple의 GKTapper Xcode Sample 을 수정해서 Corona에서 사용할 수 있도록 했습니다.
아래 링크를 클릭하시면 그것을 이용한 샘플 코드를 받아 보실 수 있습니다.
View the Corona Game Center Sample Project on Github

위 내용 원본은  Corona SDK 웹싸이트에있습니다.
http://blog.anscamobile.com/2012/01/tutorial-game-center-integration-ios/

오늘은 iOS Game Center를 사용하기 위한 기초 지식을 공부했구요.
다음엔 위에 다운 받은 샘플 파일을 분석할 생각입니다.

반응형

New, More Flexible ScrollView Widget

2012. 1. 15. 06:55 | Posted by 솔웅


반응형
오늘은 2012.721 버전 이후부터 적용된 ScrollView Widget 에 대해 알아 보겠습니다.

그러니 이 기능을 직접 테스트 해 보시려면 2012.721 버전 이상되는 Corona SDK를 설치 하셔야 합니다.

확인해 보니까 지금 일반에 공개된 버전은 2011.704 버전이네요.
유료 사용자가 아닌 경우는 일반에 공개된 이후에 사용하실 수 있을 겁니다.

아래 내용의 원본은 여기 입니다.
그리고 자세한 API를 보시려면 여기를 클릭하시면 됩니다.

그럼 이번에 새로 추가된 기능에 대해 알아보겠습니다.

About Widgets

코로나의 위젯 API는 간단히 여러 플랫폼에 적용되는 코딩을 위해 만들어 졌습니다. 간단한 몇줄의 코드로 버튼, 탭 바, 슬라이더, Picker Wheel, Lists, 스크롤 되는 콘텐트 등을 스크롤 뷰 위젯에 덧 붙일 수 있는 기능을 제공합니다.
모바일 기기는 그 크기가 제한되어 있기 때문에 어느 기종이나 앱에 스크롤 되는 기능이 많이 필요합니다. 코로나에서는 이러한 기능을  scrollView Widget 에서 제공 합니다.

Basic Usage

스크롤 뷰 위젯의 가장 기본적인 이용법은 단지 몇개의 파라미터들을 정하고 디스플레이할 객체를 만들고 그 객체를 스크롤 뷰에 넣으면 됩니다.
아래에 그 예제가 있습니다.

local widget = require "widget"
local scroller = widget.newScrollView{
    width = 320,
    height = 480,
    scrollWidth = 700,
    scrollHeight = 1000
}

local obj = display.newImage( "myobject.png" )
obj.x = 400
obj.y = 500

scroller:insert( obj )

코드를 한번 보겠습니다.
- 첫번째로 widget을 require 합니다.
- 파라미터를 정합니다. 320,480은 아이폰의 해상도 입니다.
- scrollWidth,scrollHeight 파라미터는 스크롤뷰가 어디까지 스크롤 되는지를 정해 줍니다. 이 값은 어떤 객체가 주어지느냐에 따라 자

동적으로 늘어날 겁니다.
- 객체를 생성하고 위치를 설정합니다.
- 이 객체를 스크롤 뷰에 넣습니다.
이것이 스크롤 뷰를 사용하는 가장 기본적인 방법입니다.

위 코드만 가지고도 (이미지 파일만 있다면) 기본적인 스크롤 기능을 구현할 수 있습니다.

위 아래로 움직이지 않고 옆으로 움직이도록 하려면 아래 코드를 덧붙이기만 하면 됩니다.
scroller.content.verticalScrollDisabled = true
디폴트는 아래 코드 입니다.
scroller.content.horizontalScrollDisabled = true

Clipping the Width and Height

스크롤 뷰가 화면 전체를 차지하지 않고 일부분만 차지하도록 하려면 어떻게 할까요?
현재로서는 bitmap mask를 사용하는 방법 밖에는 없습니다.
이 방법도 코로나 개발팀에서 아주 간단히 코딩할 수 있도록 신경을 썼다고 합니다.
특정 크기로 스크롤 뷰를 만들기 위해 비트맵 마스크를 사용하려면 간단히 그 크기(width,height)를 정하는 파라미터를 세팅하고  해당하는 비트맵 마스크를 만듭니다. 그리고 그 비트맵 마스크의 파일 이름으로 maskFile 파라미터를 사용합니다.

    local widget = require "widget"
 
    local list = widget.newTableView{
        width = 320,
        height = 410,
        maskFile = "mask320x410.png"
    }
위 예제는 테이블 뷰에 사용했구요, 스크롤 뷰에서도 똑같이 사용하시면 됩니다.

Buttons and Touchable Objects

주로 ScrollView 에 버튼 같이 터치 리스너를 받아 들이는 object(객체)들을 넣는 방법을 알아볼 겁니다.
스크롤 하기 위해 터치할 때하고 버튼을 누를 때 터치하고 구별해야 쓸모있는 스크롤뷰가 될 수 있겠죠?

이 기능을 사용하려면 takeFocus()를 사용하시면 됩니다.

local widget = require "widget"
local scroller = widget.newScrollView{
    width = 320,
    height = 480,
    scrollWidth = 700,
    scrollHeight = 1000
}

-- event listener for button widget
local function onButtonEvent( event )
    if event.phase == "moved" then
        local dx = math.abs( event.x - event.xStart )
        local dy = math.abs( event.y - event.yStart )
       
        -- if finger drags button more than 5 pixels, pass focus to scrollView
        if dx > 5 or dy > 5 then
            scroller:takeFocus( event )
        end
   
    elseif event.phase == "release" then

        print( "Button pushed." )
    end

    return true
end

local button = widget.newButton{
    label = "My Button"
    top = 300,
    left = 300,
    onEvent = onButtonEvent
}

scroller:insert( button )

위와 같이 버튼을 만들고 이 버튼을 scroller 에 insert를 합니다.

그리고 리스너 이벤트 함수인 onButtonEvent 에서 takeFocus를 구현해 주면 됩니다.
이벤트가 moved 일 때 5픽셀 이상 움직이면 scroller 에 포커스를 맞추고 그렇지 않고 손가락을 떼면 버튼에 포커스를 맞추게 됩니다.

Scroll Events
스크롤 뷰 이벤트의 기본 파라미터에는 아래와 같은 것들이 있습니다.
event.name - 항상 scrollEvent 입니다.
event.target - 실제 이벤트가 할당된 스크롤뷰 위젯에 대한 레퍼런스 입니다.
event.type - beganScroll, endedScroll,movingToTopLimit,movingToBottomLimit,movingToLeftLimit, movingToRightLimit 가 있습니다.
Limit 를 설정하게 되면 그 숫자에 따라 스크롤 뷰가 끝에 다다랐을 때 탄력있게 움직이게 됩니다.

Further Reading and Resources

이 기능들을 자세히 보려면 CoronaSDK의 샘플 코드 중 Interface 폴더에 ㅇㅆ는 WedgetDemo를 보시면 됩니다.
이 기능들은 최근에 발표된 화면(Scene) 전환 API인 Storyboard API와 어울려서 사용할 수도 있습니다.

그럼 샘플코드인 WidgetDemo 앱을 살펴 보겠습니다.


첫번째는 테이블 뷰입니다. (안드로이드에서는 리스트 뷰라고 합니다.)
손가락으로 터치후 움직이면 아래위로 리스트들이 보입니다.
그리고 특정 Row를 터치하면 그 로우에 해당하는 화면으로 넘어갑니다.



여기서 back 버튼을 누르면 이전 테이블 뷰(리스트 뷰) 화면으로 넘어갑니다.
이 소스를 보면 최근에 발표된 storyboard 기능을 사용해서 화면을 넘기고 있습니다.

나중에 이 소스를 분석하면 아주 좋은 공부가 되겠네요.

아래 탭을 보시면 테이블 뷰 이외에 scrollView 와 Other 가 있습니다.


스크롤 뷰를 누르면 이 화면이 나옵니다.
상하 좌우로 움직이면 이미지가 스크롤 됩니다.



그리고 others를 누르면 위 화면과 같이 Slide Bar 와 Date Picker 가 나옵니다.
아주 좋은 샘플이네요.

오늘은 최근에 새로 발표된 Corona SDK 의 Scroll View Widget 에 대해 알아봤습니다.
반응형