Building on this concept, you can now manage your nebula shields and enact other creative methods, including:
이제 여러분은 nebula shield를 관리할 수 있게 됐습니다. 그리고 아래 내용들을 포함해서 여러 효과들을 구현하실 수 있습니다.
- shield pod 이 destroy 됐다면 옆에 있는 beam 도 destroy 시킴.
- 특정 시간이 지나면 shield pod 을 rebuild 하고 옆의 beam 들도 다시 rebuild 함
- shieldStates table setup 을 확장해서 각 pod 의 에너지 양을 관리함.
per-element detection 과 함께 physics contact를 사용하면 전통적인 방법이 갖는 한계를 해결할 수 있다는 걸 알게 되셨을 겁니다.
|
|
Part II – Multi-Element Bodies and Sensors
이제 multi-element bodies와 관련되서 많이들 잘 못 이해하고 계시는 sensor 부분에 대해 얘기해 보겠습니다.
Corona 의 physics 에 대해서 경험이 있으신 분들은 어떤 모양이나 타입(dynamic, kinematic, or static)에서든 physical body 가 sensor 로서 동작할 수 있다는 것을 알 수 있을 겁니다. sensor 는 부딪혀서 튀긴다던가 하는 physical sense 는 없습니다.
multi-element bodies와 관련해서 많이 오해하기 쉬운게 뭐냐하면 모든 element 들은 seosor로서 colision event를 return 합니다. body 가 전체 통으로 돼 있는 객체라면 그 전체가 충돌을 체크하는 포인트가 되죠. 여기서 헛갈릴 수 있는 것이 sensor 에서는 충돌시 여러개의 began phase event를 받을 수 있게 된다는 거죠. 혹은 센서 지역 밖에 있는데도 작은 부분이 걸쳐 있어서 ended phase를 받을 수도 있습니다.
사실 센서는 원래 그러기 위해서 만들어 졌습니다. 예를 들어서 트랙을 달리는 경주용 자동차의 앞 바퀴에만 센서를 달 필요가 있는 경우가 있을 겁니다. 조종석은 트랙이 있더라고 앞바퀴만 통과하면 어떤 결과를 일으켜야 되는 경우가 있죠. 또 다른 경우는
multi-element body 전체가 센서 지역의 안에 혹은 밖에 있는 것을 체크해야 될 때도 있습니다. “jumping fish” 를 보죠. 물고기는 완전히 물 안에 존재해야만 하죠? 이것도 센서로 정의할 수 있을 까요?
Counting the Collisions
이 jumping fish 시나리오는 fish의 body 에 있는 각각의 element들에 대해 어떤 충돌이 일어나는지를 counting 함으로서 해결할 수 있습니다. 이를 위해 값들이 들어갈 테이블을 만들고 그 이름을 elementStates라고 할 겁니다. began phase 에서 해당 count를 1씩 증가시키고 ended phase 에서는 1씩 감소 시킬 겁니다. 각 element들은 센서와 함께 collision event 를 return 할 겁니다. 그래서 만약 한 element에 4개의 센서들이 overlap 된다면 count는 4가 되겠죠. 만약 그 센서들 중 3개가 밖으로 나간다면 count 는 1로 줄겠죠. element count 가 0이 될 때는 전체가 센서 밖에 나가 있다는 것을 말합니다. 그러면 물고기가 완전히 물밖으로 나간 상태고 물고기가 점프했다고 볼 수 있겠죠.
또한 우리는 elementsIn를 만들어서 물고기의 전체 element들 중에 얼마나 많이 센서 범위 안이나 밖에 있는지를 count 할 겁니다. 이 값은 절대 5를 넘지 않을 겁니다. 왜냐하면 물고기는 5개의 element들로 구성될 거기 때문이죠.
마지막으로 inWater라는 boolean flag 를 정의할 겁니다. 이로 인해서 완전히 물 속에 있는지 물 밖에 있는지를 알 수 있게 되죠. 코딩을 편하게 하기 위해서 이 세개의 item들은 fish 의 properties 로 정의할 겁니다.
아래에 기본적인 예제 코드가 있습니다.
local fish = display.newImage( "jumpfish.png" )
fish.x, fish.y = display.contentWidth/2, display.contentHeight/2-200local tail = {-117,12, -123,-46, -68,-13}local bodyBack = {-89,-26, -61,-39, -20,-46, 20,-49, 42,27, -12,28, -66,16, -94,0}local bodyFront = {20,-49, 71,-43, 107,-32, 121,-20, 126,-10, 108,5, 78,19, 43,27}local finBack = {-39,23, -11,29, -10,41, -32,50}local finFront = {-9,51, -11,28, 41,27, 15,42}physics.addBody( fish, "dynamic",{shape=tail},{shape=bodyBack},{shape=bodyFront},{shape=finBack},{shape=finFront})fish.elementStates = { 0,0,0,0,0 } --table of per-element collision countsfish.elementsIn = 0fish.inWater = false
보시다시피 물고기의 element들은 Part 1에서 다뤘던 nebula 와 비슷하게 정의했죠? 거기에다가 추가적으로 table elementStates와 properties elementsIn and inWater 를 생성했습니다.
Managing the Count
이 물고기는 standard collision listener 가 필요합니다. pre-collision listener 가 아니라요. 이번에는 physics contact 기능을 사용하지 않을 겁니다.
local function fishCollide( self,event )if ( event.phase == "began" ) thenif ( self.elementStates[event.selfElement] == 0 ) thenself.elementsIn = self.elementsIn+1endself.elementStates[event.selfElement] = self.elementStates[event.selfElement]+1elseif ( event.phase == "ended" ) thenself.elementStates[event.selfElement] = self.elementStates[event.selfElement]-1if ( self.elementStates[event.selfElement] == 0 ) thenself.elementsIn = self.elementsIn-1endendif ( self.elementsIn == 0 and self.inWater == true ) thenself.inWater = falseprint("FISH ENTIRELY OUT OF THE WATER!")elseif ( self.elementsIn == 5 and self.inWater == false ) thenself.inWater = trueprint("FISH ENTIRELY IN THE WATER!")endendfish.collision = fishCollide ; fish:addEventListener( "collision", fish )
이제 단계별로 볼까요
began phase:
- 첫번째로 총돌한 element의 count가 0인지 체크합니다. 만약 0이면 이 element는 처음으로 센서지역으로 들어가는 element라는 것을 알수 있죠. 그리고 이 물고기의 전체 elementsIn count를 1 증가시킵니다.
- 그 다음으로는 특정 element의 count 를 1 증가 시킵니다.
ended phase:
- 충돌한 element의 count 에서 1을 뺍니다.
- 그 다음에 element의 count가 0인지 체크를 하죠. 만약 0이면 이 물고기는 전체 센서지역에서 완전히 밖에 있는 상태라는 것을 알 수 있습니다. 그리고 물고기의 total elementsIn count 에서 1을 줄입니다.
The conditional check:
- 물고기의 total elementsIn count 가 0인지 여부를 체크합니다. 이전에 물속에 있었는지 여부를 체크합니다. 두 조건 모두 pass 하면 물고기는 물밖에 완전히 나온 상태라는 것을 알 수 있죠. 그러면 inWater flag를 false로 세팅합니다.
- elseif 조건문은 물고기의 elementsIn count가 5인지를 체크합니다. 이전에 물에 완전히 들어가 있지 않은지 체크하죠. 두가지 조건이 pass 라면 이 물고기는 이 물고기는 완전히 물 속에 있다는 것을 알 수 있죠. 그러면 inWater flag를 true로 세팅합니다.
물고기가 완전히 물 속에 있는지 아니면 완전히 물 밖에 있는지에 대해 이렇게 sensor collision을 가지고 handle 할 수 있습니다 이 방법은 센서들을 overlapping 하고 neighboring 과도 같이 사용할 수 있습니다. 예를 들어 core body 로 물 센서 지역을 만들었고 그 위에 파도가 있다면 이 코드는 물고기의 모든 elements들을 이 센서들에 모두 적용 시킬 수도 있습니다.
In Summary
여기까지가 오늘의 튜토리얼입니다. 배우신대로 mutli-element
physics bodies 기능으로 joint-assembled bodies 가 할 수 없는 효과를 줄 수 있습니다. 하지만 사용하시려면 몇개의 장애물은 넘어야 겠죠. 이 튜토리얼이 여러분이 앱을 만드시면서 닥치는 그런 장애를 극복하는데 도움이 되기를 바랍니다.
'Corona SDK > Corona Doc' 카테고리의 다른 글
Pinch Zoom Rotate 구현하기 - 4/11 - (0) | 2013.02.01 |
---|---|
Pinch Zoom Rotate 구현하기 - 3/11 - (0) | 2013.01.29 |
Pinch Zoom Rotate 구현하기 - 2/11 - (0) | 2013.01.29 |
Pinch Zoom Rotate 구현하기 - 1/11 - (0) | 2013.01.26 |
코로나에서 time, date 다루기 (0) | 2013.01.18 |
내 앱에 애플의 iAds 광고 달기 (0) | 2013.01.03 |
코로나의 Holiday Gifts : Android Push Notification 등 등 (0) | 2012.12.30 |
iOS 에 구글 맵이 돌아왔다. (Corona의 구글 맵 지원 기능 소개) (2) | 2012.12.19 |
간단하게 Device 분별하는 예제 (0) | 2012.12.13 |
다양한 디바이스 해상도에 맞게 이미지 표시하기 - config.lua file- (0) | 2012.12.06 |