cocos2d-x 프레임워크 최상단에는 Ref 클래스가 존재한다.

Ref 클래스는 모든 오브젝트들의 최상위 부모 클래스로, cocos2d-x의 autorelease pool에 의해 관리된다.

Node 클래스는 화면상에 표시될 수 있는 클래스로, Ref 클래스를 상속받으며 Tree 구조를 이루며 서로 참조한다.

(Sprite 클래스도 Node 클래스의 자식이다.)


그런데, 지금까지 기능 모듈을 개발할 때 addChild등을 이용하기 위해 Node 클래스를 상속받아 구현했었는데, 알고 보니 cocos2d-x에도 Component 클래스라는 것이 있었다!!


언리얼엔진4에서는 Node에 대응하는 것이 Actor인데, Actor에 ActorComponent라는 기능 모듈을 붙였다 떼었다 하는 방식으로 모듈형 프로그래밍을 할 수 있었다.

cocos2d-x에서는 안되는줄 알았는데 Component클래스라는 것이 있다는 걸 알고 지금까지 Node를 상속받아서 구현했던 기능 모듈들을 Component로 뜯어고쳤다.


사용법은 크게 달라질 것이 없는데, 모듈을 붙이고자 하는 클래스에 AddChild() 대신 AddComponent()하면 끝(;;).


class UnitState : public Component
{
public:
    virtual void StartState(Unit* unit) = 0;
    virtual void RunState(Unit* unit) = 0;
    virtual void EndState(Unit* unit) = 0;
};

기존에 Node를 상속받아서 만들었던 State클래스를 Component로 바꿔주었다.


void Unit::changeState(UnitState* state)
{
    if (_state)
    {
        this->getState()->EndState(this);
        this->removeComponent(_state);
    }
    this->setState(state);
    this->getState()->StartState(this);
    this->addComponent(state);
}

이렇게 붙여서 reference count를 자동으로 관리할 수 있다.

Posted by RPG만들기XP
,