반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 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