챕터 4 - 충돌 체크하는 법

|

주인공은 표창을 발사한다 하지만 적들은 죽지않는다

이번 챕터에서는 표창과 적들의 충돌체크 방법을 소개한다.

게임에서 우리는 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));

컴파일을 하고 난후면 표창을 던지면 적이 죽는 모습을 볼수 있을 것이다.

 

Trackback 0 And Comment 0