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

최근에 받은 트랙백

글 보관함


이번에 다룰 튜토리얼은 아주 유용한 예제 3개 입니다.

이 3개를 따로 따로 정리해서 글을 올릴 계획입니다.


Posted on . Written by



오늘의 튜토리얼에서는 몇가지 유용한 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를 구현하기 위해 가장 기본적으로 필요한 것들 입니다.


전체 소스와 이미지들은 아래 파일을 다운 받아서 사용하세요.

canJump.zip



반응형

Comment