cocos2d-x 3.0 のUIを使った話

UI関連の機能がいろいろ入ったそうなので、その中のUIButtonを使ってみた。
……使ってみたかったけど、使えなかった話。


MenuScene.cpp

USING_NS_CC;
using namespace ui;

~~~~~

void MenuScene::createGameStartButton() {
  Button* startButton = Button::create();
  startButton->setTouchEnabled(true);
  startButton->setPosition(Point( 100, 100 ));
  startButton->addTouchEventListener(this, toucheventselector(MenuScene::startButtonEvent));
  this->addChild(startButton);
}

void MenuScene::startButtonEvent(Object* pSender, TouchEventType type) {
  switch (type)
    {
    case ui::TOUCH_EVENT_BEGAN:
      break;
    case ui::TOUCH_EVENT_MOVED:
      break;
    case ui::TOUCH_EVENT_ENDED:
      break;
    case ui::TOUCH_EVENT_CANCELED:
      break;
    default:
      break;
    }

参考:
iPhone - Cocos2d-x Betaでチェックしておきたい変更点(Value,EventListener,gui::UIButton,gui::UIPageViewなど) - Qiita


とりあえずこんな感じにかいてビルドしてみると、

ui/GUIDefine.h:31:38: fatal error: cocostudio/ObjectFactory.h: No such file or directory
 #include "cocostudio/ObjectFactory.h"

と怒られる。

プロジェクト内の cocos2d/cocos/ui/GUIDefine.h を見に行って、

#include "cocostudio/ObjectFactory.h"
↓
#include "../editor-support/cocostudio/ObjectFactory.h"

includeを環境に合わせて書き換える。

これで再度ビルドすると

ui/UILayoutDefine.h:54: error: undefined reference to 'cocos2d::ui::Margin::Margin()'
ui/UILayoutDefine.h:54: error: undefined reference to 'cocos2d::ui::Margin::Margin()'
Classes/MenuScene.cpp:44: error: undefined reference to 'cocos2d::ui::Button::create()'
Classes/MenuScene.cpp:47: error: undefined reference to 'cocos2d::ui::Button::loadTextures(std::string const&, std::string const&, std::string const&, cocos2d::ui::TextureResType)'
Classes/MenuScene.cpp:49: error: undefined reference to 'cocos2d::ui::Widget::addTouchEventListener(cocos2d::Ref*, void (cocos2d::Ref::*)(cocos2d::Ref*, cocos2d::ui::TouchEventType))'
ui/UILayoutDefine.h:54: error: undefined reference to 'cocos2d::ui::Margin::Margin()'

盛大に怒られる。

多分cocos2d-xのバグ。
似た事例:Ui::Layout linking problems - Cocos2d-x Forum

続報を待て。