'2013/09/22'에 해당되는 글 3건
- 2013.09.22 챕터 6 - 씬을 전환하는 방법 (1)
- 2013.09.22 챕터 5 - 음악 재생 및 이펙트 효과음 재생 하는 법
- 2013.09.22 챕터 4 - 충돌 체크하는 법
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 |
이번 챕터에서는 우리는 배경음악 및 게임내 효과음을 재생하는 방법을 배울것입니다.
약간의 코드만을 추가하는것만으로도 쉽게 음악을 재생할수있습니다.
cocos2d-x 에서는 SimpleAudioEngine가 존재합니다.
먼저 첨부파일 2개를 다운받으시고 Resources 폴더에 집어넣으세요
HelloWorldScene.cpp의 상단에 SimpleaudioEngine.h 를 include 시켜줍니다.
#include "SimpleAudioEngine.h"
배경음악을 재생시켜주는 것을 HelloWorld::init() 메서드 에 집어넣어줍니다.
(편의상 맨 아래 코드에 집어넣었습니다.)
CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic(
"background-music-aac.wav",true);
그리고 화면을 터치시 발생되는 이펙트는 ccTouchesEnded()에 집어넣어줍니다.(편의상 맨 아래에 집어넣었습니다.)
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("pew-pew-lei.wav");
컴파일하고 실행을 하면 소리가 재생될것입니다.
'잡다한것들전부 > 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 |
주인공은 표창을 발사한다 하지만 적들은 죽지않는다
이번 챕터에서는 표창과 적들의 충돌체크 방법을 소개한다.
게임에서 우리는 sprite에 태그를 붙인다 적 = tag 1 , 표창 = tag 2로
CCSprite는 CCNode를 상속받는데 CCNode에는 m_nTag라는 변수값이 있고 이 값
은 setTag() 및 getTag()로 접근할수 있다 우리는 이 Tag값을 이용해서 두가지
sprite를 구별한다.
먼저 HelloWorldScene.h 에 아래 코드를 추가한다.
생성자 및 소멸자도 추가한다.
이 코드는 적과 표창을 저장할수 있는 배열이다. (CCArray)
HelloWorld();
~HelloWorld();
protected:
cocos2d::CCArray * _targets;
cocos2d::CCArray * _projectiles;
HelloWorldScene.cpp 에서는 두개의 CCArray 을 메모리 할당하고 (HelloWorld::init() 메서드)
생성자에서는 변수를 초기화 하는 코드를
소멸자에서는 메모리를 해제하는 코드를 추가한다.
addTarget() 함수를 수정하자.
target 에 태그를 붙이고(1번 태그), _targets 배열에 새롭게 만들어진 target 을 집어넣는 코드
addTarget 함수 맨마지막에 집어넣자.
//targets 배열에 집어넣기
target->setTag(1);
_targets->addObject(target);
CccTouchesEnded() 함수를 수정하자.
_projectile 태그를 붙이고(2번태그) _projectiles 배열에 새롭게 만들어진 projectile 을 집어넣는 코드
//표창을 배열에 집어넣기
projectile->setTag(2);
_projectiles->addObject(projectile);
그리고 spriteMoveFinished 함수를 아래와 같이 변경한다.
void HelloWorld::spriteMoveFinished(CCNode * sender)
{
CCSprite * sprite = (CCSprite *) sender;
this->removeChild(sprite);
//배열에 집어넣었던 적 or 표창을 배열에서 제거한다.
if(sprite->getTag() == 1) //적
{
_targets->removeObject(sprite);
}
else if(sprite->getTag() == 2)//표창
{
_projectiles->removeObject(sprite);
}
}
update() 함수에서는 매 프레임 마다 충돌을 가지하고 충돌이 된 적이나 표창은 제거한다.
HelloWorldScene.h 에는 void update(float dt)를 선언하고
HelloWorldScene.cpp 에는 아래와 같이 정의하자
이렇게 정의한후 update() 함수를 매 프레임마다 블러주는 schedule 을 선언하자.
HelloWorld::init() 맨 아래에 선언해주자(return true 바로 위)
this->schedule(schedule_selector(HelloWorld::update));컴파일을 하고 난후면 표창을 던지면 적이 죽는 모습을 볼수 있을 것이다.
'잡다한것들전부 > 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 |



5.zip

