クラスの継承について試行錯誤。とランキング

<自分用のメモ>
 
私が長年利用してきたActionScript2やJavaScriptはプロトタイプベースの言語で、Cocos2d-x(C++)はクラスベースの言語。「弾幕の器」は勢いで制作したため上手くクラスを活用できていないので、今週は少しクラスの学習を進めた。

継承の活用

砲塔は4種類あるがクラスは完全に独立している。そのため「攻撃開始」や「ダメージ処理」の共通の処理を各々に記述しており効率が悪い。また同じメソッドを実行するにも以下の様に砲塔のクラス別にキャストしなくてはならず不便(実際は砲塔の種類毎にif文で分岐させるので、さらに複雑になってしまう)。
——————–
//small fort
auto spEnemy = (SmallFort*)spFort;
spEnemy->attackStart();
——————–
//shield fort
auto spEnemy = (ShieldFort*)spFort;
spEnemy->attackStart();
—————————
なので今回は砲塔に共通のメソッドを持つ基底クラスを作成し、そこから各砲塔のクラスを派生させるようにする。
今回は基底クラスとしてFortCoreを作成し、各砲塔のクラスを派生させる。以下のソースはFortCoreを基にシールド砲塔のクラスを作成している。
—————————
class FortShield: public FortCore{
 //処理
};
—————————
結果として最初のソースは以下の様に共通のFortCoreでキャストすれば砲塔の種類にかかわらず共通のメソッドを実行できるようになる。
—————————
auto spEnemy = (FortCore*)spFort;
spEnemy->attackStart();
—————————
この辺りのノウハウは結構深そうなので今後も精進しよう。
 

階層の指定にrootを使わない

検索でゲームの作成について調べると、特定のスプライトをroot(シーン)から辿ってしていするケースが良くある。しかしトランジションを利用する場合はシーンが複数存在し特定できずエラーになる。なのでrootから辿ってスプライトを取得するのはやめたい。
———————————
scene/layer/SpriteBatchNode/自弾のスプライト
scene/layer/敵のスプライト
———————————
弾幕の器での自弾と敵の階層は上記の様になっています。弾幕の器では自弾のスプライトから敵のスプライトへのパスは以下の様に記述していました。
———————————
auto nowScene = Director::getInstance()->getRunningScene();
auto gameLayer = (GameScene*)nowScene-> getChildByTag(tagGameLayer);
auto spEnemy = (EnemyDest*)gameLayer-> getChildByTag(tagEnemy);
———————————
しかし今回は以下の様に記述します。簡単なのですがSpriteBatchNodeの存在を忘れておりgetParentを2つ利用することに中々気がつけませんでした。
———————————
auto gameLayer = this->getParent()->getParent();
auto spEnemy = (EnemyShip*)gameLayer->getChildByTag(tagEnemy);
———————————
ネットではスプライトの取得にrootから辿っているものが多いのですが何故なのだろう?
 

GooglePlayランキング

GooglePlayで「弾幕」で検索したら「弾幕の器」が2番目になっていた。
device-2015-06-07-231614
ダウンロード数は圧倒的に少ないのに何故上位に位置できるのか調べるたら、ダウンロード数だけでなく「起動率」も影響しているらしいとのこと。
→参考:Google Playの人気アプリからランキングロジックの実態に迫る!!
ちなみに「弾幕の器」のダウンロード数と所持数は以下の様な感じ。相変わらず半分以上の方がアプリを削除..。
スクリーンショット 2015-06-07 23.25.10
 
 
 

コメントを残す

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


五 × 7 =


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>