C++14 코드를 적었더니 갑자기 빌드에 실패했다.

(command line tool에서 cocos build/run 명령어로 빌드 기준)

해결법은 간단하다.

위 사진처럼 proj.android\jni\Application.mk파일의 -std=c++11부분을 -std=c++14로 바꿔주면 끝.



Posted by RPG만들기XP
,


볼륨조절이 제대로 작동하지 않아서 보니까 최신버전인데 이모양..


만들기 어려워서 아무도 손을 못대고 있는건가?

Posted by RPG만들기XP
,

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
,
코코스 초기 프로젝트를 생성하면 다음과 같은 코드가 기본으로 생성되어 있다.

// Set the design resolution
glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::SHOW_ALL);
Size frameSize = glview->getFrameSize();
// if the frame's height is larger than the height of medium size.
   if (frameSize.height > resolutionSize3.height)
   {        
       director->setContentScaleFactor(MIN(designResolutionSize.height / resolutionSize4.height, designResolutionSize.width / resolutionSize4.width));
   }
   // if the frame's height is larger than the height of small size.
   else if (frameSize.height > resolutionSize2.height)
   {        
       director->setContentScaleFactor(MIN(designResolutionSize.height/ resolutionSize3.height, designResolutionSize.width/resolutionSize3.width));
   }
else if (frameSize.height > resolutionSize1.height)
{
    director->setContentScaleFactor(MIN(designResolutionSize.height / resolutionSize2.height, designResolutionSize.width / resolutionSize2.width));
}
   // if the frame's height is smaller than the height of medium size.
   else
   {        
       director->setContentScaleFactor(MIN(designResolutionSize.height / resolutionSize1.height, designResolutionSize.width / resolutionSize1.width));
   }

이것 때문에 한참을 뻘짓하다가..(contentScaleFactor에 버그가 있는지, 1보다 큰 값을 넣어줘도 줄어들 때가 있는가 하면 작은 값을 넣어주면 원래 의도보다 너무 커지거나 하는 경우도 있다.)

얻은 해답은 위의 코드를 전부 삭제하는 것이다.

// Set the design resolution
glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::SHOW_ALL);
Size frameSize = glview->getFrameSize();

다만, 이 부분만 남겨 두면 된다.
setDesignResolutionSize 함수 하나만으로 (그리고 뒤에 넣어주는 ResolutionPolicy 인자만으로)

자동으로 모든 해상도에 맞춰서 자르고 늘리고 끼우고 다 해준다.

왜 아래의 필요없는 코드를 샘플 프로젝트에 포함시켜 두었는지는 의문.



갤럭시S6에서 잘 나오는 기념으로 인증샷

Posted by RPG만들기XP
,



맨날 까먹어서 프로젝트 생성할 때마다 구글링 ㅠㅠ...

그래서 정리..


프로젝트를 생성하고자 하는 위치에서 콘솔을 열고 "cocos new 게임이름 -p 패키지.이.름. -l cpp" 치고 엔터

(환경변수 설정이 되어있어야 한다. - 링크)

Posted by RPG만들기XP
,