弾幕の器2の制作:もうすぐ完成

艦艇データが概ね完成

ハードモードの序盤は兵装に頼らなくても攻略することができると思います。しかし今後のことも考え色々な兵装を試してみてください。動画では「強制起動」を利用して敵艦を攻略しています。

 

仕様変更:ダイヤの獲得

当初は「残した兵装」の分だけダイヤを獲得できる仕様でしたが、この仕様では「パズルっぽく弾幕を楽しむ」ことを阻害してしまうため変更する事にしました。ダイヤは以下のルールで取得することができます。
———————————————–
艦艇1つに付きダイヤは最大で3つ獲得できます。
1個:敵艦を撃破する
1個:撃破時にノーダメージ
1個:撃破時に兵装が残っている(つまり2個は利用してもOK)
———————————————–
ポイントは兵装を2個利用してもダイヤが獲得できる点です。つまり3つのダイヤを獲得するためには「2つの兵装を利用してノーダメージでクリアする」必要があります。
 

仕様変更:兵装の効果

砲塔の回転
兵装で「砲塔を10°回転させる」ものがありましたが、10°だけだとほとんど効果がないので45°に変更しました。
 
弾幕の削除
兵装で「弾幕を削除する」ものがありました。当初はトラップ砲塔に効果無しの予定でしたが、トラップ砲塔にも効果を発揮するようにしました。ただし弾幕を削除するのではなく弾の種類を2グレード下げます(レーザー弾 → リング弾 → 大弾 → 小弾 → 消去)。
つまり大弾や小弾は消去する事ができるようにします。
 

残りの作業は

来週は「説明ページ」の作成と艦艇データの微調整をする予定です。あとiOSもAndroidもストアに動画をアップできるので、プロモーション動画を作成しようと思います。
しかしプロモーションというよりも今回の動画を加工して「兵装を上手く活用することを促す」いわば注意書きのような動画にする予定です。
 
 
 

弾幕の器2の制作:イージーモード

Easyモードの敵20機分の完成

Android版のコメントで「全然初心者向けでない!」という感じのコメントが幾つかあったのでイージーモードを作成しました。Easyモードの序盤はチュートリアル的な内容にしてメニューで説明を書くようにしています。

イージーモードでは自機の弾の一部を自動照準にしたのですが、移動速度の速い敵には返って不利になりそう。イージーモードでは高速の敵は控えるようにしようと思います。
 

マルチタップ

ハードモードにはサブウエポンは他のスマホ弾幕ゲームと同じようにタップポイントが2つ以上なのを検知して発動するようにしました。簡単に実装できると思ったのですが、躓いたのでメモ。

イベントが発生したタップのみ

マルチタップを検知するイベントはonTouchesBeganでタッチ情報はvectorで送られてきます。躓いた原因は以下の考え方で間違った方を選択したため。
————————————–
すでに指が1本タッチされている

その指を離さずに追加でもう1本指をタッチする

このときvectorで送られてくる情報は1本分?2本分?
————————————–
私はここで「すでにタッチされている指を含めた2本分の情報」が送られてくると思っていました。でないとタッチされている情報を充分に管理できないと思ったので。
しかし、それを想定してプログラムを組んだところ全く機能せず、調べたところ「新規にタップされた情報」のみ送られてくることが分かりました。

タッチ情報はgetIDで取得

だとすると「どうやって2本目のタッチなのかを調べるのか?」という疑問にぶつかりました。googleで調べるにも何をキーに検索しても良いか分からず時間を浪費してしまいました。
なので原点に戻り本家のリファレンスを調べることに。そしたら「touch」という項目に「getID」というメソッドを発見。
これをキーに検索したら日本語の情報もたくさん出てきました。参考になったのは以下のページ。→参考:Cocos2d-xのマルチタッチの開発 その1
 
私の場合は2本目のタッチを検出できればよいので以下の様にシンプルに記述できました。
—————————————
void GameScene::onTouchesBegan(const vector&touches, Event *event){
 vector::const_iterator iterator = touches.begin();
 while (iterator != touches.end()) {
  Touch* touch = (Touch*)(*iterator);
  if (touch->getID() == 0){
   touchStartPos = Director::getInstance()->convertToGL(touch->getLocationInView());
   shipStartPos = spShip->getPosition();
  }else{
   useBomb();
  }
  iterator++;
 }
}
—————————————
 

シングルタッチも

初代の弾幕の器はシングルタッチでマルチタッチを許可していません。しかし複数の指で色々操作すると誤動作します。これはマルチタッチが基本にあり、シングルタッチは最初のタッチ情報以外を捨てただけの「ちょっと無責任」な仕様になっているためです(たぶん)。ゲームの種類によってはシングルタッチでもgetIDでの管理が必要なのかもしれません。

弾幕の器2の制作:メニュー部分

Easy/Hardの2つのモード

弾幕の器2ではEasy/Hardの2つのモードに分けることにしました。
敵艦艇は弾幕の器2の2倍。つまり200機になる予定です。

——————————————————–
Easyモード
・弾幕の器をクリアできなかった方向けの難易度。弾幕ゲームの入門者用の難易度。
・サブウエポンの設定はないので弾幕の回避などに集中できる。
・自機の弾は自動照準で左右15度まで自動で狙ってくれる。
——————————————————–
Hardモード
・難易度は弾幕の器よりも「少しだけ」難しい程度。
・攻略においてサブウエポンの選択が重要。
——————————————————–
上級者の方には
Hardモードではサブウエポンを利用せずに敵を攻略するとダイヤを獲得できる。
サブウエポンは3つ搭載できるので1つの敵に対し最大で3つのダイヤが獲得できる。
獲得したダイヤの合計はトップメニューに表示され、個数に合わせた称号が表示
される。上級者の方にはダイヤの数で競って貰いたい。
ただ後半はサブウエポン前提の攻略を考えているためパーフェクト(ダイヤ300個)
は至難。なので最後の称号はダイヤ270個で獲得可能な予定。
——————————————————–
当初は各敵毎にスコアを付ける予定でしたがトップ画面だけでプレイヤーの
弾幕レベルっぷりを確認できるように仕様変更しました。
1画面でレベルをアピールできる方がSNSでキャプチャを貼り付けやすいと思うので。
 

来週以降の作業は

・サブウエポンのインターフェイスを作成。
・Easyの敵20隻のデータとHardの敵20隻のデータを作成する
・説明書ページの作成

cocos2d-x : Nend広告

弾幕の器のAndroid版の更新完了

Android5で動作確認したv4.2をアップ(日曜深夜)しました。なので月曜日の早朝にでも反映されると思います。開発者サイトでアプリユーザーの環境を確認できるのですがAndroid 5のユーザーは5%位。
スクリーンショット 2015-08-10 3.39.00
 
開発者サイトではバージョン毎のアンインストール数は集計できないようなのですが、一日当たりのアンインストール数は集計できます。以下の様に段々アンインストール数が増えているのはAndroid5対応のスマホが増えてきたからなのでしょう。
もう少し早く対応できていれば…。
スクリーンショット 2015-08-10 3.48.09
 
 
 

再びNend広告で躓く

次に困らないようにメモ。環境は以下の通り
—————————————-
cocos2d-x:ver3.6
Nend:android(ver2.5.3),cocos(ver1.1.3)
—————————————-
 

Nendをコメントアウトしてからビルド

ver3.6ではbuild_native.pyにプリコンパイルが含まれるのだが、Nendの設定をしているとプリコンパイルが通らない。なので最初にbuild_native.pyを実行する時はcppファイルからNendの設定(.hファイルのincludeとNend関数)をコメントアウトする。

build_native.pyでAndroidのファイルが完成したらeclipseに読み込む。

NendのAndroid版のマニュアルに従い設定を追加

Nendのcocos版のマニュアルに従い設定を追加

cleanしてからrunできることを確認。
しかしcppファイルのNend広告の機能をコメントアウトしているので
広告は表示されない。

xcodeでコメントアウトを解除

v3.6のbuild_native.pyではv3.2の時と異なりフォルダを削除しなくてもclassファイルの変更が反映される(ビルド時間も短い)。

eclipse上でプロジェクトをclean。runして起動することを確認する
以上
 
 

cocosコマンド

build_native.pyを実行する時に「代わりにcocosコマンド」を使えてきなことを言われた。今回の方法でも実機で問題なく機能しているので間違っていないと思うが、あとで調べてみよう。
 
 

cocos2d-x:弾幕の器のAndroid5対応

今週は新作の制作が進んでいません…。
弾幕の器がAndroid5で落ちる原因と格闘していました。
 

Android5に対応させるために格闘中

前回cocos2d-xをv3.6にアップしたが状況は改善していない。
メニューでは問題ないがゲーム画面には射る時に落ちる。

以前コメントで☆5つを付けてくれていた方が、無双モード搭載後にゲームが落ちるようになったと報告があったこと思い出す。

ゲーム開始時に敵艦のデータをstring型のvectorで渡す部分が怪しい?
int型の配列で渡す様に変更してみた。

————————————–
注文していたAndroid5の検証機が届く
————————————–

int型の配列でもゲーム画面に入る時に落ちる。

eclipseでmediaPlayerについて「should have subtitle controller..」という
エラーがでているのを確認。

cocos2d-xのv3.2まではクラッシュの基となるエラーだけどv3.3以降では
クラッシュしないようになっておりクラッシュの原因ではないようだ。
※エラーは動画の字幕(subtitle)についてでサウンドデータには無関係らしい。

しかし念のため、サウンド関連を全てコメントアウト

やはりゲーム画面に入る時に落ちる。落ちる原因はサウンド周りではない。

色々検証して落ちる敵と落ちない敵がいることに気が付く。
必ず落ちるのは雨型の五月雨。これは問題解決の糸口だ!!

五月雨のデータを他と書き換えると落ちなかった。
しかし何回か試すとたまに落ちる。

—————————————
データの読込が失敗することが落ちる原因と確信
—————————————

データの読込はgetFileDateを利用しており。これでiOSとAndroid4までは問題なし
→参考:cocos2d-xでcsvデータを読み込む

しかしAndroid5で読み込んだデータを確認すると。正常に読み込む時もあれば読み込めない時もある。データが欠落したり繰り返されたり無秩序で法則が分からない…。

「Anrdoid5ではデータが圧縮され、それによって正常に読み込めない」的なことを書いているサイトを発見(メモし忘れる)。そのサイトには対応策は記述されていなかった。

他の方法で読み込むことを考える。v3.4で新たにテキストの読込に特化したメソッドが追加されているのを発見。→:cocos2d-x公式「getStringFromFile

これを利用したら落ちなくなった!
たぶん、これで解決。

現在色々チェック中。
問題が無ければ来週早々にAndroid5対応版をリリース
 
 

audioEngine

クラッシュの原因がサウンドと疑っていた時に発見した新しい機能。v3.4から追加されたaudioEngineでは高度な音源の操作ができるようです。
→参考;cocos2d-x公式「AudioEngine Class
→参考:AudioEngineを利用した管理クラスの作成
 
 

iOS

iOSでも音楽関連でメモ。iOS7以降ではアプリを起動するとiTunesなどの音楽は停止してしまう。これを解除するにはinfo.plistを編集する必要がある。
→参考:BGMと効果音を鳴らしつつ音楽を再生する方法
 
 
 

弾幕の器2:サブウエポンの完成

サブウエポンは6種類

ゲームで採用するサブウエポンは6種類に決定し、それらの導入が完了しました。
———————-
【クリアウェーブ】半径250px内の弾幕の削除
【ゴーストデコイ】自機ねらい弾の誘導
【次元ジャンプ】一定時間の無敵(但しジャンプ中は攻撃できない)
【強制起動】起動前の砲塔を不完全な状態で起動させる
【砲塔回転】10度だけ砲塔の向きを変更する(時計回り/反時計回りの2種)
【砲塔転移】砲塔を隣接次元に沈める。無力化する反面、当たり判定が無くなる。
———————-
純粋に砲塔にダメージを与えるサブウエポンは「無双モード」でのみ採用する予定です。ボス戦のみのゲームなので「ボムのごり押し」は避けたいのです。
あとは地味なメニュー作成なので動画投稿は当分しないと思います。
 

砲塔回転

砲塔を10度しか回転しないが効果時間は永遠で起動前でも有効。ただし自機ねらい弾には効果が無く、トラップ砲塔にも効かない。

砲塔転移

全種類の砲塔を無力化できるが、こちらの攻撃もスルーする。効果時間は10秒と長め。

弾幕の器2:強制起動

強制起動

砲塔を強制起動するサブウエポンが完成しました。詳細は動画の説明に書いてあります。

スコアは多分やめます、その代わり…

「弾幕の器」の続編予告では上級者向けにスコアを導入すると書きましたが、多分変更すると思います。サーバー系の学習が全く進んでいない(モチベーションも上がらない)ので..。その代わり「イージーモード」と「ハードモード」を追加する予定です。敵の種類はあわせて200種類になる予定です。
————————————————-
●イージーモード
初代「弾幕の器」で中盤以降進めなかった方でもクリアできるくらいに難易度を落とす。「潮凪」や「村雨」のように途中で他よりも難易度の高い艦艇は出さないようにする。サブウエポンは採用せず戦闘に集中できるようにする。
————————————————-
●ハードモード
「弾幕の器」をクリアした方向けの難易度。サブウエポンを正しく利用すると難易度が下がるが、最終的な難易度は弾幕の器よりも少しだけ難しい程度。弾よけのテクニックを競うのではなく、サブウエポンを含めた攻略方を探すことにゲームの主題をおきたい。
————————————————-
●上級者向けには
ハードモードでサブウエポンを利用しないで艦艇を攻略すると「ダイヤ」が手に入る。上級者の方には「ダイヤ」の数を競って欲しい。
ハードモードの後半はサブウエポンの利用が前提で攻略方を設計する予定なので難易度はかなり高くなると思う。
————————————————-
7月中にサブウエポンをすべて完成させるスケジュールだったのに間に合わなかった…。残りのサブウエポンは2種類です。