adsense



[JAVA/slick2d] 2D 슈팅게임 위치즈 스크램블 제작강좌 -step 12-

step 12. 게임이 시작할 때 SCRAMBLE 이라는 스타팅 메시지를 출력해주겠습니다.

게임이 시작할 때 SCRAMBLE 이라는 스타팅 메시지를 출력해주겠습니다.
이 그래픽 메시지는 SCRAMBLE 이미지(rsc/game/start.png)를 잠시 화면에 띄웠다가 사라지게 할 것입니다.



prefab에 ui 폴더를 추가하고, 여기에 GameObject를 상속한 Starter 클래스를 만들어줍니다.


필요한 로컬변수는 사라질 타이밍을 계산할 카운터와 이미지.
Image img;
int cnt;

생성자에서 img에 rsc/game/start.png를 불러주고, zorder는 제일 앞의 구름이 10이므로 이보다 앞에 보이기 위해 11로 정합니다.


그리고 update에서는 cnt를 증가시켜 원하는 시간이 지나면 소멸 요청을 합니다.


render에서는 이 이미지를 화면 중앙에 보여주기만 하면 됩니다.
※실제 첨부된 소스에서는 추가적으로 확대-축소와 반투명-불투명 처리를 겸하고 있습니다.

마지막으로 GameScene에서 enter에서 Starter 객체를 만들어 addChild 해주면 간단히 구현됩니다.


돌아가는 게임과는 완전히 무관하게 화면에 메시지 혼자 나타났다가 사라지게 됩니다. 기본적으로는 파티클이펙트류와 같은 원리.

게임오버 메시지도 같은 식으로 해 주겠습니다.

※화면에 띄울 메시지가 있을 때 마다 클래스를 만들면 너무 낭비 아닐까?
cocos2d-x 같은 게임엔진에서는 화면의 기본 단위가 되는 Node에 대해 Action이란 지시를 내려 지정한 애니메이션이나 콜백 분기를 할 수 있는 기능을 갖고 있습니다. (slick2d에서는 아직 확인 못했습니다)
간단한 애니메이션을 하고 소멸하는 (소멸하지 않고 남아있을 수도 있고) 객체는 굳이 별개의 클래스를 만들지 않고 메인 플로우에 몇 라인 정도 추가하는 것으로 간단하게 구현할 수 있게 해 줍니다.


게임오버 메시지 자체의 처리는 동일합니다. 그런데 여기서 문제는

이게 2인 플레이가 가능하다는거죠.

그래서 게임오버에 대한 경우의 수가
- 1플레이어로 시작해서 1플레이어가 게임 오버 (아직 2플레이어 게임 안함)
- 1플레이어로 시작해서 게임 중에 2플레이어가 난입하고, 1, 2플레이어 모두 게임 오버 (순서는 무관)
- 1플레이어가 게임오버인 상태에서 2플레이어가 난입하고, 이후 2플레이어 게임 오버

이렇게 복잡하게 나옵니다.
(※난입 후 누구 하나가 먼저 죽은 상태는 게임오버 아닌 인플레이 상태)

GameScene에는 플레이어쪽에서 자신이 죽었다고 GameScene에 통보하기 위한 setGameOver라는 함수가 있습니다.

이걸 기준으로 생각하면

- GameScene의 setGameover가 호출되었을 때, 현재 화면에 아무도 없는 상태라면 화면에 Game Over 메시지 출력


- 게임 오버 상태인 플레이어가 발사 버튼을 입력하면 타이틀 화면으로 전환.
- 게임 오버 메시지가 나타나있을 때 2플레이어가 스타트하면 게임오버 메시지를 삭제.

이상을 구현하면 됩니다.


게임오버 메시지의 출력이나 타이틀 화면으로의 복귀 등 제어를 위해
Player 클래스에 약간의 수정을 가합니다.

update에서 MyState가 3일 경우, 추락해서 화면 밖으로 나가면 소멸시키는게 아니라
name을 바꾸고 ("PLAYER"로 찾아서 확보할 수 없도록. 하지만 벡터에는 살아있기 때문에 처리는 계속 불린다)
MyState를 4로 만들고
소멸 요청을 삭제합니다.


그리고 case 4: 를 추가하는데, 여기서는 아무것도 하지 않습니다.
render에서도 역시 아무것도 하지 않는 case 4: 를 추가하고,


대신 현재 만들어놓은 임시 UI에서 MyState가 4이면 myUi = "Player" +(tag+1)+ " : " + this.myScore + " Game Over";//게임오버 상태
이렇게 점수와 게임오버 메시지를 보여줍니다.

이것으로 게임오버 된 상태에서도 획득 점수를 보여줄 수 있습니다.


플레이어의 게임오버 처리를 위해 GameScene의 setGameover를 호출하는데..
앞에서의 수정으로 게임오버된 플레이어는 name이 "PLAYER"가 아니므로, 이제 getChildrenByName("PLAYER")을 해도 게임오버된 플레이어 캐릭터는 얻어지지 않습니다.

그러므로 setGameover에서 getChildrenByName("PLAYER")하고 아무것도 리턴되지 않았으면 게임오버 이미지를 생성합니다.

앞의 경우의 수와 대응해보면
- 1플레이어로 진행하다 1플레이어가 게임오버 되었다면 - 2플레이어가 아직 없으니 게임오버 이미지를 생성합니다.
- 순서에 상관없이 1, 2 플레이어 동시 진행 중 둘 중 하나만 게임오버 되었다면 - 아직 진행중인 플레이어가 있으니 게임오버 메시지를 표시하지 않습니다. 게임오버된 플레이어는 이름이 변경되어 "PLAYER"로 찾을 수 없지만 오브젝트는 살아있기 때문에 render와 update가 계속해서 불리고 이때 MyState가 4이므로 게임오버 메시지를 표시하고 있게 됩니다.
- 순서에 상관없이 1, 2 플레이어가 모두 게임오버 되었다면 - 화면에 아무도 없으니 게임오버 이미지를 생성합니다.

타이틀 화면으로 돌아가는 조건은, 게임오버 메시지가 떠 있는 상태에서 스페이스를 누르는 것으로 했습니다.
게임오버 메시지가 떠 있을 때 아직 2플레이어가 난입한 적이 없다면, 2플레이어는 버튼을 눌러 게임을 시작할 수 있습니다.
그러므로 2플레이어가 게임을 스타트할 때 게임오버 이미지가 있는지 확인해서, 있으면 소멸 요청을 해 주도록 합니다.


이후 controllerButtonReleased와 keyReleased에서 발사키/버튼이 눌렸고 '현재 화면에 아무도 없고', '해당 버튼을 누른 플레이어가 게임 오버 상태라면'
game.enterState(ProjectMain.STATE_TITLE);로 타이틀 화면으로 돌아가게 합니다.

플레이어 1


플레이어 2


의외로 복잡한 게임오버 구현이었습니다.

※여기서 미처 생각하지 못하고 -이 시점에서는 버그가 아닌데 나중에 버그가 되는- 넘어간 부분이 있습니다. 그것은 아마도 step 15에서 말씀드리게 될 듯..

※글은 진작에 다 써놨는데 지난 목요일 이후로 감기몸살이 심해서 진행이 늦었습니다. 목차에 미리 밝힌 것 처럼 step 15까지 진행하면 완성될 예정이며, 한 일주일 정도면 끝나지 않을까요..


핑백

덧글

댓글 입력 영역


Books

Geek라이프

메가 드라이브 퍼펙트 카탈로그
마에다 히로유키 저/조기현 역

미소녀 일러스트 테크닉
B-은하, pen스케, 카와이 저/정유진 역

핵심강좌! Cocos2d-x
이재환 저

피규어의 교과서 레진 키트 & 도색 입문 편
후지타 시게토시 저/김정규 역
예스24 | 애드온2
일본서적 전문사이트 NEPIC