きょこみのーと

技術に関係ないほうのブログ

Cocos2d-x マルチレゾリューション対応でハマったこと

Androidはちゃんと画面サイズに応じて「L」,「M」,「S」のディレクトリから画像を読み込むようになっているのになぜかiOSがうまく行かない・・・という状況。

AppDelegate.cppのソース抜粋

マルチレゾリューション対応してます。 getFrameSizeで取得したサイズを元にどの画像を表示するか選択する。

bool AppDelegate::applicationDidFinishLaunching()
{
    // initialize director
    CCDirector* pDirector = CCDirector::sharedDirector();
    CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();

    pDirector->setOpenGLView(pEGLView);

     // デザインサイズの設定
    pEGLView->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, kResolutionNoBorder);

    CCSize frameSize = pEGLView->getFrameSize();
    CCLog("frameSize = width : %f height : %f", frameSize.width, frameSize.height);
    CCSize winSize = pDirector->getWinSize();
    CCLog("winSize = width : %f height : %f", winSize.width, winSize.height);

    std::vector<std::string> searchPath;

    if (frameSize.height > mediumResource.size.height)
    {
        // [L]ディレクトリのリソースを使用
        searchPath.push_back(largeResource.directory);
        float largeMin = MIN(largeResource.size.height / designResolutionSize.height, largeResource.size.width / designResolutionSize.width);
        pDirector->setContentScaleFactor(largeMin);

        CCLog("L(%f)", largeMin);
    }
    else if (frameSize.height > smallResource.size.height)
    {
        // [M]ディレクトリのリソースを使用
        searchPath.push_back(mediumResource.directory);
        float mediumMin = MIN(mediumResource.size.height / designResolutionSize.height, mediumResource.size.width / designResolutionSize.width);
        pDirector->setContentScaleFactor(mediumMin);

        CCLog("M(%f)", mediumMin);
    }
    else
    {
        // [S]ディレクトリのリソースを使用
        searchPath.push_back(smallResource.directory);
        float smallMin = MIN(smallResource.size.height / designResolutionSize.height, smallResource.size.width / designResolutionSize.width);
        pDirector->setContentScaleFactor(smallMin);

        CCLog("S(%f)", smallMin);       
    }

    // リソースディレクトリを指定
    CCFileUtils::sharedFileUtils()->setSearchPaths(searchPath);

    // 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 = TitleScene::scene();

    // run
    pDirector->runWithScene(pScene);
    return true;
}

 L,M,Sのリソースをaddするときに問題があった

シュミレーターが悪いのかなー?とか色々調べていたが、 挙動からしてどうも探す場所をちゃんと選べていない様子(一部だけ「L」だったり「M」だったり)

Cocos2d-xのwikiをsearchPathで検索したらこんなページを発見。

http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Mechanism_of_loading_resources

まさかと思ってみたら Resource下のフォルダ名が上記wikiのように黄色フォルダになってる。 (xcode上で見やすいようにフォルダ表示されているだけ)

あらためてadd Files する

ちゃんとフォルダ階層もaddしてあげる必要がある。

Create folder references for any added folders

を選択するとよい。

f:id:kyokomi:20130825201137p:plain

こんな感じに青いディレクトリになってたらOK

f:id:kyokomi:20130825201131p:plain これで無事適切な画像サイズを読み込むようになりました。

まあ今回の問題は、ぶっちゃけcocos2d-x関係ないんですよね・・・ そもそもXcodeちゃんと使いこなせてないという体たらくww