2014年05月19日

cocos2d-xでBGM再生をしていると、たまに処理が重くなる

どういうタイミングかはわからないのですが、たまに処理が重たくなる現象が発生しました。1フレームあたり大体15msecくらいになって、ぎりぎり60fpsを維持できないような感じでした。

色々試してみると、どうもBGMの再生の処理が怪しいようで、一度pauseBackgroundMusicをしてからresumeBackgroundMusicを行うとなんか処理速度が元に戻ることがわかりました。

というわけで、イマイチ原因はよくわからないのですが、とりあえずBGMを切り替えるときにplayBackgroundMusicを実行する前にstopBackgroundを行うようにしてみました。これが正しい使い方なんですかね?

毎回処理が重くなっていたわけではないので、ちゃんと修正されたのかどうかはよくわからないのですが、とりあえず今のところ問題は再現しなったので一旦これで様子見してみます。
ラベル:とりとま cocos2d
posted by かねだ at 00:08| Comment(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2014年05月11日

cocos2d-x v3.0.0への移行

cocos2d-xのバージョンは2.1.5を使用していたのですが、Release Buildをしようとするとエラーが出ました。

どうやらv2.1.5はiPhone5sのCPUに対応していないのが原因のようです。

Debug Buildの場合には使用するデバイス(私の場合はiPhone5)に対応したモジュールだけ作成するような設定になっているために今まで気づきませんでした。

というわけで、最新のv3.0.0へと移行してみたのでその時の方法についてメモ書きしてみます。

インストール

なんとなく、githubからダウンロードしてみました。

cocos2d-consoleは別プロジェクトになっているようなので、そちらもダウンロードします。

$ git clone https://github.com/cocos2d/cocos2d-x.git
$ cd cocos2d-x/tools
$ git clone https://github.com/cocos2d/cocos2d-console.git
$ cd ../
$ ./setup.py

プロジェクトの作成

プロジェクトの作成は次のコマンドで。最初、保存先フォルダにプロジェクト名のディレクトリが自動で作成されると知らずに二重にフォルダを作ってしまいました。

$ cocos new <プロジェクト名> -p <パッケージ名> -l cpp -d <保存先フォルダ>

元のプロジェクトのコピー

まずは.gitと.gitignoreをコピー。

git statusで確認するとdeletedがどばーっと出てくるので、自分で作成したファイルについてはgit checkout -- ファイル名でダウンロードします。

proj.andorid以下はまだ編集してなかったので、削除されているものはgit rm、変更・追加されているものはgit add

proj.ios以下はフォルダ構成が変わっているので、一旦proj.ios_mac/iosの下からproj.ios/へと移動してからgit mvで移動します。

AppDelegateとかproj.ios_mac以下のファイルはgit diffで適宜マージを実施します。

最後にXcodeのプロジェクトの設定でBundle IdentifierとTeamを設定して、各ファイルをプロジェクトに追加してコピーは完了です。

CCプレフィックスの削除

v2からv3になって色々と変わっていたので、思い付いたものから順番に書いていきます。

まずはクラス名の頭に付いていたCCがなくなっているので、それに合わせて変更します。

ただ、CCPointがVector2になっているように単純にCCがなくなっているというわけでもないので、Command + クリックで定義をたどるのが手っ取り早い気がします。

定数もkなんとかでなくなっているので合わせて修正。

ccTouch*をonTouch*に変更

CCLayer::ccTouchBegan等のタッチイベント関連の処理がonTouch*に変わっています。自分でCCLayerを継承したクラスを作成してccTouch*をオーバーライドしている場合は修正が必要です。

単に名前が変わっているだけでなく、タッチイベントの開始の方法も変わっています。

v2ではonEnterで次のような処理を入れていました。

// タッチイベント処理を開始する
CCDirector *director = CCDirector::sharedDirector();
CCTouchDispatcher *touchDispatcher = director->getTouchDispatcher();
touchDispatcher->addTargetedDelegate(this, 0, true);

v3では代わりにコンストラクタに次のような処理を入れます。

// Register Touch Event
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);

listener->onTouchBegan = CC_CALLBACK_2(クラス名::onTouchBegan, this);
listener->onTouchCancelled = CC_CALLBACK_2(クラス名::onTouchCancelled, this);
listener->onTouchEnded = CC_CALLBACK_2(クラス名::onTouchEnded, this);
listener->onTouchMoved = CC_CALLBACK_2(クラス名::onTouchMoved, this);

_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

CDAudioManager.hのインクルードパスの修正

CDAudioManager.hをインクルードしているところでパスを指定しないとコンパイルが通らなくなったので、パスを指定するようにしました。

#include "audio/ios/CDAudioManager.h"

GLView::sharedOpenGLViewが削除されているものに対応

GLView::sharedOpenGLViewがなくなっているので、使用している場合は変更が必要です。

私の場合はAppDelegate::applicationDidFinishLaunchingから呼び出す処理で使用していたので、引数でglviewを渡すようにしました。

get*系の関数の使用

SpriteFrameCache::sharedSpriteFrameCacheがSpriteFrameCache::getInstanceに変わっているように、何かを取得する関数がget*に名前が変わっているので、それに合わせて修正します。

resumeSchedulerAndActions、pauseSchedulerAndActionsの変更

Node::resumeSchedulerAndActionsとNode::pauseSchedulerAndActionsはcocos2d内部で使用するようなので、代わりにNode::resume、Node::pauseを使用するように変更します。

callfunc_selectorをstd::functionに変える

callfunc_selectorはstd::functionに変更する必要があります。次のような感じで使用するようです。

CallFunc *callFunc = CallFunc::create(std::bind(std::mem_fun(&関数名), this));

LabelProtocolの変更

LabelProtocolのgetString、setStringの型がconst char *からstd::string&に変更されているので、それに合わせて変更します。

CCARRAY_FOREACHの変更

CCARRAY_FOREACHの代わりにfor文を使用します。

v2の場合は次のような感じでしたが、

CCObject *object = NULL;
CCARRAY_FOREACH(getChildren(), object) {
    // ...
}

v3の場合は次のようになります。

for (Node *item : getChildren()) {
    // ...
}

PIEの無効化

これはcocos2d-x v3に変えたせいで起こったのかはわかりませんが、なんかビルドエラーが起きたので対応しました。

ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE, but used in _jinit_arith_decoder from モジュール主力先のパス/Products/Debug-iphoneos/libcocos2dx iOS.a(jdarith.o). To fix this warning, don't compile with -mdynamic-no-pic or link with -Wl,-no_pie

プロジェクトを選択してTARGETを選んで、[Build Settings]-[Linking]-[Don't Create Position Independent Executables]を"Yes"に変更するとビルドが正常に終了しました。

ちなみにこの辺の設定の意味はよく分かっていません。

DEBUG定数の定義

もしかするとv2のときも自分に設定したのかもしれませんが、Debug Build時にはDEBUGを定数定義するようにしました。

プロジェクトを選択してTARGETを選んで、[Build Settings]-[Apple LLVM 5.1 - Processing]-[Process Macros]-[Debug]に"DEBUG=1"を追加しました。

ラベル:とりとま cocos2d
posted by かねだ at 23:51| Comment(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2014年04月28日

壁との当たり判定の修正など

今日は壁との当たり判定の処理にバグが有ったので、それの修正をしていました。

バグの内容は、地面に向かって斜めに自機を移動していると、たまに地面にめり込む事があるというものでした。

1.png

壁との当たり判定は次のような処理になっていました。
1.自機を移動する。
2.移動先の位置に障害物があるか調べる。
3.障害物があれば、障害物の端まで自機の位置を戻す。

2.png

この考えで困るのが斜めに移動する場合です。

最初は深く考えずに次のように処理を作っていました。
1.横方向に見て、移動前から障害物と当たり判定が重なっている場合は縦方向に移動する。
2.縦方向に見て、移動前から障害物と当たり判定が重なっている場合は横方向に移動する。
3.どちらでもなければ、とりあえず横方向に移動する。

3.png

このようにすると、ちょうど2つの障害物の隙間から斜めに移動すると上方向に移動するべきところで横方向に移動するために地面にめり込む現象が発生してしまいました。

4.png

対策として、斜めに移動して、とりあえず横方向に移動した後に、再度障害物との当たり判定を確認して、重なりを検出した場合は横方向の移動を取りやめて縦方向に移動するようにしました。

ゲームとか作り慣れていないので、こういう当たり判定なんかの処理をどう作ったものかわからずに手探りでやってるんですが、なんかもっと効率の良いやり方があるんじゃないかと思ってしまって仕方がないです。早く数をこなしてサクサク作れるようになりたいものです。
ラベル:とりとま
posted by かねだ at 00:12| Comment(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。