『Cocos2d-x by Example Beginner’s Guide』のマルチ解像度対応で“setResourceDirectory”がエラーになる。。

Cocos2d-x by Example Beginner's Guide

拙い英語力でなんとかcocos2d-xの勉強を進めているんですが、「Your First Game」という初っ端のサンプルの最初の設定で早くもエラーが出まくって“詰み“気味の今日このごろ。
「チェックメイト!」とでも叫びたいところですが、なんとか対応してみました。

問題となったのは、「Time for action – adding retina support」の章で追加したコード。
リソースフォルダを指定するsetResourceDirectoryというメソッドに、

No member named ‘setResourceDirectory’ in’cocos2d::CFileUtils

というメッセージが返ってきてしまいます。

どうやら、書籍の方はcocos2d-xのバージョンが古い様子。
頑張って最新のコードで書き換えてみました。

修正版のソース

[cpp highlight=”11,14,15,18,19,22″]
bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
CCDirector* pDirector = CCDirector::sharedDirector();
CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();

pDirector->setOpenGLView(pEGLView);

CCSize screenSize = pEGLView->FrameSize();
CCEGLView::sharedOpenGLView()->setDesignResolutionSize(768, 1024, kResolutionExactFit);

std::vector<std::string> searchPaths;

if (screenSize.width > 768) {
// CCFileUtils::sharedFileUtils()->setResourceDirectory("hd");
searchPaths.push_back("hd");
pDirector->setContentScaleFactor(2);
} else {
// CCFileUtils::sharedFileUtils()->setResourceDirectory("sd");
searchPaths.push_back("sd");
pDirector->setContentScaleFactor(1);
}
CCFileUtils::sharedFileUtils()->setSearchPaths(searchPaths);

// turn on display FPS
pDirector->setDisplayStats(true);

// set FPS. the default value is 1.0/60 if you don’t call this
pDirector->setAnimationInterval(1.0 / 60);

// create a scene. it’s an autorelease object
CCScene *pScene = HelloWorld::scene();

// run
pDirector->runWithScene(pScene);

return true;
}
[/cpp]

簡単に言うと、setResourceDirectorysetSearchPathsに置き換えているわけです。

が、現状のソースだと、解像度の数字が直接ソース内に書かれていて、あんまり綺麗ではない気が。
Androidの解像度への対応なども考えたり、将来より高解像度の端末が出た時の対応なんかを考えると、もう少しメンテナンスがしやすいコードにしていおきたいところ。

というわけで、更に以下のように修正してみます。

まずは、解像度の数値は別ファイルとして持たせます。
もちろん、AppDelegate.cpp内に書いても問題は無いです。

[cpp]
typedef struct tagResource
{
cocos2d::CCSize size;
char directory[100];
}Resource;

static Resource smallResource = { cocos2d::CCSizeMake( 384, 512), "sd"};
static Resource largeResource = { cocos2d::CCSizeMake( 768, 1024), "hd"};

static cocos2d::CCSize designResolutionSize = cocos2d::CCSizeMake(768, 1024);
[/cpp]

上記ファイルはAppDelegete.cpp内でincludeしつつ、AppDelegate::applicationDidFinishLaunching()を以下のように書き換えます。

[cpp highlight=”9,10,14,15,16,17,18,19,22,23,24,25″]
bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
CCDirector* pDirector = CCDirector::sharedDirector();
CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();

pDirector->setOpenGLView(pEGLView);

CCSize screenSize = pEGLView->getFrameSize();
// CCEGLView::sharedOpenGLView()->setDesignResolutionSize(768, 1024, kResolutionExactFit);
pEGLView->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, kResolutionExactFit);

std::vector<std::string> searchPaths;

// if (screenSize.width > 768) {
if (frameSize.width > largeResource.size.height) {
// searchPaths.push_back("hd");
// pDirector->setContentScaleFactor(2);
searchPath.push_back(largeResource.directory);
pDirector->setContentScaleFactor(largeResource.size.width / designResolutionSize.width);

} else {
// searchPaths.push_back("sd");
// pDirector->setContentScaleFactor(1);
searchPath.push_back(smallResource.directory);
pDirector->setContentScaleFactor(smallResource.size.width / designResolutionSize.width);
}
CCFileUtils::sharedFileUtils()->setSearchPaths(searchPaths);

// turn on display FPS
pDirector->setDisplayStats(true);

// set FPS. the default value is 1.0/60 if you don’t call this
pDirector->gt;setAnimationInterval(1.0 / 60);

// create a scene. it’s an autorelease object
CCScene *pScene = HelloWorld::scene();

// run
pDirector->runWithScene(pScene);

return true;
}
[/cpp]

これでOK!
スクリーンショット 2014 03 10 2 23 41

単純に書籍のサンプルのエラーを消すだけだったらコード内に数字をガリガリ書いても問題ないとは思いますが、こういう汎用向けな書き方も参考までに!

Commentsこの記事についたコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です