SimpleGame은 기초적인것은 완성되었습니다. 우리는 좀 더 전문적인 게임을 만들기 위해서 몇가지 기능을 더 추가할 생각입니다.
이번 챕터에서는 우리는 새로운 씬을 추가할것입니다. 적들을 일정 개수만큼 없애면 "You Win!" 그렇지 못하면 "You lose"화면이 출력됩니다.
GameOverScene.cpp 와 GameOverScene.h 파일을 만듭니다.
GameOverScene 파일을 만들면 아래와같이 생성되는데 이 두개의 파일을 Classes 폴더 하위에 옮깁니다.
먼저 두개의 파일을 선택하고 del 키를 누르거나 오른쪽 - 삭제 메뉴를 클릭합니다.
이렇게 제거를 하고 난 다음에 실제로 존재하는 파일위치를 변경합니다,
클래스를 생성하면 proj.win32 폴더에 파일이 생성되는데 이파일을 Classes 폴더에 옮깁니다.
예) C:\Android\cocos2d-x\cocos2d-x-2.1.5\projects\SimpleGame\proj.win32
C:\Android\cocos2d-x\cocos2d-x-2.1.5\projects\SimpleGame\Classes
visual studio 의 폴더와 실제 폴더 위치를 동일하게 해줘야 나중에 문제가 생기지 않습니다
이렇게 파일의 위치를 옮기고 Class폴더에서 오른쪽 버튼 - 추가 - 기존항목을 눌러 cpp와 h를 추가하거나 폴더에서 드래그앤 드롭으로 추가합니다.
파일의 위치를 수정하고 GameOverScene.h와 GameOverScene.cpp를 아래와 같이 수정합니다
팁:
1. 클래스 멤버 함수는 .m 파일에서는 h파일에 선언없이 사용할수 있지만 c++에서는 무조건 선언해줘야된다.
2. 함수 create() (2.0 이전 버전에서는 node()) 는 c++에서는 self 라는 키워드가 없습니다.
CREATE_FUNC는 더 쉽게 create()함수를 생성하게 도와주는 매크로 입니다.
두매크로를 사용하기 위해서는 init()를 구현해야됩니다.
3. cocos2d-x에서는 안드로이드 sdk 에서는 try catch를 지원하지 않기 때문에 초기화를
생성자에서 한번 init에서 한번 촉화 합니다
4. setter 및 getter _lable와 _layer는 다양한 매크로로 구현할수 있으며,
위 코드에서 CC_SYNTHESIZE_READONLY 는 getter 만 구현 합니다.
GameOverScene.cpp 코드
GameOverScene.cpp 에서는 하나의 scene 과 하나의 layer 로 구현된다. 하나의 신은 여러 layer 포함할수 있습니다.하나의 레이어의 중앙에 "You Win!" 혹은 "You Lose!"를 출력합니다.
팁
1. GameOverLayer _label 과 GameOverScene _layer 은 선언되었고, init에서 retain을 해주고 소멸자에서 release를 해줘야 됩니다.
2. NSAutoReleasePool 은 cocos2d-x 에서도 존재합니다.
우리는 두가지 경우에 release()를 호출합니다.
- 개체에 new 로 선언했을때 예를 들어 CCSprite * sprite = new CCSprite();
- 개체가 static 함수에 의해서 만들어질때 예를 들어 CCSprite * sprite = CCSprite::create(); 에는 필요하지 않지만 sprite->retain()을 호출하면 sprite->release()를 호출해야 됩니다.
우리는 HelloWorldScene 다음 변수를 추가해야 됩니다.(얼마나 많은 적을 죽였는지 카운팅 해주는 변수)
int _projectilesDestroyed;
HellWorld::HelloWorld() 에서 초기화 시켜줍니다.
HelloWorld::HelloWorld()
:_targets(NULL),
_projectiles(NULL),
_projectilesDestroyed(0)
{
}
GameOverScene.h 를 HelloWorldScene.cpp 에 include 를 해줍니다.
#include "GameOverScene.h"
이길때 처리
HelloWorld::update() 함수의 TargetsToDelete 루프에 다음 코드를추가합니다.
//충돌한 적에 대한 처리
CCARRAY_FOREACH(targetsToDelete, jt)
{
CCSprite * target = dynamic_cast<CCSprite *>(jt);
_targets->removeObject(target);
this->removeChild(target, true);
_projectilesDestroyed++;
if(_projectilesDestroyed >= 5){
GameOverScene * gameOverScene = GameOverScene::create();
gameOverScene->getLayer()->getLabel()->setString("You win!");
CCDirector::sharedDirector()->replaceScene(gameOverScene);
}
}
질때 처리
HelloWorld::spriteMoveFinished에 다음 코드를 추가합니다.
//배열에 집어넣었던 적 or 표창을 배열에서 제거한다.
if(sprite->getTag() == 1) //적
{
_targets->removeObject(sprite);
//적이 하나라도 화면을 벗어나면 게임에서 진다.
GameOverScene * gameOverScene = GameOverScene::create();
gameOverScene->getLayer()->getLabel()->setString("You Lose :[");
CCDirector::sharedDirector()->replaceScene(gameOverScene);
}
모든 준비가 끝났습니다. 컴파일을하고 실행을 합시다.
적. 표창 ,배경음악, 승리화면 등 모두 완성 했습니다.
'잡다한것들전부 > Tutorial' 카테고리의 다른 글
| 챕터 6 - 씬을 전환하는 방법 (1) | 2013.09.22 |
|---|---|
| 챕터 5 - 음악 재생 및 이펙트 효과음 재생 하는 법 (0) | 2013.09.22 |
| 챕터 4 - 충돌 체크하는 법 (0) | 2013.09.22 |
| 챕터 3 - 표창을 발사하는 방법 (0) | 2013.09.21 |
| 챕터 2 - 스프라이트를 움직이는 방법 (0) | 2013.09.21 |
| 챕터 1 - 스프라이트를 추가하는 방법 (0) | 2013.09.21 |





