반응형

cocos2d-x로 게임을 만들수록 새로운 기능들을 알게 되는데 

이번에 새로 알게된 좋은 기능이 있어 소개합니다.

(이미 아는 분들도 있겠지만 ^^ 혹시 저처럼 몰라서 힘들게 돌아가는 길을 택한 분들께 바칩니다.)


애니메이션을 구현하다 보면 노드에 액션을 주고 액션이 끝났을 경우 그 노드를 삭제해야 하는 경우가 있습니다.

어제 까지만 해도 항상 시퀀스를 사용해서 마지막 시퀀스 파라메터에 콜백함수를 주고 노드를 넘겨 삭제를 했었습니다.

(참 바보 같죠 ㅠ_ㅠ)


예를 들어 아래와 같이 구현 했었죠.


void SceneGame::animateBlockMoveDown() // 애니메이션 구현

{

    auto node = Node::create();

    auto actionMove = MoveTo::create(0.3f, Vec2(100, 100));

    auto callbackFunc = CallFuncN::create(CC_CALLBACK_1(SceneGame::callbackBlockMoveDownEnd, this));

   

    auto actionSeq = Sequence::create( actionMove, callbackFuncNULL);


    node->runAction(actionSeq);

}


void SceneGame::callbackBlockMoveDownEnd(cocos2d::Ref *ref)  // 노드 삭제 처리

{

    auto node = dynamic_cast<Node*>(ref);

    node->removeFromParentAndCleanup(true);

}


 문제가 있는 코드는 아닙니다.


콜백함수에서 애니메이션이 끝난 뒤 다른 처리를 하지 않고 노드삭제 처리만 할 거라면 

콜백함수를 만들어야 하는 귀차니즘과 모든 액션에 콜백을 만들어야 한다면 소스코드 또한 지저분해질수 있습니다.

(콜백 함수만... 20개...모두 액션 삭제처리만...물론 노드 삭제처리 콜백 함수 하나만 만들어도 됩니다. ^^)


좀더 깔끔하고 멋진 코드를 위해 사용 하시면 좋을 것 같습니다.


RemoveSelf 액션 함수 사용법에 대해 알아 볼께요.

void SceneGame::animateBlockMoveDown() // 애니메이션 구현 및 노드 삭제 처리

{

    auto node = Node::create();

    auto actionMove = MoveTo::create(0.3f, Vec2(100, 100));

    auto actionRemove = RemoveSelf::create();

    

    auto actionSeq = Sequence::create( actionMove, actionRemove, NULL);


    node->runAction(actionSeq);

}

위 대로 하면 애니메이션 구현 및 노드 삭제처리를 한번에 할 수 있습니다.



update 함수를 보면 아래와 같이 구현 되어 있습니다.

void RemoveSelf::update(float time) 

{

    CC_UNUSED_PARAM(time);

    _target->removeFromParentAndCleanup(_isNeedCleanUp);

}

removeFromParentAndCleanup기능을 하는 액션인거죠. ^^



파라메터로 cleanup 여부를 전달 할 수 있는데 Default가 true로 되어 있습니다.

static RemoveSelf * create(bool isNeedCleanUp = true);



이편한걸 이제야 알았다는게 조금 힘드내요. ^^

사용한지 아직 하루 밖에 안되어서 무슨 문제가 있는지 모르겠지만

문제점을 알고 계신 분은 코멘트 남겨주세요.


감사합니다.

반응형

+ Recent posts