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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

Physics의 Collision Event

2011. 9. 27. 00:20 | Posted by 솔웅


반응형
오늘은 아래 이미지를 사용할 겁니다.
미리 다운 받으신 후 따라 하시면 편하실 거예요.

    


코로나의 충돌 이벤트 이름은 collisioin 이고 상태 (phases) 는 began 과 ended 가 있습니다.
이외에 collision과 관계된 이벤트는 preCollision 과 postCollision 이 있습니다.

이런 이벤트들을 사용하려면 먼저 리스너를 implement 해야 합니다.
코로나에서는 preCollision에 대해 글로벌하게 사용하지 말고 object  의 로컬 안에서 사용할 것을 권하고 있습니다.
퍼포먼스에 영향을 줄 수 있기 때문입니다.

또한 먼저 알아 두어야 할 것은 코로나는 physics 엔진으로 box2D를 사용하고 있습니다.
주의할 점은 collision 중에 physics objects를 modify,create, destroy 하지 말것을 권장합니다. 만약 collision 의 결과로 physics objects 를 수정,생성, destroy 하려면 timer.performWithDelay() 함수를 써서 시간 차를 두던가 collision handler 에 어떤 flag를 달라고 합니다.

첫번째 예제 소스를 보겠습니다.

local physics = require "physics"
physics.start()

local crate1 = display.newImage( "crate.png", 100, 200 )
physics.addBody( crate1, { density = 1.0, friction = 0.3, bounce = 0.2 } )
crate1.myName = "first crate"
 
local crate2 = display.newImage( "crate.png", 100, 120 )
physics.addBody( crate2, { density = 1.0, friction = 0.3, bounce = 0.2 } )
crate2.myName = "second crate"
 
local function onCollision( event )
        if ( event.phase == "began" ) then
                print( "began: " .. event.object1.myName .. " & " .. event.object2.myName )
        elseif ( event.phase == "ended" ) then
                print( "ended: " .. event.object1.myName .. " & " .. event.object2.myName )
 
        end
end
 
Runtime:addEventListener( "collision", onCollision )

우선 로컬 physics 변수로 physics 엔진을 require 해서 담습니다. 그리고 physics.start()로 physics 엔진을 시작합니다.
그리고 crate1이란 변수에 crate.png 이미지를 넣고 좌표를 100,200 으로 합니다.
-> 이 때 디바이스 화면에 이 그림이 그려 집니다.
그리고 crate1에 physics.addBody를 합니다.
나중에 collision을 체크할 때 이 addBody한 변수들의 collision을 체크하게 됩니다.
density,friction,bounce 는 나중에 collision 이 될 때 여러 값들을 바꿔 넣으면서 테스트 해 보시면 좋을겁니다.
그리고 다음 줄은 crate1 의 myName 을  first crate라고 정합니다.
myName은 미리 지정된 키워드가 아니라 개발자가 명명하는 겁니다.
그러니 아무거나 하시면 되요.

다음에 onCollision 함수를 만들어서 began 일 때 ended 일 때 Terminal 에 문자가 찍히도록 만듭니다.
그리고 리스너를 답니다.
Runtime 은 앱이 시작한 이후 끝 날 때까지 유효한 것이구요. 그 이벤트는 collision 입니다.
이 외에 이벤트는 tap, touch 등등 이 있습니다.
앱이 실행되고 있을 때 collision 이벤트가 발생하면 (addBody 한 변수들끼리 부딪히면) onCollision 함수를 실행 하라는 뜻입니다.

이제 이것을 실행하면 crate1 과 crae2 가 위에서 떨어져서 바닥 저 밑으로 지나가서 화면에서 사라지게 됩니다.

이렇게 되는 이유를 살펴보면요.
1. 떨어지는 이유 : Gravity를 설정하지 않으면 지구 중력값인 9.8이 적용 됩니다. 위에 코드에는 없지만 Gravity 값이 9.8로 지정되 있습니다. 그러니까 중력이 작용해서 밑으로 떨어지게 됩니다.
2. 밑으로 사라지는 이유 : 현재 addBody는 crate1과 crate2만 적용 됐습니다. 이 두개가 부딪히는 일이 없으므로 아무런 충돌이 일어나지 않습니다. 그러니 onCollision 함수가 호출 되지 않습니다.

자 이제 코드를 아래와 같이 살짝 바꿀까요?

local physics = require "physics"
physics.start()

local crate1 = display.newImage( "crate.png", 100, 200 )
physics.addBody( crate1, { density=3.0, friction=0.5, bounce=0.3 } )
crate1.myName = "first crate"
 
local crate2 = display.newImage( "crate.png", 100, 120 )
physics.addBody( crate2, { density=3.0, friction=0.5, bounce=0.3 } )
crate2.myName = "second crate"
 
local function onLocalCollision( self, event )
        if ( event.phase == "began" ) then
                print( self.myName .. ": collision began with " .. event.other.myName )
        elseif ( event.phase == "ended" ) then
                print( self.myName .. ": collision ended with " .. event.other.myName )
        end
end
 
crate1.collision = onLocalCollision
crate1:addEventListener( "collision", crate1 )
       
crate2.collision = onLocalCollision
crate2:addEventListener( "collision", crate2 )

위 코드는 리스너를 로컬로 선언한 겁니다.
앱이 실행되는 동안 리스너를 작동시키는 것이 아니라 (Runtime:addEventListener( "collision", onCollision ))
addBody한 object 들에 리스너를 다는 겁니다.
지금 까지 화면상으로 실행되는 것은 똑 같지만 메모리 관리적인 측면에서 보면 리스너를 로컬로 하는게 훨씬 낫겠죠?

자 그럼 addBody한 object들 끼리 충돌해서 onLocalCollision함수가 실행되고 Terminal 에 print() 함수 내에 있는 text들이 찍히도록 할까요?

그럼 이미지 하나만 더 불러와서 addBody를 하죠.

local ground = display.newImage( "ground.png" )
ground.x = display.contentWidth / 2
ground.y = 445
ground.myName = "ground"

physics.addBody( ground, "static", { friction=0.5, bounce=0.3 } )

위 코드를 physics.start() 밑에 넣으세요.
박스들이 땅에 부딪히면 멈추는 걸 할 거예요.
여기서 addBody에 다른 부분이 있는데 바로 "static"이 들어가 있는 겁니다.
이것은 중력의 영향을 받아서 움직이는게 아니라 고정돼 있게 하라는 뜻입니다.


이제 실행시키면 위의 화면 처럼 박스가 떨어지다가 땅에 부딪히고 몇번 살짝 바운스 하다가 설 겁니다. 터미널에는 print함수에 있는 내용이 찍히구요.

physics 엔진을 실감하기 위해 crate1을 살짝 옆으로 옮겨 볼까요?
local crate1 = display.newImage( "crate.png", 130, 200 )
이렇게 x좌표를 130으로 고치고 실행해 보세요.

박스가 내려오다 밑의 박스 옆쪽으로 부딪혀서 자연스럽게 돌다가 떨어질 거예요.
이 외에 setGravity 값이나, density, friction, bounce 값들을 많이 고쳐보면서 테스트 해 보세요. 많이 도움이 되실 겁니다.

지금까지 전체 소스는 아래와 같습니다.

local physics = require "physics"
physics.start()

local ground = display.newImage( "ground.png" )
ground.x = display.contentWidth / 2
ground.y = 445
ground.myName = "ground"

physics.addBody( ground, "static", { friction=0.5, bounce=0.3 } )

local crate1 = display.newImage( "crate.png", 130, 200 )
physics.addBody( crate1, { density=3.0, friction=0.5, bounce=0.3 } )
crate1.myName = "first crate"
crate1.setGravity = 2
 
local crate2 = display.newImage( "crate.png", 100, 120 )
physics.addBody( crate2, { density=3.0, friction=0.5, bounce=0.3 } )
crate2.myName = "second crate"
 
local function onLocalCollision( self, event )
        if ( event.phase == "began" ) then
                print( self.myName .. ": collision began with " .. event.other.myName )
        elseif ( event.phase == "ended" ) then
                print( self.myName .. ": collision ended with " .. event.other.myName )
        end
end
 
crate1.collision = onLocalCollision
crate1:addEventListener( "collision", crate1 )
       
crate2.collision = onLocalCollision
crate2:addEventListener( "collision", crate2 )

게임을 만들다 보면 적군하고 아군하고는 부딪히면 터지고 아군끼리나 적군끼리는 안 터지고 뭐 그렇게 해야 할 때도 있죠?

이렇게 어떨 때는 collision이 일어나고 어떨 때는 안 일어나야 할 때는
Collision categories, masking, and groups 를 사용합니다.

이 예제는 코로나 샘플 예제의 CollisionFilter 를 보시면 알 수 있습니다.


위 앱인데요. 풍선들이 화면 테두리에 맞으면 튕깁니다.
그리고 같은 색의 풍선끼리 맞아도 튕기구요.
대신 빨강하고 파랑 풍선은 서로 맞아도 튕기지 않습니다.



위 세개 이미지가 필요합니다.

코드는 아래와 같습니다.

**** physics를 require 하고 start 시킵니다.
local physics = require("physics")
physics.start()

***** 60 픽셀당 1미터로 지정합니다.
physics.setScale( 60 )

**** 아이폰의 statusBar를 없앱니다. 안드로이드에는 적용이 안 됩니다.
**** 그리고 안드로이드는 기본이 full screen 입니다.
display.setStatusBar( display.HiddenStatusBar )

**** 배경화면을 그려 줍니다.
local bkg = display.newImage( "stripes.png" )

**** 상하좌우 border 에 대한 categoryBits와 maskBits를 선언하고 여기에 friction과 bounce 값을 지정합니다.
borderCollisionFilter = { categoryBits = 1, maskBits = 6 } -- collides with (4 & 2) only
borderBodyElement = { friction=0.4, bounce=0.8, filter=borderCollisionFilter }

**** 상하좌우 경계선을 설정하고 static 으로 addBody 한 후 borderBodyElement를 적용합니다.
local borderTop = display.newRect( 0, 0, 320, 1 )
borderTop:setFillColor( 0, 0, 0, 0)        -- make invisible
physics.addBody( borderTop, "static", borderBodyElement )

local borderBottom = display.newRect( 0, 479, 320, 1 )
borderBottom:setFillColor( 0, 0, 0, 0)        -- make invisible
physics.addBody( borderBottom, "static", borderBodyElement )

local borderLeft = display.newRect( 0, 1, 1, 480 )
borderLeft:setFillColor( 0, 0, 0, 0)        -- make invisible
physics.addBody( borderLeft, "static", borderBodyElement )

local borderRight = display.newRect( 319, 1, 1, 480 )
borderRight:setFillColor( 0, 0, 0, 0)        -- make invisible
physics.addBody( borderRight, "static", borderBodyElement )

**** red와 blue라는 두개의 테이블(배열)을 선언합니다.
local red = {}
local blue = {}

** 두개의 categoryBits와 maskBits를 선언합니다.
local redCollisionFilter = { categoryBits = 2, maskBits = 3 } -- collides with (2 & 1) only
local blueCollisionFilter = { categoryBits = 4, maskBits = 5 } -- collides with (4 & 1) only

**** redBody와  blueBody를 선언하고 density,friction,bounce값을 지정합니다.
**** 두 object의 범위는 radius 43.0 입니다.
**** 이 둘을 각각 redCollisionFilter와 blueCollisionFilter 에 적용시킵니다.
local redBody = { density=0.2, friction=0, bounce=0.95, radius=43.0, filter=redCollisionFilter }
local blueBody = { density=0.2, friction=0, bounce=0.95, radius=43.0, filter=blueCollisionFilter }

**** 빨간 풍선과 파란 풍선을 4개 생성하는데 그 위치는 random하게 정합니다.
**** 여기에 addBody를 하고 redBody,blueBody를 적용해서 red,blue 테이블에 담습니다.
for i = 1,4 do
    red[i] = display.newImage( "red_balloon.png", (80*i)-60, 50 + math.random(20) )
    physics.addBody( red[i], redBody )
**** 부딪혀도 이미지가 돌지 않고 아래 위가 고정되게 합니다.
    red[i].isFixedRotation = true
   
    blue[i] = display.newImage( "blue_balloon.png", (80*i)-60, 250 + math.random(20) )
    physics.addBody( blue[i], blueBody )
    blue[i].isFixedRotation = true
end

이제 실행해 보세요.


다른 색의 풍선과 부딪히지는 않고 벽이나 같은 색의 풍선하고만 부딪힙니다.

categoryBits와 maskBits 은 바이너리 값입니다. 그런데 이것을 지금 10진수로 하고 있어서 많이 헛갈리네요.
코로나에서는 다음 버전에서는 바이너리 값이나 헥사코드값으로 할 예정이라고 합니다.

저도 값들을 이것 저것 고쳐가면서 해 봤는데 그래도 확실히 잘 이해를 못 하겠네요.
아래 샘플 테이블이 있습니다.


자세한 설명은 아래에 있습니다.
http://developer.anscamobile.com/forum/2010/10/25/collision-filters-helper-chart

혹시 이거 보시고 한국말로 자세히 설명해 주실 수 있으신 분 도움 부탁드립니다.

Collision Detection 엔 이것 외에 groupIndex와 propagation 이란 개념이 있습니다.

지금은 이 개념에 대해 자세히 살펴 볼 시간이 없네요.
관심 있으신 분은 아래 링크 참조하세요.

http://developer.anscamobile.com/content/game-edition-collision-detection

다음 시간은 Physics Bodies 에 대해 알아 보겠습니다.
지금까지는 단순히 object 에 addBody만 해 봤는데요.
좀 더 세밀한 것 까지 한번 살펴 보겠습니다.


반응형

Corona SDK 앱에 광고 달기

2011. 9. 23. 22:50 | Posted by 솔웅


반응형
지금 Physics 쪽을 하고 있는데요.
잠시 눈을 돌려 앱에 광고 달기를 한번 배워보고 가겠습니다.

현재 Corona는 공식적으로 inMobi 광고만 지원합니다.
inMobi는 인도계 회사로 애드몹과 더불어 모바일 광고시장 1,2위를 다투고 있다고 하네요.

곧바로 앱에 광고 다는 거 한번 살펴 보겠습니다.

일단 inMobi 광고를 사용하려면 config.lua 파일에 launchpad 를 표시해 줘야 합니다.


지난번 사용했던 config.lua 파일에 launchPad = true, 를 위와 같이 추가해 주세요.

그리고 main. lua 에 아래 코드를 넣어 주세요.
    local ads = require "ads"
 
-- Examples for inmobi:
 ads.init( "inmobi", "4028cb962895efc50128fc99d4b7025b" )

     -- following are iPhone, iPod Touch, iPad
 ads.show( "banner320x48", { x=0, y=1, interval=10, testMode=true } )

그러면 아래와 같이 나옵니다.


일단 아주 간단하죠?

안드로이드 광고 달 때 처럼 jar 파일을 추가하고 xml 파일에 코드 넣고 또 자바 파일에 넣고.. 어떤 때는 Menifesto 파일에도 코드를 넣고...

많이 복잡한테..
코로나는 광고 조차도 이렇게 간단히 해결 해 줍니다.

일부 개발자들은 Web 기능을 써서 admob 광고를 넣기도 하는데요.
이 부분은 아직 공식적으로 Corona에서 지원하는게 아니라서....
그리고 제가 해보지 않았구요.
그래서 아직 글로 쓸만큼 몰라서 다음에 해보고 올릴께요.

위의 코드를 보면 처음에 require "ads" 를 하는데요.
이걸 하려면 먼저 config.lua 파일에 launchPad 를 세팅해야 합니다.

ads.init( "inmobi", "4028cb962895efc50128fc99d4b7025b" )
위 코드는 init 함수인데요. 처음에 inmobi를 사용하겠다고 하는 것이고 그 다음이 inmobi에 등록된 appId 입니다.
위 번호는 iphone 용 테스트 id 라서 아직 inmobi에 가입하지 않았어도 테스트 할 수 있습니다.
신택스는 아래와 같습니다.
Syntax:
ads.init( providerName, appId )

안드로이드용 테스트 아이디는 아래와 같습니다.
4028cba631d63df10131e1d3818b00cc
그리고 inMobi 싸이트를 보니까 iOS 테스트 아이드는 아래도 있네요.
4028cba631d63df10131e1d4650600cd
또 아래 아이디도 나옵니다.
4028cba631d63df10131e1d3191d00cb
inMobi에 대해 더 세부적인 사항이 궁금하시면 아래 싸이트를 참조하세요.
http://developer.inmobi.com/wiki/index.php?title=Integration_Guidelines

4028cb962895efc50128fc99d4b7025b 는 아이폰에서 제가 직접 테스트 해 본 아이디구요. 나머지는 직접 테스트 해 보진 못했습니다.

 -- following are iPhone, iPod Touch, iPad
 ads.show( "banner320x48", { x=0, y=100, interval=5, testMode=false } )

이 코드를 넣으면 광고가 지정한 위치에 지정된 크기로 보입니다.
테스트를 위해서는 testMode=true 를 해야 합니다.
 Syntax:
 ads.show( adUnitType [, params] )

사용할 수 있는 배너 크기는 두가지 입니다.
    * "banner320x48"
    * "banner300x250"

또 iPad에는 아래 배너 크기도 사용할 수 있습니다.
    * "banner728x90"
    * "banner468x60"
    * "banner120x600"

파라미터를 보면 x,y는 각각 좌표값이고 interval은 광고 refresh 되는 주기 이고 디폴트는 10입니다.

아직 이 ads의 크기는 해상도에 따라 자동으로 바뀌지 않는다고 합니다.
세밀하게 ads 크기를 사용하려면 디바이스를 알아내서 거기에 맞게 배너 크기를 넣어야 합니다.

ads.hide() 함수도 있습니다.

이외에 inMobi 가입 및 appid 받는 방법은 아래 주소를 참조하세요.
http://developer.anscamobile.com/reference/banner-ads

오늘은 앱에 광고 다는 법을 봤구요.

다음시간에는 당초 스케줄 대로 physics 의 collision (충돌) 에 대해 보겠습니다.

감사합니다.




반응형

Corona SDK Physics API

2011. 9. 22. 23:30 | Posted by 솔웅


반응형
코로나의 Physics 엔진은 아주 강력합니다.
제가 경험했던 그 어떤 언어보다 강력한거 같아요.

개발자들은 아주 간단한 코딩으로 Physics 구현을 할 수 있거든요.
그리고 나중에 다루게 되겠지만 이것이 MultiTouch 기능이랑 합해지면 아주 다양하면서도 새로운 모바일 앱을 가능하게 해 줍니다.

이번에 제가 개발한 Multi Player Ping Pong 도 최대 4인용까지 사용할 수 있는데 4명이 동시에 이벤트를 발생해도 그것들을 다 처리해 줍니다.

이제 본격적으로 Physics 엔진 사용법을 살펴 봅니다.

local physics = require("physics")

이 physics 엔진을 사용하기 위해서는 처음에 위와 같이 선언합니다.
로컬변수 physics 를 사용해서 코로나의 physics 엔진을 사용하겠다는 의미입니다.

이 physics 엔진을 시작하고 멈추고 일시 정시 시키는 함수가있는데요.
아래와 같이 사용합니다.
physics.start()
physics.pause()
physics.stop()

그리고 아래와 body 에도 이를 적용할지 안할지를 아래 함수를 통해 제어할 수 있습니다.
(body 에 대해서는 조금 있다가 다룰 겁니다.)

physics.start(true)-- prevent all bodies from sleeping
physics.start(false) -- default behavior; bodies may sleep

중력(gravity)에 대해서도 선언할 수 있습니다.
기본적으로 중력값은 9.8 입니다. 그래서 코로나의 디폴트 중력값은 9.8입니다.)
physics.setGravity( 0, 9.8 )
지난 시간에 다뤘던 ManyCrates 의 main.lua 파일 안에 이 부분을 한번 적용해 보세요.
physics.start() 다음에 추가해 보세요.
physics.setGravity( 0, 3 ) 하면 달이나 뭐 그런데 처럼 박스들이 천천히 떨어지구요.
physics.setGravity( 0, 30) 정도로 하면 아주 무겁게 떨어집니다.

괄호 안의 숫자는 x,y 좌표를 나타냅니다.
앞의 0의 숫자를 고치면 왼쪽에서 오른쪽으로 중력이 작용합니다. (테스트 해 보세요.)

이 중력값 (gravity) 을 get 할 수도 있는데요.
gx,gy = physics.getGravity() 하면 gx에는 첫번째 인수값이 gy 에는 두번째 인수값이 들어갑니다.

다음은 Accelerometer (가속도) 에 대해 볼 건데요.

지난번 코드에 아래와 같이 추가해 보세요.
_W = display.contentWidth;
_H = display.contentHeight;

위 두개는 display.setStatusBar( display.HiddenStatusBar ) 밑에다 놓으세요.
그리고 맨 마지막에 아래와 같이 코딩 해 주세요.
(local dropCrates = timer.performWithDelay( 500, newCrate, 100 ) -> 이 코드 밑에요.)

local function onTilt( event )
        physics.setGravity( 10 * event.xGravity, -10 * event.yGravity )
        gx, gy = physics.getGravity()
        print("x Gravity = " .. gx .. " y Gravity = " .. gy)
        gravityx.text = gx;
        gravityy.text = gy;
end
 
Runtime:addEventListener( "accelerometer", onTilt )

이 accelerometer 기능은 핸드폰을 기울이면 그 기울이는 쪽으로 중력이 적용 되는 거예요.
그래서 시뮬레이터에서는 테스트 할 수 없구요. 디비이스에 인스톨 한 다음에 사용 가능해요.

빌드 하신 후 디바이스에 인스톨 하세요.
그리고 앱을 실행하시면 원래처럼 아래에서 위로 떨어질 거예요.
그리고 핸폰을 좌,우,상,하 바꾸면서 기울이시면 그에 따라서 박스들 떨어지는 방향이 바뀔거예요.

가운데 중력 값이 텍스트로 표시 되게 했으니 참고 하시구요.

이런 강력한 기능을 이렇게 간단하게 구현할 수 있다니 코로나 정말 매력적이예요.

코로나는 기본적으로 30픽셀을 1미터로 계산 합니다.
이 기능을 이용해서도 게임에 아주 재밌는 기능 구현을 할 수 있을 것 같은데요.
이 세팅값을 바꾸려면 아래 함수를 사용합니다.
physics.setScale(60)
이러면 60픽셀당 1미터로 계산 하겠죠?
이것은 코로나의 기준이고 아이폰이나 안드로이드 폰 그리고 해상도가 다름에 따라 주의를 기울여야 한다고 합니다.
자세한 내용을 보려면 Corona API Reference 의 autoscaling content for multiple screens 를 보라고 하네요.

자세한 내용은 저도 나중에 봐야겠습니다.

physics 엔진을 사용하면서 테스트 하거나 디버깅 할 때 setDrawMode 함수를 이용하면 편합니다.
이 함수에는 다음과 같이 세가지 옵션이 있습니다.

physics.setDrawMode( "debug" ) -- shows collision engine outlines only
physics.setDrawMode( "hybrid" ) -- overlays collision outlines on normal Corona objects
physics.setDrawMode( "normal" ) -- the default Corona renderer, with no collision outlines

hybrid를 적용하면 화면이 아래와 같이 나옵니다.



physics.body 가 적용되는 범위가 투명하게 다른 색으로 표시되고 테두리도 따로 그어져서 physics가 얼만큼 어디에 적용 되는지 알 수 있습니다.

debug를 적용하면 아래와 같이 나옵니다.


원래 이미지는 안보이고 physics.body가 적용 되는 범위만 보입니다.

위에 표시된 색들도 다른데요. 각 색깔별로 아래오 같은 의미가 있습니다.
    * Orange: dynamic physics bodies (the default body type)
    * Dark blue: kinematic physics bodies
    * Green: static physics bodies, such as the ground or walls
    * Gray: a body that is "sleeping" due to lack of activity
    * Light blue: joints

포지션을 체크하고 속도를 체크하는 경우도 많이 있는데요.
이것을 체크하는 주기도 아래와 같이 설정할 수 있습니다.
physics.setPositionIterations

Sets the accuracy of the engine's position calculations.

physics.setPositionIterations( 16 )

The default value is 8, which means that the engine will iterate through eight position approximations per frame for each object. Increasing this number will cause fewer momentary innacuracies (overlapping objects. etc.) but will increase computational overhead. The default value should be good for most general cases.
physics.setVelocityIterations

Sets the accuracy of the engine's velocity calculations.

physics.setVelocityIterations( 6 )

The default value is 3, which means that the engine will iterate through three velocity approximations per frame for each object. Increasing this number will cause fewer momentary innacuracies (overlapping objects. etc.) but will increase computational overhead. The default value should be good for most general cases.

포지션이나 속도롤 보다 세밀하게 체크해서 콘트롤 하시려면 위의 숫자값들을 큰 숫자로 하셔서 코딩하시면 되겠죠?

이러한 코로나의 physics engine은 Box2D 엔진을 기본으로 만들어 졌답니다.
Box2D is a free open source 2-dimensional physics simulator engine written in C++ by Erin Catto and published under the zlib license. It has been used in Crayon Physics Deluxe, Rolando, Fantastic Contraption, Incredibots, Angry Birds, Transformice, Stripe physics2, and many online Flash games,[3] as well as iPhone, iPad and Android games using the Corona framework.

코로나는 이 Box2D 엔진의 대부분 기능을 포함하고 있고 또 일부 포함하지 않는 기능도 있답니다.

코로나 웹싸이트에 정리된 내용을 옮겨 봅니다.
Porting Box2D applications from other platforms should be fairly easy. The Corona API includes most of the core features of Box2D, including:

    * Automatic world setup, scaling, and synchronization with visible Corona objects
    * Basic collision geometry (boxes, circles and arbitrary polygons)
    * Complex collision geometry (multi-element bodies)
    * Attributes for primary body and fixture properties
    * Collision events via Corona event listeners, including collision forces
    * Primary collision event phases: began and ended
    * Additional collision event types: preCollision and postCollision, which correspond to Box2D "preSolve" and "postSolve" collision features
    * Draggable object handling within the simulation
    * Eight types of joints: distance, pivot, piston, friction, weld, wheel, pulley and touch (some of these are renamed from their Box2D counterparts; see “Joints” section below)
    * Touch joints (based on Box2D "mouse joints") can be used with multitouch, for simultaneous dragging of 5-10 physics objects; see "DebugDraw" sample project
    * Joint motors and limits
    * Applied forces and impulses, both linear and angular
    * Dynamic gravity, including accelerometer-driven gravity
    * Sensors and bullets
    * Collision categories, masking and groups
    * “DebugDraw” mode, including an exclusive "hybrid" mode showing the debug view as an overlay
    * Joint and body destructors

Features not yet supported include:

    * Gear joints
    * Ray casting, region queries, etc.
    * Automatic resizing of physics objects when Corona display objects are resized with xScale/yScale attributes (avoid using xScale/yScale on an already-existing physical object in the meantime).

오늘은 코로나 SDK의 Physics engine 기본을 살펴 봤습니다.
다음 시간에는 physics를 입힌 물체끼리 충돌할 때 튕겨나간다든지, 약한 쪽을 부숴지게 한다든지 하는 효과를 줄 수 있는 Collision events 에 대해 살펴 볼 것 같습니다.

그럼 다음 시간에 뵐께요.



반응형

'Corona SDK > Corona Doc' 카테고리의 다른 글

Physics Joints 예제 코드  (0) 2011.09.29
Physics Joint  (0) 2011.09.28
Physics Bodies 코딩 하기  (5) 2011.09.28
Physics Bodies  (0) 2011.09.27
Physics의 Collision Event  (0) 2011.09.27
정말 매력있는 코로나의 Physics Engine  (2) 2011.09.21
config.lua 파일과 build.lua 파일...  (2) 2011.09.19
코로나 프로그래밍 기본 규칙...  (0) 2011.09.15
폰트 및 config.lua 파일에 대하여.  (10) 2011.09.14
처음으로 코딩 해 보기  (2) 2011.09.13


반응형
그동안 이론 공부하고 빌드하고 안드로이드 마켓하고 앱스토어에 업로드하고....
그런것들 다루느라 좀 지루하지 않았나요?

그냥 화면에서 막 움직이는거를 해야 재밌는데요..

그래서 오늘은 코로나의 강력하고 현란한 Physics Engine 에 대해 보겠습니다.


화면과 같이 하늘에서 큰박스, 작은박스, 캔이 마구마구 떨어집니다.
그리고 이게 진짜 실물처럼 서로 부딪히고 튕겨나가고 뭐 그렇게 됩니다.

이걸 표현하는데 단 40줄이면 된다면 여러분 믿으시겠습니까?

이 앱은 코로나에서 제공하는 샘플 앱입니다.
코로나를 까셨다면 Corona SDK 폴더에서 SampleCode-Physics-ManyCrates 폴더로 가세요.

그리고 전체 이미지와 소스를 압축해서 파일첨부도 했습니다. 참고하시구요.

아래가 전체 소스입니다.

--
-- Abstract: ManyCrates sample project
-- Demonstrates simple body construction by generating 100 random physics objects
--
-- Version: 1.1 (revised for Alpha 2)
--
-- Sample code is MIT licensed, see http://developer.anscamobile.com/code/license
-- Copyright (C) 2010 ANSCA Inc. All Rights Reserved.

local physics = require("physics")
physics.start()

display.setStatusBar( display.HiddenStatusBar )

local bkg = display.newImage( "bkg_cor.png" )

local grass = display.newImage("grass.png")
grass.x = 160; grass.y = 430

local grass2 = display.newImage("grass2.png") -- non-physical decorative overlay
grass2.x = 160; grass2.y = 440

physics.addBody( grass, "static", { friction=0.5, bounce=0.3 } )


function newCrate()   
    rand = math.random( 100 )

    if (rand < 60) then
        j = display.newImage("crate.png");
        j.x = 60 + math.random( 160 )
        j.y = -100
        physics.addBody( j, { density=0.9, friction=0.3, bounce=0.3} )
       
    elseif (rand < 80) then
        j = display.newImage("crateB.png");
        j.x = 60 + math.random( 160 )
        j.y = -100
        physics.addBody( j, { density=1.4, friction=0.3, bounce=0.2} )
       
    else
        j = display.newImage("crateC.png");
        j.x = 60 + math.random( 160 )
        j.y = -100
        physics.addBody( j, { density=0.3, friction=0.2, bounce=0.5} )
       
    end   
end

local dropCrates = timer.performWithDelay( 500, newCrate, 100 )

아주 간단하죠?

오늘은 간단히 이 소스를 다루고 다음시간에는 본격적으로 Physics Engine 을 공부해 보도록 할께요.

local physics = require("physics")
Physics Engine을 사용하려면 위와같이 합니다.
자바의 import 와 비슷한 겁니다.

physics.start()
physics를 시작하는 함수입니다.
위에 local physics 라는 이름으로 physics engine을 불러와서 이 physics변수명을 쓰고 점을 찍고 사용할 함수명을 적은 겁니다.

display.setStatusBar( display.HiddenStatusBar )

local bkg = display.newImage( "bkg_cor.png" )

local grass = display.newImage("grass.png")
grass.x = 160; grass.y = 430

local grass2 = display.newImage("grass2.png") -- non-physical decorative overlay
grass2.x = 160; grass2.y = 440

첫번째는 아이폰의 statusbar를 없애는 겁니다.안드로이드폰에서는 필요없는 부분입니다.
코로나는 디폴트로 안드로이드에서는 Full Screen을 적용합니다.
 그 다음 이미지들을 불러오고 그 이미지들에 대한 x,y 좌표를 줍니다.

physics.addBody( grass, "static", { friction=0.5, bounce=0.3 } )
이 부분이 해당 object에 physics를 적용한 겁니다.
grass 이미지 적용했고 이 이미지는 움직이지 않을 겁니다.
그리고 마찰력과 튕기는 값을 각각 0.5, 0.3으로 주었습니다.

그 다음은 랜덤하게 이 이미지들을 불러올 로직이구요.

local dropCrates = timer.performWithDelay( 500, newCrate, 100 )

이것은 타이머를 적용해서 특정 시간 동안 특정회수로 newCrate를 불러온다는 내용입니다.

한번 실행해 보세요. 너무 간단한 코드로 너무 그럴싸한 앱이 완성됐습니다.

오늘은 그냥 간단한 설명으로 끝내는데요.
다음부터 Physics Engine에 대해 본격적으로 파헤쳐 보도록 하겠습니다.


반응형

'Corona SDK > Corona Doc' 카테고리의 다른 글

Physics Joints 예제 코드  (0) 2011.09.29
Physics Joint  (0) 2011.09.28
Physics Bodies 코딩 하기  (5) 2011.09.28
Physics Bodies  (0) 2011.09.27
Physics의 Collision Event  (0) 2011.09.27
Corona SDK Physics API  (1) 2011.09.22
config.lua 파일과 build.lua 파일...  (2) 2011.09.19
코로나 프로그래밍 기본 규칙...  (0) 2011.09.15
폰트 및 config.lua 파일에 대하여.  (10) 2011.09.14
처음으로 코딩 해 보기  (2) 2011.09.13

앱스토어에 업로드 하기

2011. 9. 20. 05:56 | Posted by 솔웅


반응형
안드로이드는 마켓에 Publish 하는 걸 많이 해봐서 이 부분은 그냥 패스 했는데요.
앱스토어에 올리는건 처음이라 왠지 정리해 두고 싶네요.

이제 Distribution 버전으로 빌드한 앱을 앱스토어에 올리려면 Provisioning Portal 에서 iTunes Connect 버튼을 클릭합니다.

그럼 아래와 같은 화면을 보시게 됩니다.


이번 첫번째 앱은 free 버전입니다.
그래서 Contracts, Tax & Banking Information  같은건 건너 뜁니다.
다음에 유료버전 올릴때 작성해야 겠네요.

오른쪽의 Manage Your Applications 를 클릭합니다.
진행하기 전에 미리 준비해야 할 것들입니다.
빌드한 앱을 zip 으로 압축합니다.
스크린 샷 파일 1~5개
57X57 아이콘 이미지와 같은 512X512 아이콘 이미지 파일 png


이제 Add New App 버튼을 클릭한 후 진행합니다.

그 이후 자세한 설명은 아래 싸이트를 참조하세요.
http://codecrue.egloos.com/1933192

앱에 대한 설명이 다 끝나면 빌드 후 압축한 앱 파일을 Load해야 합니다.
Xcode의  Aplication Loader 로 업로드 하면 된다고 하는데요.

해 보니까 간단하기도 하고... 또 헛갈리기도 하고...
한번 다 통과되면 간단하게 느껴질 거예요.
앱스토어에 올리느라 하루종일 보냈더니 머리가 좀 아프네요...

질문 있으면 올려주세요.

반응형

빌드하기 (아이폰) - 2

2011. 9. 20. 03:59 | Posted by 솔웅


반응형
아이폰 개발 프로그램은 팀당 100개의 디바이스를 등록할 수 있도록 한답니다.
디바이스를 등록하기 위해서는 Uniques Device Identification(UDID) 번호가 필요합니다.
이 번호는 Xcode와 iTunes 에서 구할 수 있습니다.

Xcode에서 구하기

- 아이폰이든 아이패드 등 디바이스를 맥 컴퓨터에 연결한다
- XCode - Window - Organizer 를 클릭한다.


- Organizer 왼쪽편에 있는 DIVICES-mobile 을 선택한다.
- Identifier 에 있는 번호를 복사해 둔다.

- Web Page의 Provisioning Portal 로 가서 Devices 를 클릭하고 Add Devices 버튼을 클릭한다.
- 디바이스 이름과 아까 복사해 둔 Identifier를 넣는다.


====> 이렇게 하면 디바이스가 등록이 됩니다.

나중에 여러분이 앱을 빌드하고 테스트하기 위해 디바이스에 install, Uninstall 할 때도 이 Organizer를 열어서 합니다.
그러면 Applications에 디바이스에 깔린 앱들이 나올테구요.
+를 눌러서 여러부들이 빌드한 앱 파일을 선택하시면 디바이스에 자동으로 인스톨 됩니다. (앱이름.app 파일. 여기서는 zip으로 압축할 필요 없습니다.)

*   App IDs 생성
Provisioning profiles를 얻기 위해서는 먼저 App ID를 생성해야 합니다.
아이폰에서 모든 애플리케이션은  App ID를 가지고 있어야 합니다.

App ID를 생성하려면 Web Provisioning Portal로 가서  App IDs를 클릭합니다.

그리고 Description을 씁니다.
App  ID로는 안드로이드에서 말하는 패키지명을 써 넣습니다.
혹시 자신이 개발하는 모든 애플리케이션을 빌드할 때 사용하시려면 끝에  .*를 넣으면 된다고 하네요.
물론 그 앞에 이름들은 다 같아야 하겠죠?

* 배포용 Provisioning Profile 만들기
지난시간에 한 키 등록 이번시간에 한 디바이스 등록 그리고 App IDs 생성 이렇게 다 완료 됐으면 그 다음 메뉴가 Provisioning 이네요.

Provisioning Profiles에는 세가지가 있습니다.
Ad Hoc, Development, Distribution 이 그건데요. 앱스토어에 올리려면 Distribution profile을 사용해야 합니다.

Distribution Provisioning Profile
iOS Provisioning Poral 웹 화면에서 왼쪽에 있는 Provisiioning을 클릭합니다.
Distribution Tab을 클릭합니다.


Destribution Method 는 App Store를 선택하시고
Profile Name에는 앱 이름을 그리고 App ID에는 아까 만든 App ID를 선택하세요.

Submit을 누르고 잠시 기다리신 후 Status가 Active 되면 Distribution Provisioning Profiles를 다운 받습니다.

다운받은 파일을 아래 폴더에 복사해 넣습니다.
/Users/(your user)/Library/MobileDevice/Provisioning Profiles/
Provisioning Profiles 폴더가 없으면 생성해서 넣습니다.

이제 Provisioning Profiles 등록은 다 됐구요.
앱을 빌드 해 보겠습니다.

* 코로나로 앱 빌드하기


프로비저닝 프로파일을 디스트리뷰션 버전으로 만들어서 세팅 해 놨으면 빌드하는 과정은 간단합니다.
해당 앱을 코로나 시뮬레이터로 불러옵니다.
File-Build-iOS 를 선택합니다.
앱 이름과 버전 그리고 Build for 를 선택하시고
Supported Device를 선택하세요.
그리고 Code Signing Identity를 아까 만들었던 배포용 프로비져닝 프로파일을 선택합니다.
Build 버튼을 누릅니다.

그러면 빌드가 됩니다.

이렇게 간단하게 빌드하기 위한 환경을 조성하려고 그 어려운 과정을 거쳐 왔네요.


완료되면 위와 같은 화면이 뜹니다.

반응형

빌드하기 (아이폰) -1

2011. 9. 20. 02:23 | Posted by 솔웅


반응형
아이폰 앱은 제가 개발해 본 적이 없어서 무지 복잡하게 느껴지네요.
많이 개발 해 봤던 안드로이드 쪽도 실수가 있었으니 아이폰쪽은 미리 충분히 빌드와 앱스토어 업로드 방법을 숙지하고 일을 하려고 합니다.

우선 아이폰 앱 빌드를 위해서는 이 웹사이트에 등록하는 거부터 시작 합니다.
http://developer.apple.com/programs/ios/

간략하게 오늘 할 토픽들을 정리하면
- 개발자 등록
- Keychain certificate
- Device 등록
- App IDs 획득
- Provisioning Profile
- 앱 빌드
- 디비이스에 인스톨 해서 테스트하기
- 앱 스토어에 앱 올리기

이 내용들을 공부해야 합니다.

우선  99불 내고 아이폰 개발자로 등록하지 않으신 분은 아래 웹 사이트로 가셔서 등록 하셔야 합니다.
http://developer.apple.com/devcenter/ios/index.action
(여기서 자세한 방법은 따로 설명 드리지 않겠습니다. 네이버나 구글 검색하시면 자세한 설명 있는 글들 찾을 수 있을거예요.
http://developer.apple.com/devcenter/ios/index.action
http://cafe.naver.com/mcbugi.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=74353&social=1
등등)

등록하고 난 후 developer.apple.com에 로그인을 하세요.


우측 상단에 있는 iOS Provisioning Portal 을 클릭해 보세요.


왼쪽에 있는 Certificates, Devices, App IDs, Provisioning, Distribution 이 앱 빌드하고 앱스토어에 등록하는데 중요한 메뉴들 입니다.


그리고 Macintosh HD-Applications-Utilities-Keychain Access.pp 도 중요합니다.

이제 웹사이트에서 인증서 받아서 키체인에 설치를 해야 합니다.
WWDR, 개발자용 인증서, 배포용 인증서를 키체인에 설치 하겠습니다.

제가 사용하는 맥에는 아래와 같이 모두 설치 돼 있습니다.


이걸 다 지우고 새로 깔기도 그렇고.. 회사 컴퓨터라서 맘대로 할 수도 없고 해서..
맥부기의 문성욱님이 설명하신 이미지와 내용을 좀 빌리겠습니다.
직접 보시려면 아래 싸이트에서 보실 수 있습니다.
http://cafe.naver.com/mcbugi.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=8953&

---- 아래 문성욱님 글 ------

개발자 포탈 사이트에서 Certificates 항목에 들어갑니다.


아직 등록된 인증서가 없습니다

하단에 WWDR인증서를 다운받는 링크로 다운받습니다

* 받은 파일은 다운로드 폴더에 저장됩니다

받은 인증서를 키체인에 끌어다 넣습니다
 
 


기본(WWDR) 인증서를 설치 했습니다


이번에는  개발자 포탈에 올릴 인증서 요청 파일을 만듭니다
키체인 메뉴에서 키체인 접근 -> 인증 지원 -> 인증 기관에서 인증서 요청...을 클릭합니다
영문일 경우: Keychain Access -> Certificate Assistant -> Request a Certificate From a Certificate Authority...

요청 부분을 디스크로 저장으로 선택하시고
자신이 키페어 정보 지정을 선택합니다

 
그리고 저장합니다

그리고 저장된 요청파일을 포탈에 올립니다

포탈의 인증서 관리에서 Request Certificate을 클릭합니다

하단에 파일 선택 버튼을 클릭해서 아까 만들어 둔 파일을 선택합니다

다음 오른쪽 하단의 Submit을 클릭합니다

등록 중이라고 나옵니다
등록중인 항목에 Approve을 클릭합니다


잠시 기다리다 페이지를 새로 고침하면 다음과 같이 뜹니다


여기까지 개발자용 인증서을 만들어 봤습니다

이번에는 배포용 인증서를 만들어 보겠습니다


포탈에서 Develoment탭 옆에 Distribution탭을 클릭합니다

이곳 또한 빈칸으로 되어 있습니다

위에서 했던 작업과 같이 Request Certificate을 클릭해서 아까 만들어둔 인증요청파일을 올리는 작업을 반복합니다 (요청파일을 다시 만들 필요 없습니다)




이제 개발용(Development)탭과 배포용(Distribution)탭에 각각 인증서가 만들어 졌습니다

각각의 탭에서 각각의 인증서를 Download를 클릭해서 다운받습니다


받은 두개의 인증서를 키체인에 넣습니다



인증서 작업이 끝났습니다.


다른 맥에서도 개발하실경우 (두대 이상으로 개발시) 요청파일 올리는 작업 없이 이미 만들어진 인증서와 WWDR인증서 이 세개만 받아서 넣어주면 됩니다.

 

개발 준비, 인증서 등록 추가분 (다른 맥에서 같이 개발) http://cafe.naver.com/mcbugi/10487

----------- 문성욱님 글 끝 -----

자 이제 필요한 키들을 받고 여러분 맥의 키체인에 이것을 등록하는 과정까지 했습니다.

오늘은 여기까지 하구요.

이제 여러분들이 개발한 앱을 디바이스에 테스트하기 위해  Xcode 에 디바이스를 등록하고 App IDs 받고 Provisioning files 처리하고 코로나에서 앱 빌드하고 이걸 앱 스토어에 올리는 과정을 다음 시간에 살펴 보겠습니다.

처음이라서 그런지 앱스토어까지 가는 길이 무지 험난해 보이네요.

그럼....
반응형

config.lua 파일과 build.lua 파일...

2011. 9. 19. 23:13 | Posted by 솔웅


반응형
제가 코로나로 만든 첫 앱인 Multi Ping Pong 이 안드로이드 마켓 업로드 과정에서 문제가 생겼습니다.
안드로이드 마켓에 올릴 때 바로 아래와 같은 메세지가 뜬건데요.


Androidmanifest.xml 파일에 버전코드가 안 돼 있다는 겁니다.
이건 빌드과정에서 코로나에서 자동으로해 주는 거거든요.

저는 코로나 매뉴얼에 나와 있는 대로 아래처럼 따라 했구요.


빌드과정에서 버전도 1로 해 줬고 config.lua 에도 시키는 대로 버전코드 제대로 넣어 줬구요.

Corona에 문의 메일을 보냈더니 바로 그날로 답변이 왔습니다.

Hello,

It looks like you are setting the versionCode correctly in the build.settings file so I'm not sure why you are getting the error. If you don't include the parameter in the file, Corona defaults to version "1".

아무 문제 없다고 하죠? 그런데 저기 build.settings 라는 단어가 눈에 팍 띄는거예요.
코로나에선 제가 저 위에 세팅을 cinfig.lua에만 한 줄 모르고 build.settings에 저렇게 코딩을 했으면 제대로 한 거라고 답변을 준거예요.

그래서 저 코드를 그대로 build.settings 파일을 만들어서 옮겨 놓고 빌드를 했습니다.
그리고 다시 안드로이드마켓에 업로드 시도...
결과는 성공적으로 업로드 됐습니다.

제가 config.lua파일과 build.settings 파일을 제대로 공부하지 않고 일은 진행하는 바람에 일정이 하루 차질을 빚었습니다.

이 기회에 이 두 파일에 대해서 확실하게 알고 넘어가야 겠네요.
(제가 이메일에 빌드하는 과정에 이 build.settings 파일은 자동으로 생성해 줬으면 좋겠다고 보냈어요. 어차피 빌드과정에서 Version을 넣도록 해 놨으면 자동으로 생성해 줘도 될 것 같아서...... 이게 반영이 될지는 모르겠지만요...)

이 부분에 대한 코로나 웹페이지에서의 설명은 아래 주소에 있습니다.
http://developer.anscamobile.com/content/configuring-projects

build.setting 은 빌드 프로세스에 대한 파일이고
config.lua는 컴파일 될 때 포함되서 런타임 때 엑세스 되는 파일입니다.

config.lua는 주로 해상도가 다른 디바이스에서 화면이 제대로 보이도록 해상도에 맞게 디스플레이 하도록 옵션을 주는 기능이 있습니다.
(자세한 내용은 http://blog.anscamobile.com/2010/11/content-scaling-made-easy/)
이 파일의 주요 키워드는 width,height,scale 이렇게 세가지가 있습니다.
앞에 두가지는 해상도의 가로 세로 픽셀 값들입니다.
scale은 4가지가 있는데 아래와 같습니다.

    * "none" - turns off dynamic content scaling
    * "letterbox" - uniformly scales up content as much as possible, while still showing all content on the screen. This is similar to watching a widescreen DVD on a non-widescreen TV set, except that you can use offstage content to fill the "bleed" areas rather than displaying black bars.
    * "zoomEven" - uniformly scales up content to fill the screen, while preserving aspect ratio. Some content may appear offscreen, if the new screen has a different aspect ratio
    * "zoomStretch" - non-uniformly scales up content to fill the screen. All content will remain onscreen, but it may be stretched vertically or horizontally.

참고로 아이폰, 안드로이드폰 공히 가장 낮은 해상도인 320X480 에 width,height를 맞춰놓고 letterbox,zoomEven,zoomStretch 등 해상도에 맞게 화면을 조절하는 옵션을 쓰면 모든 해상도에 적당한 화면이 적용 됩니다.

여기에 지정된 해상도는 코드 내에서 display.contentWidth 와 display.contentHeight 로 값을 얻을 수 있습니다.

여기에 각기 다른 해상도에서 화면의 이미지들에 대한 x,y 좌표에 대한 콘트롤을 하려면 config.lua 에서 xAlign,yAlign 키워드에 left,right,center 등의 값을 적용 시키면 됩니다.

예)
application =
{
        content =
        {
                width = 320,
                height = 480,
                scale = "letterbox",
                xAlign = "left",
                yAlign = "top"
        },
}

display.contentWidth, display.contentHeight 이외에 코딩상에서 접근할 수 있는 키워드는
display.viewableContentWidth,display.viewableContentHeight 이렇게 두가지가 더 있습니다.

첫번째는 이미 말씀드린대로 config.lua 에 설정한 width,height 값들을 가져올 것이고 두번째 것들은 upscaleing된 화면에서 실제 보이는 값을 가져올 것입니다.

display.screenOriginX,display.screenOriginY 이것도 있습니다. 이것은 현재 디바이스에서 좌우로 얼마나 거리가 떨어져 있는지에 대해 알 수 있게 해 줍니다.

아래 샘플을 보시면
application =
{
    content =
    {
        width = 320,
        height = 480,
        scale = "letterbox",
 
        imageSuffix =
        {
            ["@2"] = 2,
            ["@3"] = 3,
            ["-bar"] = 3.3,
            ["-foo"] = 4.5,
        },
    },
}

imageSuffix가 있는데요. 이건 다이나믹하게 이미지 크기를 설정할 때 사용 할 수 있습니다. 이 설정에 의하면 아래와 같이 이미지가 보일 겁니다.
myImage@2.png (200 X 200 픽셀)
myImage@3.png (300 X 300 픽셀)
myImage - bar.png (330 X 330 픽셀)
myImage - foo.png (450 X 450 픽셀)

이 밖에 frame Rate (fps), 안티 알리아싱 등이 더 있습니다.

이번엔 build.settings에 대해 알아 보겠습니다.
이 파일은 빌드 과정에서 적용되는 사항들에 대해 세팅하는 파일입니다.

settings =
{
        orientation =
        {
                default = "portrait",
        },
 
        iphone =
        {
                plist =
                {
                        UIRequiredDeviceCapabilities = "magnetometer",
                        UIPrerenderedIcon = true,
                },
        },
 
        build =
        {
                custom = "a1234",
        }
}

이와 같이 portrait나 landscape 같은 orientation 도 여기서 지정해 줍니다.
settings =
{
    orientation =
    {
        default = "portrait",
        supported =
        {
            "portrait", "portraitUpsideDown", "landscapeRight", "landscapeLeft"
        }
    },
   
   
    iphone =
    {
        plist =
        {
            UIInterfaceOrientation = "UIInterfaceOrientationLandscapeRight",
 
            UISupportedInterfaceOrientations =
            {
                "UIInterfaceOrientationLandscapeLeft",
                "UIInterfaceOrientationLandscapeRight"
            },
           
            UIApplicationExitsOnSuspend = true,
            UIStatusBarHidden = true,
            UIPrerenderedIcon = true
           
        }
    }
}
 
 
settings.iphone.plist["UIInterfaceOrientation~ipad"] = "UIInterfaceOrientationPortrait"
settings.iphone.plist["UISupportedInterfaceOrientations~ipad"] =
{
    "UIInterfaceOrientationPortrait",
    "UIInterfaceOrientationPortraitUpsideDown"
}

또한 위와 같이 스테이스바나 세세한 orientation 같은것도 설정 가능하네요. 또 디바이스 별로도 설정할 수 있구요.

또 orientation에 따라 사용되는 이미지들도 설정하게 됩니다.
안드로이드에서는 주로 Manifest.xml 파일에 설정되는 값들입니다.
아이폰쪽은 한번도 안 해 봐서 제가 비교를 할 수가 없네요.

안드로이드에서는 또한 중요한게 아래처럼 버전코드와 퍼미션 설정 하는 겁니다.
settings =
{
        android =
        {
                versionCode = "3"
        },
   
        androidPermissions =
        {
                "android.permission.ACCESS_FINE_LOCATION",
                "android.permission.INTERNET"
        },
   
        orientation =
        {
                default = "landscapeRight"
        },
}

이러하 것들을 build.settings에 설정 하셔야 합니다.

이걸 공부 안해서 첫 코로나 앱 안드로이드 마켓 업로드에서는 약간 헤맸네요.
아마 오늘 안드로이드 마켓 업로드는 끝날 것 같구요.
이제 아이폰 앱스토어에 업로드 할 겁니다.
아마 또 헤매는 부분이 있을 텐데요.

저도 다음에 두번 헤매지 않고 또 이 글을 읽으시는 분들도 그런 시간 낭비를 줄일 수 있도록 그런 내용 들을 잘 정리 하겠습니다.

그럼 다음에 뵈요...
반응형

'Corona SDK > Corona Doc' 카테고리의 다른 글

Physics Joints 예제 코드  (0) 2011.09.29
Physics Joint  (0) 2011.09.28
Physics Bodies 코딩 하기  (5) 2011.09.28
Physics Bodies  (0) 2011.09.27
Physics의 Collision Event  (0) 2011.09.27
Corona SDK Physics API  (1) 2011.09.22
정말 매력있는 코로나의 Physics Engine  (2) 2011.09.21
코로나 프로그래밍 기본 규칙...  (0) 2011.09.15
폰트 및 config.lua 파일에 대하여.  (10) 2011.09.14
처음으로 코딩 해 보기  (2) 2011.09.13

빌드 하기 (안드로이드)

2011. 9. 16. 22:38 | Posted by 솔웅


반응형
이제 제가 개발하고 있는 앱도 거의 완성이 되서 마켓에 올릴 때가 됐습니다.
오늘은 빌드하는 방법을 간단히 정리하겠습니다.
저도 다시 한번 상기하는 의미에서.

우선 빌드를 하시려면 코로나에 유료등록을 해야 합니다.
웹 주소는 http://www.anscamobile.com/pricing/ 입니다.

아이폰, 안드로이드 별도로 구매하면 각각 199불 이고 통합 패키지로 구입하면 349불입니다.
그리고 나서 confirm됐다는 이메일을 받으면 컴퓨터 2개에서 사용 가능합니다.
따로 유료버전을 다운받아서 설치할 필요는 없구요.
그냥 기존에 받았던 거에서 등록만 하시면 되요.
그러면 빌드할 때 코로나 서버에 접속해서 승인 받으면서 진행하더라구요.
그러니까 인터넷이 되지 않으면 빌드를 할 수 없어요.

안드로이드 앱 빌드 방법

우선 빌드할 앱을 시뮬레이터에서 불러온 후 file-build-Android를 선택합니다.


그 다음 Application name , Version, Package를 입력합니다.
제 앱은 Multi_PingPong 이란 이름으로 마켓에 올려질 건데요.
위에 있는 이름은 코로나가 그냥 폴더 이름을 집어 넣은 거예요.
그리고 버전은 1,2,3,4.... 이렇게 나갈거예요.
안드로이드 마켓에 올릴때 기존 버전보다 높아야지만 업그레이드가 됩니다.
그 때 사용할 버전입니다.
그 다음은 Target OS Compatibility 인데 제건 Android 2.2 에 맞춰져 있네요.
그 아래버전으로 설정하는건 아직 모르겠습니다.
그리고 KeyStore는 디버를 위한 KeyStore는 코로나에서 그냥 제공하고 있습니다.
Key Alias 누르시면 Android Debug Key라고 있을 겁니다.
그거 선택하셔도 됩니다. 단지 테스트 하실 거면 ...
하지만 마켓에 올리시려면 직접 안드로이드에서 받은 본인만의 KeyStore를 사용 해야 합니다.

다 입력하신 후 Build버튼을 누르시면 위와 같은 화면이 나옵니다.
보시다시피 서버에 연결해서 뭔가 퍼미션을 받은 후 애플리케이션네임.apk라는 파일이 생깁니다.

이 apk 파일을 마켓에 올리시면 됩니다.

간단하죠?

참고사항
- 빌드하기 전 아이콘 이미지 파일이 있어야 하는데요. 그 규칙은 아래와 같습니다.
  Icon-hdpi.png, Icon-mdpi.png, and Icon-ldpi.png 이렇게 3개의 아이콘 파일을 준비합니다. 크기는 각각 (72x72, 48x48, 36x36) 입니다.
안드로이드 1.6 이하에서 사용할 수 있게 하려면 icon.png (72X72) 를 준비합니다.
파일들은 main.lua가 있는 폴더에 넣으시면 됩니다.
- 안드로이드 폰에 인스톨 시키려면 adb install name.apk 로 하시면 됩니다.

config.lua 에서 보다 세세한 설정을 할 수가 있습니다.
지난번에 다룬적이 있는데 폰 해상도에 딱 맞게 하려면 아래와 같이 하면 됩니다.
application
{
        content =
        {
                width = 320, (폰 해상도에 맞는 width)
                height = 480,(폰 해상도에 맞는 height)
                scale = "letterbox"
      },
}
안드로이드에서는 버전이나 오리엔테이션 그리고 퍼미션 등을 아래와 같이 설정 합니다.
settings =
{
        android =
        {
                versionCode = "3"
        },
        androidPermissions =
        {
                "android.permission.ACCESS_FINE_LOCATION",
                "android.permission.INTERNET"
        },
        orientation =
        {
                default = "landscape"
        },
}
일단 안드로이드는 이 정도만 하면 될 것 같네요.
더 이상은 저도 잘 모르겠구요. 새로 알게 되는게 있으면 그때그때 팁으로 정리할께요.
그럼 다음 시간에 뵙겠습니다.
반응형


반응형
글을 진행하다 보니까 코로나에서 제공하는 DOC 내용대로 가게 되네요.
코로나에서 제공되다보니까 기본을 탄탄히 닦을 수 있는 것 같아요.

저도 지금 앱을 개발하고는 있지만 이 글을 쓰면서 기본을 다질 수 있어서 좋구요.

아마 코로나에서 제공하는 매뉴얼 대로 글이 연재 될 것 같습니다.
가끔 제가 터득한 팁 정도 올릴 수 있을 거구요.

코로나는 lua 랭귀지를 사용하고 있습니다.
lua는 JAVA,C 같은 컴파일 언어가 아니고 PHP, ASP, Java Script 같은 스크립트 언어입니다.

변수명은 숫자로은 시작할 수 없구요. 첫글자 이외에는 사용할 수 있습니다.
숫자 이외에 문자, underscore 를 변수명에 사용 할 수 있어요.

코로나에서 미리 점유하고 있어 변수명으로 사용할 수 없는 단어들은 아래와 같습니다.
    and       break     do        else      elseif
end       false     for       function  if
     in        local     nil       not       or
     repeat    return    then      true      until     while

라인 주석은 앞에 -- 를 붙입니다.. (대쉬 2개)
범위 주석은


--[[
print( 10 )       -- no action (comment)
--]]
이렇게 합니다.
일시적으로 범위 주석을 해제하고 싶으면 아래와 같이 합니다.

---[[
print( 10 )       --> 10
--]]
루아에서 사용하는 형( TYPE) 에는 아래와 같은 것들이 있습니다.

nil
. Nil is a type with a single value, nil. By default, global variables are nil which means that they have not been assigned a value. This is analogous to null in JavaScript/ActionScript.
  • boolean. The boolean type has two values, false and true. Note that in conditional expressions, e.g. if ( condition ), both false and nil evaluate as false; everything else evaluates as true.
  • number. Represents real (double-precision floating-point) numbers.
  • string. Represents arrays of characters (any 8-bit character, including embedded zeroes)
  • function.
  • table. Tables are the fundamental data structure in Lua. They implement an associative array which is just a fancy way of saying that the array can be indexed not just by numbers, but also by any other value of the language except nil. Typically, you would use a string as an index (see Properties).
자바스크립트의 null 은 루아의 nil 과 같구요. 배열은 table이란 이름을 사용합니다.
변수 선언 할 때 따로 형을 선언하지 않구요 루아가 알아서 해 줍니다.
형변환도 루아가 알아서 해 주구요.
이런 규칙이 편하긴 하지만 프로그래밍을 하다보면 일단 스트링으로 선언된 숫자를 number 형 처럼 크기 비교 같은 거 할 때 좀 불편한 점은 있더라구요.
이건 나중에 한번 다룰 일이 있을 겁니다.

루아에서 배열로 사용하는 table 선언은 {} 로 합니다.
아래 사용 예제 입니다.
        t = {}                          -- create a table
        k = "x"
        t[k] = 3.14                     -- new table entry, with key="x" and value=3.14
        t[10] = "hi"            -- new table entry, with key=10 and value="hi"
        print( t[k] )           --> 3.14
        print( t["x"] )         --> 3.14
        print( t.x )            --> 3.14
        k=10
        print( t[k] )           --> "hi"
변수 선언은 그냥 하시면 되요.
abc  = "test"
이러면 abc 라는 변수에 test 라는 문자가 들어갑니다.
이렇게 선언하면 글로벌 변수가 되구요.

지역 변수는 앞에 local 이라는 단어를 씁니다.
x = 1                                                   -- global variable
local y = 10                                    -- local variable
관계를 나타내는 기호들은 아래와 같습니다.
==    ~=    <     >     <=    >=
그리고 logical operator 는 아래와 같구요.
     10 or 20            --> 10
     10 or error()       --> 10
     nil or "a"          --> "a"
     nil and 10          --> nil
     false and error()   --> false
     false and nil       --> false
     false or nil        --> nil
     10 and 20           --> 20
그리고 두 단어를 합하려면 .. 를 씁니다.
예를 들어
print("test = " .. x)
이렇게 하면 터미널에 test = 'x 변수의 내용' 이 찍혀 나옵니다.
오퍼레이터 우선순위는 낮은 순서부터 아래와 같이 됩니다.
     or
     and
     >     <     >=    <=    ~=    ==
     ..
     +     -
     *     /     %
     not   #     - (unary)
     ^
코로나에서 메소드(펑션) 선언은 아래와 같습니다.
function abc()
함수 내용
end
그리고 미리 지정된 함수들도 사용할 수 있구요.
math.sin(100)
미리 지정된 함수들은 다음에 소개해 드릴 겁니다.
object method 를 사용하려면 : 를 사용합니다.
자바스크립트는 그냥 . 을 사용하지요. 이 부분이 좀 다르더라구요.
JavaScript Lua
object.translate( 10, 10 ); object:translate( 10, 10 )
자바스크립트 처럼 . 을 사용해도 되는데요 그 방법은 아래와 같습니다.
Object call with dot Object call with colon
object.translate( object, 10, 10 ); object:translate( 10, 10 )
편하신 대로 사용하면 되는데.. : 가 조금 더 편하죠?
메모리 관리는 루아가 알아서 해 줍니다.
자바처럼 garbage collection 에서 처리합니다.
루아는 local 로 선언된 내용들을 처리할 겁니다.
그러니까 변수나 함수 선언은 웬만하면 local로 하시는 게 좋습니다.

global 변수나 table 에 들어있는 변수들은 Garbage로 처리 되지 않아서 계속 메모리를 점유하고 있게 됩다
그리고 팁으로 알아 두실 건
자바에서는 모든 라인 끝에 ; 를 붙입니다.
루아는 붙여도 되고 아무것도 안 붙여도 됩니다.
if 문도 자바랑 약간 다른데요.
if () then
end
이런 구조를 갖고 있습니다.
그리고 elseif 는 붙여 씁니다.
배열에서 첫번째 배열은 t[1]입니다. 자바처럼 0에서 부터 시작하지 않습니다.
루아에서는 함수 리턴 값이 2개 이상 될 수도 있습니다.
이 부분은 편리하더라구요.
그리고 이렇게 변수값 대입도 가능합니다.
x,y=y,x
이러면 x 는 y 가 되고 y 는 x 가 됩니다.
x,y,z = 0
이러면 세개 변수 값이 한꺼번에 대입 되구요.
오늘은 이렇게 루아에 대한 문법 공부를 간단히 했습니다.
그냥 한번 읽으면 '아 루아는 다른 언어와는 다르게 이런 특징이 있구나' 하는 걸 알 수 있을겁니다.
그냥 거기까지만 하면 되지 않을까요?
그럼 다음 시간에 또 뵙겠습니다.


반응형

'Corona SDK > Corona Doc' 카테고리의 다른 글

Physics Joints 예제 코드  (0) 2011.09.29
Physics Joint  (0) 2011.09.28
Physics Bodies 코딩 하기  (5) 2011.09.28
Physics Bodies  (0) 2011.09.27
Physics의 Collision Event  (0) 2011.09.27
Corona SDK Physics API  (1) 2011.09.22
정말 매력있는 코로나의 Physics Engine  (2) 2011.09.21
config.lua 파일과 build.lua 파일...  (2) 2011.09.19
폰트 및 config.lua 파일에 대하여.  (10) 2011.09.14
처음으로 코딩 해 보기  (2) 2011.09.13