弾幕の器

八洲の攻略

今週は差し込み仕事があって続編の開発が進んでいないため、攻略動画をアップしました。ちなみに国型の戦艦名は全て日本の旧名が基になっています。

 

iOSのアンケート

iOSのバージョンアップ説明の部分で次々回作のアンケートをしました。A案は東方クローンです。iOSには東方クローンの弾幕ゲームがないので需要を確認したかったのです。
——————–
A案:上級者向けの弾幕ゲーム
・自機は特性の異なる複数の機体から選択
・敵に砲塔はなくダメージによって攻撃が変化
・今回追加した「神型空母」のレベルが最弱の敵レベル
——————–
B案:弾幕の育成ゲーム
・敵を倒すとコインを得られ、それで自機をパワーアップ。
・パワーアップは弾幕の強化やシールド追加など色々。
・今回追加した無双モードの発展系のような感じ。
——————–
現在コメントが9件あるのですが、A案とB案が交互に推され思った以上に均衡しています。両方とも支持があるようなので、両方とも作成しようと思います。
 

Appleの週末対応

iOSは5月中のリリースを諦めていたのですが、土日も対応して貰えました。
金曜日の質問で「アプリ内購入で広告外せる?」と質問されたのですが、「アプリ内購入なんて使ってないよ」と説明足らずの返信をしたら、土曜日に以下の様な質問が届いた。なので「広告は外せないよ」と返信し、審査が通りました。
スクリーンショット 2015-05-30 13.08.49
無料アプリで広告にiAdを利用しないと、Appleはアプリから収入を得られないのですよね。そういう構造をAppleは問題視しているのかな?
 
 
 

弾幕の器:先にAndroidをリリース

まだAppleの審査は足止め中

昨日Appleの審査チームに返信しましたが、未だに返信がありません。今日が金曜日なので5月中のリリースは無理になってしまいました…。
スクリーンショット 2015-05-29 15.46.08
 

先にAndroid版をリリース

今回はiOS版とAndroid版のリリース日を揃えようと思ったのですが、待ちきれないのでAndroid版は本日リリース申請をしました。Android版は機械的なチェックしかないので日付が変わる前にはリリースされると思います。
 
 

弾幕の器:Appleの審査で足止め

メタデータで却下

Appleの審査のメールって毎回AM8:00なのだけど固定なのかな。今回は以下の様なメールが来て審査が足止め(クリックで拡大)。
スクリーンショット 2015-05-28 11.57.52
とりあえずメールの通り、広告を表示している時のスクリーンショットを送った。早ければ明日のAM8:00にリリースされると思います。
 

Appleの審査方針が少し変更?

これは簡単なテストプレイでは広告の所在を確認できない時に送付されるもので、過去にも「脳トレ15パズル」で経験しました。なので審査の補足に「広告はステージ2以降から表示します」と記していたのですが、今回は効果ありませんでした。
 
最近Appleはウォール広告やアイコン広告を(再び)リジェクトするようにしてきているため、どの様な広告が表示されるか確認する必要があったのかもしれません。
→参考:Appleがウォール広告やアイコン広告をリジェクトし始める
 
 
 

弾幕の器2:移動ルーチン

1週間以上前にAppleに申請したけれど、まだ審査されていません…。噂ではAppleWatchのアプリラッシュで時間がかかっているみたいです。もうしばらくお待ちください。

ボツにするか否か

前作とは異なったルーチンで敵艦を移動させようと模索中。今回の案では切り替わる目的地(x印)に向かって加速移動するようにしました。宇宙空間では正しい挙動だと思うのです。しかし動画の通り色々パラメータを設定しても思うようになりません…。

動画ではxは3地点をループしているだけですが複雑にする事も可能で、左右に3往復したら前に突進なんていうこともできて良さそうなのですが…。
 
そして決定的なデメリットとしてカオス(カオス理論)なのです。このルーチンは誤差が誤差を生み環境によっては全く別の動きになってしまう可能性があるのです。スマホの場合の誤差の原因はfpsです。通常は60をキープしようとするのですが、厳密にキープすることはできません。このfpsの揺らぎが誤差となってしまい、再生する環境で動きが全く異なってしまう可能性が高いのです。
やはりボツかな…。前回と同じサイクロイドでいこうかな…。
 
 

前作の移動ルーチンは疑似サイクロイド

弾幕の器で敵艦の移動ルーチンには2つの円の座標を合算した疑似サイクロイドを利用しています。本当のサイクロイドは→参考:youtube「サイクロイド曲線アニメ」
この曲線は各園の回転速度や半径を調整することで色々な軌跡を描くことができます。
→参考:wikipedia「アステロイド」
サイクロイドについてググると難しい公式が出てきますが擬似的なサイクロイドは以下の様にシンプル。
———————————–
//—enemy move
void EnemyDest::enemyMove(float delta){
 myDeg01+=myDegSpeed01;
 if (myDeg01>360)myDeg01 -= 360;
 float myRad01 = CC_DEGREES_TO_RADIANS(myDeg01);
 float center_X = myRadius01_x * cos(myRad01)+320;
 float center_y = (myRadius01_y * sin(myRad01))+stageTop+stageIn_y;

 myDeg02-=myDegSpeed02;
 if (myDeg02<360)myDeg02 += 360;  float myRad02 = CC_DEGREES_TO_RADIANS(myDeg02);  float pos_X = myRadius02_x * cos(myRad02)+center_X;  float pos_y = (myRadius02_y * sin(myRad02))+center_y;  this->setPosition((int)pos_X,(int)pos_y);
}
———————————–
この疑似サイクロイドはシンプルに記述できて、指定した範囲内に納めることが簡単なので便利なのですが、パラメータを変更しても特徴が出しにくいのです。なので今回の模索に繋がったのです。
弾幕ゲームは弾幕に気合いを入れるべきで、敵の移動を複雑にしすぎるのも良くないから、やはり移動ルーチンは変更無しでいきますか。
 
 
 

cocos2d-x:絶対パスと初期設定のタイミング

自分用のメモ

今回は絶対パスは使わない

これまでシューティングゲームを作成したことがなかったので、弾幕の器の作成にあたってはたくさんググって開発を進めていきました。
ググった情報では、ゲームの要素にアクセスする場合にシーンから辿る絶対パス的な方法を紹介しているページが多かったのです。
Flashで開発している時はムービークリップを基準とした相対パスでアクセスしていたので違和感を感じたのですが、Cocos2d-xでは定番なのだろうとそれに従いました。

注)cocos2d-xでシーンを取得するメソッド「getRunningScene」を単独で検索する記事を読むと、ゲームとは関係ない記事が多く出るためゲーム作成の定番ではないのでしょうね…。
→参考:google検索「getRunningScene」
 

シーン切替時の問題

シーンを取得するgetRunningSceneはNullを返してエラーになることが良くあります。私が遭遇したのはシーン切替のトランジション処理の時でした。トランジション時にはシーンが2つ存在するのですが、getRunningSceneは1つのシーンしか返さないため、片方のシーンでgetRunningSceneするとnullが返り、ゲーム内の要素にアクセスできずエラーになるのです。
弾幕の器でゲーム画面に入る時にトランジションを利用していないのはこれが原因のためです。→参考:google検索「getRunningScene null

なので続編は相対パス

弾幕の器がクラッシュするタイミングはゲームを開始するタイミングなので、なんとなく絶対パスがらみの気がするのですよね。私の環境でのクラッシュする割合が低いのでデバッガで確認できたことはないのですが…。
ということで続編では相対パスを利用して作成する事にしたのですが、ゲーム内の要素(今回の場合は親要素に)にアクセスできず暫く悩むことに。
 

表示してからでないと使えません

シーンから辿る絶対パスではオブジェクトが表示(addChild)されていようが、いまいが有効です。しかし相対パスの場合は要素が表示(addChild)されていなければ親子関係が生じないため利用できません。
よく考えるとあたりまえなのですが、Flashのムービークリップでは表示が前提のため、このような配慮をせずに開発できるため気がつけませんでした…。
 
ということで以下の様なソースを書くことになりました。敵艦を表示した後で初期設定用のメソッドdispInitを実行するようにしています。
—————————————————-
auto enemyShip = EnemyShip::createWithParam(class_id,cate_id,ship_id);
this->addChild(enemyShip);//———表示
enemyShip->dispInit();//———–表示した後に初期化
—————————————————-
まだ開発初期なのでdispInitでは親要素が取得できるか確認しているだけです。
—————————————————-
auto gameLayer = (Layer*)this->getParent();
gameLayer->addChild(testMarker);
—————————————————-
これできちんと親の階層(ゲームレイヤー)を取得できました。これをcocos2dのデフォルトの初期化メソッド(init)内で実行するとエラーになります(配置される前なので親要素は存在)。
 
ということで忘れないように記事にしてメモ。
 
 
 
 

タイトル設定の注意

ちょっと別口なのですが、これも悩んだのでメモ。
タイトルの設定ができなくて2時間も悩んだ。流れは以下のサイトが詳しい。
→参考:cocos2dでBundle display nameを日本語にする
→参考:アイコンに表示される名前を設定する
名前が反映されない理由はファイル名の「InfoPlist」の最初のiが小文字だったため…。意外と気が付かない間違いなのでしっかりと記憶しておこう!

cocos2d-x:ver3.6でNend広告

自分用のメモ

xcodeの後でAndroid

xcodeでのNend広告は説明書通りでOK。Androidは結構説明不足なのでメモ。弾幕の器の設定を部分的にコピーする方法にするようにする。
——————————————————
・xcodeであらかじめエラーが出ないことを確認
・classフォルダにNendのcppファイル(3種)を入れておく
・jni内にあるAndroid.mkでclassフォルダ内のファイルをすべて含めるように変更。
・そしたらbuild_native.pyを実行
・作成されたlibsフォルダにnendSDK-2.5.3.jarを入れる
・eclipseに読み込む
・libcocos2dx(3.6)とGoogle Play serviceをリンクする。
・AndroidManifest.xml(rootとbin)でGoogle Play serviceを設定
・srcフォルダにnet.nend.NendModuleを入れる
・AppActivityにソースを追加
——————————————————
上記の手順で実機で再生可能。
さて、いよいよ弾幕ゲームの次回作の作成に入りますか!
 
 
 

cocos2d-x:ver3.6でAndroid

Androidでも警告

デフォルトで作成されるプロジェクトをAndroidでビルドした。ビルドには成功するものの以下の様な警告が。NDKのバージョンが古いからAndroid5.0でクラッシュするかもよ!と言うことらしい。
スクリーンショット 2015-05-20 19.58.32
ver3.2の時は逆に最新のNDK(r10c)を利用すると正常にビルドできないからAndroid環境も3.2と3.6は共存できないことになる。
すでに弾幕の器のAndroid最終版はcocos2d-xを3.6にする前にapkを作成したので問題ないのだけど、もし弾幕の器のAndroid版を修正して再アップするとなると.bash_profileを全面的に修正しなくてはならない…。思ったよりも面倒なことになった。とはいえ、どこかのタイミングでcocos2d-xもバージョンアップが必要なのだから仕方がないか…。
 

NDKを更新

ということで最新のndkをダウンロードしたのですが解凍できない。調べたら以下のページに辿り着く。以前はもっと簡単に解答できたような気もする。
→参考:Android NDK r10d インストール(for Mac)
ということで.bash_profileを編集してNDKを新しいものに変更したら以下の様にOKだった。.bash_profileを変更したらsourceコマンドを実行して設定を反映させることを忘れずに!
スクリーンショット 2015-05-20 21.50.53
 

eclipseに読み込む

eclipseに読み込む方法は3.2と同じですが、リンクさせるlibcocos2dxは3.6にしなければなりません。読み込む時に名前を変えて以下の様に2種類のlibcocos2dxを同居させることができました。ビルドしたらきちんとアプリが起動したので多分これでOK。明日はNend広告を組み込んでみよう。
スクリーンショット 2015-05-21 1.12.50
 

Android5.0で起動しない(追記:5/23)

Android版の弾幕の器の海外からのコメントで「起動できない」というコメントが付いた。これで上記のNDKの件で5.0でクラッシュするというメッセージが思い浮かび、ググってみると…。cocos2d-xの3.2はAndroid5.0には対応していない(クラッシュする)ことが確認できました。→参考:google検索「cocos2d-x android 5.0
 
リンク先には色々対応方法が記されていますが、個々に対応するのではなくプロジェクト自体を3.6に移行した方が良さそうです。今は気分ではないので、想定される手順をメモするのに留めます。
———————————-
・3.6で新規にプロジェクトを作成(bundleIDを揃える)。
・3.2のデータをコピーして3.6に組み込んでいく
・作成したapkは電子著名が必要(3.2のが使えるのかな?)
 →参考:Google Play Developer への登録
———————————-
とりあえず月末にリリースするバージョンでは「Android5.0には対応していません」と記述を追加しよう。
 

cocos2d-xを3.6にverUpしたけれど

警告だらけ

いつの間にかcocos2d-xのバージョンが3.6まで進んでいるので3.6をインストールした。cocos2d-xはユーザー階層の設定(.bash_profile)を変更してしまうため複数バージョンの共用はできないのですがチャレンジしてしまいました。
結果、デフォルトで作成されるテストファイルを実行すると以下の様に警告が44もでる…。
スクリーンショット 2015-05-19 20.49.52
 

警告の原因

しかし振り替えるとv3.2の時にもたくさん警告がでた気がする。ですが「設定変更した方が良いよ」的なアドバイスが出て「よしなに」的なボタンをクリックすると警告が出なくなったような気がする。3.6で作成したプロジェクトではそのアドバイス的なのが出ない…。
警告が出るのは「libcocos2d ios」なので、このBuildSettingを3.2と3.6とで比較しても違いはない…photoShopの「差分の絶対値」で重ねて厳密に比較するとアイコンとフォントのボールド/ノーマルの違いが確認できるのですが、これは本質ではない(とおもう)。
 
上は3.6で下が3.2の設定(一部)で、ライブラリ名(アイコンも)が異なるのとフォントが太字なのが異なるだけで本質的な設定は同じ…。
スクリーンショット 2015-05-19 21.53.31
スクリーンショット 2015-05-19 21.53.46
 

でも3.6を使います

3.2に戻すことも考えて迷ったのですが3.6で行くことにしました。とりあえず警告の中で一番多かった「ローカル変数とはいえ、ここで同じ名前は良くないよ」的な警告を表示しないようにしました。「Hidden Local Variable」をNoの設定にしたら、
スクリーンショット 2015-05-19 22.01.16
以下の様に警告数は17に減りました。
スクリーンショット 2015-05-19 22.01.23
とりあえず、これでいこうと思います。
 

挫けた時は

しかし挫けて3.2に戻したくなった時のメモ。
setup.pyはユーザーフォルダ直下にある不可視ファイル「.bash_profile」の設定を変更する。3.6に変更した現在は以下の様な状態。
スクリーンショット 2015-05-20 2.27.10
3.2に戻す場合はパスが3.6になっている部分を3.2に戻せばよいと思う。
ファイルの編集にはvimが一般的なようだけれど。miの「不可視ファイルを開く」からでも行けると思う。
 

追記:やっぱり警告が邪魔

警告はやはり邪魔なので消す方法をしらべた。バージョンを限定せずに検索したら以下のサイトが見つかりました(cocosのバージョンは3.4)。
→参考:xcode で cocos2dx のアプリ開発する導入
 
この設定にしておけば、cocos2dの警告だけ無視して自分の書いたコードの警告は表示されるということですよね?ちなみに3.2のプロジェクトを確認するとこの設定はしていないのに警告はでない。3.2はどこで設定していたのだろう?
 
 
 

弾幕の器:最終verの申請完了

Appleに申請完了

最近はAppleWatchのアプリ申請ラッシュで審査まで結構時間がかかるらしい。でも5月末までにはリリースされると思います。今回はiOSの申請が通ってからAndroidのリリースをします。
ver4
 

無双モードの追加

最後のメニューは連続して戦えるモードにしようと思ったのですが、実際に作成すると全く面白くなかったのでやめました。何回も挑戦してやっと攻略できたような敵がランダムで登場しても全く勝つことができません(初見殺しな艦艇も多いですし…)。ということで少し内容を変更して強力な武器を搭載して敵艦を圧倒する無双モードに変更しました。

自機には5機の支援機が追加され(代わりに3wayは無し)画面の上下左右をループ移動できます。さらにバリアのおかげで4回までの被弾に耐えます。
動画にもあるように適当に対戦しても楽に勝利することができます(10連戦の場合は大変ですが…)。
 

動画広告

弾幕ゲームのようにプレイ時間の短いゲームはインターステイシャル広告がベストだと思うのですが、RPGのようなゲームには向きません。まだRPGのようなアプリを作る予定はないのですが、動画広告を見るとゲーム内コインをゲットできるような仕組みがよいと考えています。ということで動画広告のメモ。
→参考:動画広告「AdColony
 

電通のスマホ関連コラム

昨年から電通でスマホ関連のコラムがあるのでメモ。
→参考:電通スマプラ

脱出系も作ってみたい

とうとう100機!

最後の空母級「神型」のデータが完成しました。最初は神型のクラスは「私がクリアできない」レベルの難易度にしようと考えていたのですが、結局私でもクリアできる難易度になっています。

 

攻略動画の追加

googleで「弾幕の器」を検索したら、Lineの質問で「村雨が攻略できない」という記事があったので駆逐艦「村雨」の攻略動画をアップしました。
→参考:youtube「村雨の攻略」
 

スマホゲームの感想

前回の記事で紹介した「5年後の世界で彼女の笑顔を思い出す」をクリアしました。ハッピーエンドの方に辿り着いたのですが少しモヤモヤします。もし自分のせいで誰かを5年間も昏睡状態にさせてしまったとして、5年ぶりの再会でああいう態度をとるのか?
でも、これ系のゲームって技術的な敷居が低いから、今後は良いシナリオのコンテンツが多く出てきそうな気もします。
 

細切れのゲームがあっているみたい

この記事を読んでDoorsを遊んでみました。以前挑戦したcubic roomが1つの脱出だったのに対しDoorsは100のシンプルな脱出があります。両方面白いのですが、自分には細かく区切られたDoorsの方があっているかもしれません。
 
Doorsの記事には具体的な収益は書いてないのですが、DL数と1DLあたりの収益が記載されているので大まかな収益が計算できるのですがビックリ。
—————————————————
・Doors:DL数:23,700,000 x 5円 = 約1億2千万円
・上記以外のDoors以外のシリーズ累計:7,730.000 x 5円 = 約4千万円
—————————————————
前回の記事で「放置系を作ってみたい」といいましたが、脱出系も作ってみたくなりました。