챕터 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

챕터 3 - 표창을 발사하는 방법

|

표창을 던져서 적을 죽이는 코드를 추가하자. 먼저 레이어에 터치가 가능하게 하는 코드를 추가하자

bool HelloWorld::init() 맨 아래에 추가(return true 바로위)

 

//터치가능하게

this->setTouchEnabled(true);

Cllback 함수인

"void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);"

를 HelloWorldScene.h 에 추가하고

HelloWorld.cpp 에 아래 함수를 추가하자

이제 터치를 하면 표창을 던질수 있다.

 

 

 

 


 

 

소스 설명

 

 

  int realX = winSize.width + (projectile->getContentSize().width/2);

  float ratio = (float)offY/(float)offX;

  int realY = (realX * ratio) + projectile->getPosition().y;

 

ratio = 삼각함수 비를 그대로 곱해줘서 x값에 비례하는 y값을 구할수 있습니다.

 

 

 


 

 

float length = sqrtf((offRealX * offRealX) +(offRealY * offRealY));

float velocity = 480/1;

float realMoveDuration = length/velocity;

 

1. length 는 피타고라스의 정리 a^2 + b^2 = c^2

sqrtf 함수는 제곱근을 구하는 함수입니다.

2. velocity 는 속력을 구하는 공식입니다.

가로 길이 480 / 1초

3. 시간을 구하는 함수입니다.

시간= 거리/속력

 

기초 물리공식

거리: 속력*시간

속력: 거리/시간

시간: 거리/속력 입니다..  

*계산 예문

 거리는? 60km *1시간 = 60km       속력은? 60km /1시간 = 60km     시간은? 60km / 60km =1시간

Trackback 0 And Comment 0

챕터 2 - 스프라이트를 움직이는 방법

|

챕터 1 - 스프라이트를 추가하는 방법

 

챕터1 에서 우리는 Player 캐릭터를 Scene 에 추가하는 작업을 했었다.

하지만 히어로는 홀로 있다. 우리는 적들을 추가할 생각이다.

적들을 이동하는 함수

void addTarget()와

이동이 끝난 적들을 사라지게 하는 함수

void spriteMoveFinished(CCNode * sender);

를 추가할 생각이다.

void addTarget()void spriteMoveFinished(CCNode * sender);  HelloWorldh.h 에 추가하고

class HelloWorld : public cocos2d::CCLayerColor

{

public:

    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone

    virtual bool init(); 

 

    // there's no 'id' in cpp, so we recommend returning the class instance pointer

    static cocos2d::CCScene* scene();

   

    // a selector callback

    void menuCloseCallback(CCObject* pSender);

   

    // implement the "static node()" method manually

    CREATE_FUNC(HelloWorld);

    //addTarget 함수 추가( 생성)

    void addTarget();

    //스프라이트 제거

    void spriteMoveFinished(CCNode * sender);

};

아래 소스를 HelloWorldScene.cpp에 추가하자(그리고 using namespace cocos2d; 를 맨 위에 추가하는 건 잊지말자.) ->USING_NS_CC;

addTarget 추가

SpriteMoveFinished 추가

1. rand 함수는 c std 함수를 사용한다.

2. YES , NO 는 true , false 이다

3. callback 함수를 사용할수 있다. (cocos2d에서는 selector 에 대응됨)

cocos2dx\include\selector_protocol.h -> 이안에 정의 되어있음

  • schedule_selector(_SELECTOR) (SEL_SCHEDULE)(&_SELECTOR)

  • callfunc_selector(_SELECTOR) (SEL_CallFunc)(&_SELECTOR)

  • callfuncN_selector(_SELECTOR) (SEL_CallFuncN)(&_SELECTOR)

  • callfuncND_selector(_SELECTOR) (SEL_CallFuncND)(&_SELECTOR)

  • callfuncO_selector(_SELECTOR) (SEL_CallFuncO)(&_SELECTOR)

  • menu_selector(_SELECTOR) (SEL_MenuHandler)(&_SELECTOR)

  • event_selector(_SELECTOR) (SEL_EventHandler)(&_SELECTOR)

  • compare_selector(_SELECTOR) (SEL_Compare)(&_SELECTOR)

이것들은 callbck 함수 정의에 의해서 사용할수 있다. 예를들면

CCTimer::initWithTarget 은 두번째 인자가 SEL_SCHEDULE 타입이다.

bool initWithTarget(CCObject *pTarget, SEL_SCHEDULE pfnSelector);

우리는 schedule_selector(_SELECTOR)을사용할수있다.

우리는 적들을 생성하는 함수를 1초에 한번 호출하도록 설정할수 있다.

bool HelloWorld::init()의 맨 아래에 (return true; 바로 위) 아래 소스를 추가하자

//gameLogic 함수를 매초마다 실행

this->schedule(schedule_selector(HelloWorld::gameLogic),1.0f);

아래에 소스도 추가하자

HellWorldScene.h 에는 void gameLogic(float dt);을 추가하고

HellWorldScene.cpp에는 아래 소스를 추가하자

void HelloWorld::gameLogic(float dt)

{

   this->addTarget();

}

 

 

 

 

Trackback 0 And Comment 0