이번에 다룰 튜토리얼은 아주 유용한 예제 3개 입니다.
이 3개를 따로 따로 정리해서 글을 올릴 계획입니다.
오늘의 튜토리얼에서는 몇가지 유용한 physics methods 를 소개해 드리겠습니다. 이 튜토리얼에서 우리는 "내가 점프할 수 있을까" 를 2D side-view 게임으로 만드는 과제를 풀어갈 겁니다. 그리고 sticky projectiles와 기본 wind tunnel befavior 를 다루는 방법도 다룰께요.
이 모든 method들은 다운로드 받을 수 있는 프로젝트 안에 포함돼 있습니다. 이 튜토리얼 마지막 부분에 있는 링크를 클릭해서 다운받아 보실 수 있습니다.
Can I Jump?
등장 캐릭터가 점프할 수 있는 2D 게임을 만들 때 아마 어떤 물체가 점프를 할 경우 ground 에서 점프해서 ground 로 떨어지도록 만들어야 할 겁니다. 이걸 구현하라고 하면 아마 개발자마다 자기만의 방법으로 구현할 수 있을 겁니다. 방법은 여러가지가 있을 수 있지만 두가지 정도는 지켜야 합니다. 일단 물체가 ground 에 있을 때는 verticla 속도는 없을 겁니다. 그리고 점프를 한 다음에는 짧은 timer를 사용하고 또 boolean flag를 사용해서 그 물체가 땅에 떨어지기 전에는 다시 점프를 할 수 없도록 해야 할 겁니다. 이것을 구현해 놓으면 그 다음에 또 다른 구현해야할 기능들이 눈에 보이겠죠.
일단 이 물체의 physics body 에 두번째 element로 “foot sensor”를 달면 쉽게 접근할 수 있습니다. 이 센서는 그 물체의 base에서 약간 의 곤간을 차지하게 될 겁니다. 이 센서가 ground와 겹쳐지면 우리는 이 물체가 ground 위에 붙어 있다고 가정할 수 있습니다. 그러면 jump를 할 수 있는 상태가 되는 거죠. 그리고 이 센서는 그 물체의 width 보다 약간 좁게 만들겁니다. 화면 끝에 가서 부딪힌 다음 다시 돌아와야 되는데 그 물체보다 넓으면 벽에 부딪히기도 전에 튀어나올 수 있으니까요.
Constructing Terrain
코로나에서 지형을 만드는 방법은 아주 간단합니다. 아래에 우리는 모든 ground 객체들에 objType 프로퍼티를 추가할 겁니다. 그래서 물체가 이 ground에서만 반응해서 점프할 수 있도록 할 겁니다.
local cw, ch = display.contentWidth, display.contentHeight local ground = display.newRect( 0, ch-64, cw, 64 ) ground.objType = "ground" physics.addBody( ground, "static", { bounce=0.0, friction=0.3 } )
Declaring Character Body
이 물체는 두개의 body elements로 구성될 수 있습니다. 두번째 body element 는 sensor 라는 것을 기억해 두세요. 이것은 polygonal shape 를 사용해서 정의 될 겁니다. 그리고 센서는 두번째에 정의 된다는 것도 기억해 두시구요. 이 센서가 ground 에 닺았는지의 여부를 체크할 때 두번째 element를 사용해서 체크할 거거든요.
그리고 이 물체가 점프할 수 있는 상황인지를 알기 위해 canJump counter 도 추가합니다. 이 counter 는 다음과 같은 이유에서 아주 유용합니다. : 두개의 ground 객체가 있고 이 두 ground 사이를 이 물체가 지나갈 때 이 foot sensor 는 두 ground 객체에 모두 닿아있게 됩니다. counter 대신에 true/false boolean 프로퍼티를 사용한다면 자칫 원하지 않는 상황이 연출 될 수 있습니다. 그래서 센서가 ground 객체에 접촉할 때 이 counter 를 사용해서 숫자를 증감시켜서 현재의 상태를 보다 정확하게 파악할 수 있도록 합니다.
local character = display.newRect( 100, 300, 120, 120 ) ; character:setFillColor(0) physics.addBody( character, "dynamic", { density=1.0, friction=0.0, bounce=0.0 }, { shape={20,0,20,65,-20,65,-20,0}, isSensor=true } ) character.isFixedRotation = true character.canJump = 0
Jump Handler
점프하도록 만드는 것도 아주 간단합니다. 그냥 canJump counter를 체크해서 0보다 크면 점프 시키면 됩니다.
function touchAction(event) if ( event.phase == "began" and character.canJump > 0 ) then --jump procedure here end end stage:addEventListener( "touch", touchAction )
Collision Handler
마지막으로 다룰 것은 collision 핸들러 입니다. 이 핸들러를 구현하기 위해 아래 사항들을 체크해야 합니다.
1. colliding body element index 가 2 이다 - 이것으로 그 물체가 아니라 foot sensor 가 collid 된 것을 알 수 있습니다.
2. ground 객체의 지형 element - 만약 지형 element이면 이 물체는 안전하게 점프할 수 있습니다.
이 conditional clause 안에서 우리는 아래 둘 중 하나를 실행시키게 됩니다.
1. began phase 에서 (foot sensor 가 ground 객체에 들어 섰을때), canJump counter를 증가시킨다.
2. ended phase 에서 (foot sensor 가 ground object 를 나갔을 때), canJump counter 를 감소시킨다.
function charCollide( self,event ) if ( event.selfElement == 2 and event.other.objType == "ground" ) then if ( event.phase == "began" ) then self.canJump = self.canJump+1 elseif ( event.phase == "ended" ) then self.canJump = self.canJump-1 end end end character.collision = charCollide ; character:addEventListener( "collision", character )
여기까지가 jump를 구현하기 위해 가장 기본적으로 필요한 것들 입니다.
전체 소스와 이미지들은 아래 파일을 다운 받아서 사용하세요.
'Corona SDK > Corona Doc' 카테고리의 다른 글
퍼포먼스 최적화(Performance Optimizations) 팁들 소개 -03- (0) | 2013.03.14 |
---|---|
퍼포먼스 최적화(Performance Optimizations) 팁들 소개 -02- (0) | 2013.03.13 |
퍼포먼스 최적화(Performance Optimizations) 팁들 소개 -01- (0) | 2013.03.13 |
Physics 트릭들 배우기 - Wind Tunnel- (0) | 2013.02.27 |
Physics 트릭들 배우기 - Sticky Projectiles- (0) | 2013.02.27 |
iOS Build-in 트위터 기능 사용하기 (0) | 2013.02.20 |
iOS 에서 이메일 첨부파일 사용하기 (0) | 2013.02.19 |
멀티 터치 지원하는 모양 맞추기 앱 개발하기 (2) | 2013.02.15 |
Pinch Zoom Rotate 구현하기 - 11/11 - (0) | 2013.02.14 |
Pinch Zoom Rotate 구현하기 - 10/11 - (0) | 2013.02.14 |