ノラプログラマーの技術メモ

ネットで調べても出てこなかった情報を載せていきたい技術系ブログ。

cocos2d-xで画像(スプライト)を扱う

概要

cocos2d-xで画像(スプライト)を表示する。画像はJPGやPNGが使える。透過PNGであれば何もしなくても透過処理される。

環境

windows8.1
cocos2d-x v2.2.3

手順

画面サイズを取得して、画像を読み込んで中央に配置する。

CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCSprite* pSprite = CCSprite::create("mickey.png");
pSprite->setPosition(ccp(winSize.width/2, winSize.height/2));
pSprite->setTag(1);
this->addChild(pSprite, 0);

setTagでタグを指定。タグはオブジェクトを一意に特定することができるので、タグからオブジェクトを呼び出すことができる。

addChildの第二引数にZオーダーを指定。Zオーダーはオブジェクトの重ね順を示し、数字が大きいほど前面にくる。

画像を表示するとこんな感じ。

f:id:kawai_norimitsu:20140613163938p:plain

追記

画像を透けさせるにはsetOpacitysetOpacityで値を指定。値の範囲は0~255。

pSprite->setOpacity(128);

画像を大きくしたり小さくしたりするにはsetScaleで値を指定。例えば0.5fで0.5倍。

pSprite->setScale(0.5f);

cocos2d-xでiPhoneとAndroidのマルチ解像度に対応する

問題

iPhoneは4系と5系で解像度が決まっているけれど、Androidは端末ごとでバラバラ。アプリを作ろうとすると、どうしてもマルチディスプレイ問題を解決する必要がある。

環境

windows8.1
cocos2d-x v2.2.3

解決方法

AppDelegate.cppのapplicationDidFinishLaunching関数に次の1行(pEGLView->setDesignResolutionSize)を入れる。

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

    pDirector->setOpenGLView(pEGLView);
	
    // マルチ解像度対応
    pEGLView->setDesignResolutionSize(480, 320, kResolutionShowAll);

    // 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;
}

このままでも対応できているけど、Retinaのような解像度が高いディスプレイで表示すると画像が伸ばされるのでボヤけた感じに見える。

これを解消するにはリソースを2つに分けて、低解像度のものと高解像度のものを作る必要がある。もしリソースを2つに分けたのなら、AppDelegate.cppを次のように修正する。

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

    pDirector->setOpenGLView(pEGLView);
	
    // マルチ解像度対応
    pEGLView->setDesignResolutionSize(480, 320, kResolutionShowAll);
    CCSize frameSize = pEGLView->getFrameSize();
    std::vector< std::string > searchPath;
    if (frameSize.height >= 640.0f ) {
        searchPath.push_back("hd");
        pDirector->setContentScaleFactor(2.0f);
    } else {
        searchPath.push_back("sd");
    }
    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 = HelloWorld::scene();

    // run
    pDirector->runWithScene(pScene);

    return true;
}

この辺はCocos2d-x:絶対にわかるマルチ解像度(マルチディスプレイ)対応 | Cocoa部に書かれている説明がとても分かりやすいので参考にしてみてください。

cocos2d-xのCCLabelTTFで日本語を表示したら文字化けした時の解決法

問題

windows環境でcocos2dx開発。CCLabelTTFで文字列を出力しようとしたら英数字は問題なし。だけど日本語が文字化けしてしまったので、その対処方法。

ちなみに下記のプラグマを追加すれば直るってネットに書かれてたけれど、これは開発環境がvisual studioの場合らしい…。eclipseじゃ当然、やってみてもダメだった。

#pragma execution_character_set("utf-8")

環境

windows8.1
cocos2d-x v2.2.3
eclipse4.3

解決手順

windowsはshift-jisだけど、androidなどのスマホ端末はutf-8だから日本語が文字化けする。なのでソースコード(HelloWorldScene.cppなど)をSJISからUTF-8に変換する。

次にeclipseのメニューから[ウィンドウ]-[設定]をクリックする。続いて[一般]-[ワークスペース]を選択する。

f:id:kawai_norimitsu:20140610100503p:plain

[テキスト・ファイル・エンコード]を「その他」にチェックを入れ、「UTF-8」を選択してOKボタンを押して保存する。

これで文字化けが解消した。

子供向け教育iPhoneアプリの審査が通らなかった時の解決法

子供向けのiPhoneアプリをバージョンアップしようとしたらリジェクトされてしまった。

拒否された理由は以下の通り。

Reasons

24.3: Apps in the Kids Category must get parental permission or use a parental gate before allowing the user to link out of the app or engage in commerce
24.3

We noticed you have selected the Made for Kids option for your app, assigning it to the Kids Category, but it includes links out of the app or engages in commerce without first obtaining parental permission. This is not in compliance with the App Store Review Guidelines.

Specifically, your app includes access to external content or allows the user to engage in commerce, without first obtaining parental permission. For example, we found the following features in your app:

  • Linking to website content via Safari or web views
  • Signing up for ranking

See the attached screenshots for more information.

Please update your app to require parental permission or incorporate a parental gate before the user can leave the app or engage in commerce, and ensure that the parental gate cannot be disabled. For more information on parental gates, please see the Parental Gates page in the App Store Resource Center. Alternatively, you may revise your app to remove these features.
Screenshot_0.png
Screenshot_1.png
Screenshot_2.png

google先生による翻訳は以下のような感じ。

の理由

24.3:キッズカテゴリー内のアプリは、親の許可を得るか、APPのうちにリンクや商業に従事することをユーザに許可する前に、親のゲートを使用する必要があります
24.3

私たちは、子供のカテゴリに割り当てること、あなたはあなたのアプリケーションのために子供のオプションのために作らを選択している気づいたが、それはアプリからのリンクが含まれていたり最初に親の許可を得ずに商取引を行っています。これはApp Storeのレビューガイドラインを遵守していない。

具体的には、あなたのアプリケーションは、外部のコンテンツへのアクセスが含まれていたり、ユーザーが最初に親の許可を得ることなく、商業に従事することができます。例えば、我々はあなたのアプリケーションで、以下の機能が見つかりました:

  • SafariやWebビューを経由してWebサイトのコンテンツへのリンク
  • ランキングにサインアップ

詳細については、添付のスクリーンショットを参照してください。

ユーザーがアプリを残したり、商業に従事し、親のゲートは無効にすることはできませんことを保証することができる前に、保護者の許可を必要とするか、または親のゲートを組み込むアプリを更新してください。親のゲートの詳細については、App Storeのリソースセンターでは保護者ゲイツページを参照してください。代わりに、これらの機能を削除するには、アプリを改訂することがあります。
Screenshot_0.png
Screenshot_1.png
Screenshot_2.png

どうやらアプリを教育カテゴリに入れると、外部アクセスするアプリは「parental gate(親の承認)」なる仕組みが必要らしい。ガイドラインにもそれっぽいことが書いある。

ParentalGateって何?と思って調べてみると、大人(主に親)が解除できる仕組みとのこと。例えば、四則演算に正解すると機能が解除されるなど。

確かにアプリにランキング機能をつけた時にappleのgame centerを利用しないで自前のランキングシステムにアクセスするように作ったのだった。それはアプリのランキングボタンを押すと、safariが起動して外部のwebページが表示される仕組みだ。

仕方ないので、ランキングボタンが押されたら以下のようなparental gateダイアログが表示されるようにして再審査を依頼。

f:id:kawai_norimitsu:20140610100730p:plain

すると1週間後に無事に審査に通った。

ちなみにandroidアプリはこんな制限がないので、このダイアログは表示されないようにしてある。

いろいろ面倒臭いなあ。

iPhoneアプリ審査で「Metadata Rejected」が出た時の対処法

AppleiOS Dev Centerでアプリを更新したのだけれど「Metadata Rejected」の理由でリジェクトされてしまった。

リジェクトされた理由は以下の通り。

Reasons

24.1: Apps in the Kids Category must include a privacy policy and comply with applicable children's privacy statutes
24.1

We noticed you have selected the Made for Kids option for your app, assigning it to the Kids Category, but it does not include a privacy policy; this is not in compliance with the App Store Review Guidelines.

Please update your app metadata to include a privacy policy and ensure that the privacy policy URL you provide for the App Store takes the user to your privacy policy.

これはGoogle先生に翻訳してもらったもの。

我々はあなたが子供のカテゴリに割り当てる、あなたのアプリケーションのために子供のオプションのために作らを選択している気づいたが、それは、プライバシーポリシーが含まれていません。これはApp Storeのレビューガイドラインを遵守していない。

プライバシーポリシーをインクルードして、App Storeで提供プライバシーポリシーURLはあなたのプライバシーポリシーにユーザーを誘導することを確認するために、アプリケーションのメタデータを更新してください。

どうやら子供向けアプリにはプライバシーポリシーが必須らしいので、プライバシーポリシーのページを作ってアプリのmetaデータにURLを追加して再審査。

1週間後、無事に審査に通った。よかったー

chromeで数字とアルファベットが文字化けのようになった時の解決法

問題

chromeで英数字が文字化けしたかのような手書き文字になってしまう。
具体的には、下記の画像ように表示されてしまう。

f:id:kawai_norimitsu:20140526112833p:plain

環境

windows8.1
chrome version35.0

対処法

georgiaというフォントが原因なので、これを削除する。

コントロールパネルを開いて、フォントを選択する。
続いて「georgia」と検索する。

f:id:kawai_norimitsu:20140526113028p:plain

georgiaフォントが表示されるので、これをダブルクリックして開く。
georgia 中」フォントがあるので、これを削除する。

f:id:kawai_norimitsu:20140526113015p:plain

一応、インターネット上から最新のgeorgiaフォントをダウンロード・インストールしてみたけれど改善しなかったので、仕方なく削除することにした。

削除後は「georgia 標準」というフォントが新しく追加された。