2012年5月6日日曜日

Contents rating変更

昨夜リリースしたNO・KO・GI Rider(体験版)について、Googleから
「コンテンツレーティングがポリシー違反だから変更したぞ!!」
という感じで怒られました。

コンソールで確認したところ、コンテンツレーティングが「全対象」から「低」に変更されていました。
そして、「全対象」は無効化された状態(選択不可)になってました。

要因は、暴力に関するレーティングポリシーに反している為とのこと。
REASON FOR CONTENT LEVEL CHANGE: Violation of the Google Play content rating policy

以下、暴力に関するレーティングポリシーより抜粋。

刺激の少ないアニメーションや架空の暴力描写を含むアプリケーションは、「ユーザー成熟度 - 低」かそれ以上にレーティングする必要があります。リアルな暴力描写や刺激の強い架空の暴力描写を含むアプリケーションは「ユーザー成熟度 - 中」か「ユーザー成熟度 - 高」、生々しい暴力描写を含むアプリケーションは「ユーザー成熟度 - 高」にレーティングする必要があります。不必要にリアルな暴力描写は Google Play では禁止されています。



Invader Block 2のレーティングは「全対象」で文句を言われてませんが、念のため、引き上げておく方が無難かな?と思い、「低」に引き上げておきました。一応、エイリィアン相手でも架空の暴力描写には違いない・・・というより、ゲームは、全般的にレーティング「低」以上を設定する必要があるのかも。繰り返しこの警告を受け続けるデベロッパアカウントは停止されるとの事なので、気を付けた方が良さそうです。
VGS Chiptune Musicとかは、大丈夫だと思いますが。

しかし、昨日アップして今日早々に怒られたということは、結構DL数が伸びているのかな?
Googleが独自にチェックしている可能性も無くは無いでしょうけど、第三者からの報告の方が可能性が高そうな気がするので。DL数は1日経たないと分からないので、まだ不明。

追記:警告メールに「GooglePlayチームによる定期的なレビューにより」と書かれていたので、Google自身によるチェックなのかも。Googleからのメールは全般的に英語で来るから、結構ドキドキします。(英語だとなんて書いてあるかは分かり難いけど、怒っているかどうかは分かります)

NO・KO・GI Rider - Information (15-Mar, 2013)

SHOT04 - NOKOGI Riderは、シンプルな縦スクロール弾幕STGです。

(スクリーンショット)
90年代アーケード風のグラフィックと波形メモリ音源(VGS)による厚みのあるBGMが特徴です。
ゲームそのものはレトロ・テイストですが、操作性については、スマートフォンのタッチパネルでプレイすることを前提にデザインしました。
たとえば、アーケードから移植したゲームのように、操作し難いソフトウェア・ボタンによる操作は一切不要です。
片手で快適にプレイすることができます。

■入手方法
NOKOGI Riderには、Android版とWindows版があります。
また、有償の製品版と、無償のライト版があります。

①Android版
https://play.google.com/store/apps/developer?id=SUZUKI+PLAN 

②Windows版
http://www.melonbooks.com/index.php?main_page=product_info&products_id=IT0000157766

③iPhone/iPodTouch版
Coming soon!

機能差異を解除したい場合、製品版の購入をご検討ください。
なお、本アプリケーションには、アプリ内課金などはありません。
完全な落としきり型の販売となります。

■サポート端末/OS 
  • Android 2.3.x
  • Android 3.x
  • Android 4.x
  • Windows XP + DirectX9
  • Windows Vista + DirectX9
  • Windows 7 + DirectX9
  • Windows 8 + Direct2D (デスクトップアプリケーション)
  • iPhone 4
  • iPhone 4S
  • iPhone 5
  • iPodTouch (第4世代)
  • iPodTouch (第5世代)
■基本的な遊び方
ショットと敵弾を消すことができるレーザーを駆使して、クリアを目指してください。
全部で5ステージあります。
Lite版は1ステージのみです。

■■■操作方法■■■

(Android版)
・画面をタッチすると、ショットを打ちながら、その地点を目指して自機が移動します。
・画面から指を離すと、レーザーメーターをチャージします。
※画面を2点マルチタッチした状態は、画面から指を離した状態と判断します。
・レーザーメーターが満タンの状態で画面をタッチすると、レーザーを発射します。
・戻るボタンを押すか、画面を3点マルチタッチすると、ポーズします。
・ホームボタンを押すと、ポーズ状態にしてからホーム画面に戻ります。

(Windows版)
・タッチ=左クリック
・ポーズ=右クリック


(iPhone/iPodTouch版)
・画面をタッチすると、ショットを打ちながら、その地点を目指して自機が移動します。
・画面から指を離すと、レーザーメーターをチャージします。
※画面を2点マルチタッチした状態は、画面から指を離した状態と判断します。
・レーザーメーターが満タンの状態で画面をタッチすると、レーザーを発射します。
・画面を3点マルチタッチすると、ポーズします。
・ホームボタンを押すと、アプリを終了してからホーム画面に戻ります。


(カスタマイズ)
デフォルトの状態では、タッチした地点(Android/iPhone/iPodTouch版の場合、タッチ地点よりも少し上の地点)をターゲットの中心とする [POINT] という方式で操作します。これにより、タブレットなど、画面が大きな端末でプレイされる方でも、スマートフォンと同様の操作性で操作することができます。
CONFIGURATIONのINPUTで、縦方向(VERTICAL)、横方向(HORIZONTAL)それぞれを個別に [SLIDE](スライド)という方式に変更することもできます。[SLIDE]方式に変更した場合、画面をスライドした量だけ、ターゲットを移動します。
なお、「縦方向だけ[SLIDE]で、横方向だけ[POINT]」といった設定をすることも可能です。
ご使用される端末でもっとも操作し易い設定にして、お楽しみください。
※Lite版の場合、カスタマイズした設定内容はEXITするとクリアされます

■■■アイテム■■■
(1)メダル
・空中の敵を倒すとメダルが出てきます
・メダルは自機が近づけば吸い寄せられます
・レーザー中は、自機が近づかなくても吸い寄せられます
・吸い寄せられる条件は、レーザー以外にも色々あります
・レーザー中にメダルを取ると、レーザーメーターが少し回復します
・メダルはSHOT値(後述)が大きい時に取ると高得点になります
・メダルの累計値は、ミスをするとゼロになります

(2)スター
・地上の敵を倒すとスターがでてきます。
・ショットを打ちながらスターを取ると「+1」と表示されます
・停止中かレーザーを打ちながらスターを取ると「Energy」と表示されます
・「+1」をたくさん取れば、短時間でSHOT値(後述)を増加できます
・「Energy」を取れば、レーザーメーターが満タンになります
・「+1」の累計値はミスをすると半分になります

(3)星くず
・敵弾を消すか、敵弾をカスると星くずがでてきます
・星くずは勝手に自機に吸い寄せられます
・星くずを取るとスコアが少しだけアップしたりします
・星くずの累計値はステージ毎にリセットされます

(4)1up
・特定の敵を倒すと1upがでてきます
・1upを取ると、エクステンドします

なお、このゲームには、パワーアップという概念がありません。
初期状態が最強の状態です。

■■■自機■■■
3種類の自機が用意されています。
・TYPE A: もっとも平均的な性能の機体(中級者向け)
・TYPE B: 高速&低範囲の攻撃を得意とする機体(上級者向け)
・TYPE C: 低速&広範囲の攻撃を得意とする機体(初級者向け)

■■■難易度■■■
3種類の難易度が用意されています・
・BEGINNER: もっとも簡単なモードです
・SOLDIER: 普通のゲーマーが楽しめる程度
・NINJA: シューター向け
どんなに腕に覚えのあるシューターでも、まずはBEGINNERでクリアするところから始めることをオススメします。

■■■エクステンド■■■
スコアが一定量に達すると最大6回エクステンドします。
・1回目: 1,000,000点
・2回目: 3,000,000点
・3回目: 6,000,000点
・4回目: 10,000,000点
・5回目: 20,000,000点
・6回目: 30,000,000点
なお、残機が8機の状態でエクステンドすると、何も起きません。

■■■SHOT値■■■
敵弾への打ち込みなどをすると、SHOT値が増加します。
SHOT値は画面左上に表示されます。最大値は99,999です。
SHOT値が10,000以上になると、加点スコアが2倍になります。
一定時間、SHOT値の増加が無いと、物凄い勢いで減ります。
SHOT値が減るまでの時間は、難易度が難しいほど遅くなります。
つまり、BEGINNERよりもNINJAの方が、SHOT値を減らさずに繋ぎ易くなります。

■■■リプレイ■■■ ※製品版限定
ゲームオーバー後にタイトル画面で「SAVE REPLAY」を選択すると、直前のプレイのリプレイを最大8つ保存することができます。
保存したリプレイは、「LOAD REPLAY」で再生することができます。

■■■プラクティス■■■
1度でも到達したことのあるステージは、プラクティスモードで練習することができます。
プラクティスモードでは、獲得した最大スコアと、最大スコアを獲得した時のリプレイが自動的に保存されます。
なお、プラクティスモードの場合、開始時の残機数が8機になります。
リプレイの保存と2面以降のプラクティスは製品版限定です。

■■■プレイ・データ■■■
タイトル画面で「PLAY DATA」を選択すると、プレイの記録を確認することができます。
プレイの記録とは、スコア・ランキングや各ステージのプレイ回数、プレイ時間などです。
プレイ・データの保存は製品版限定です。
Lite版は、一度EXITすると全てのデータが初期化されます。

■■■音楽室■■■
タイトル画面で「CONFIGURATION」から「MUSIC ROOM」を選択すると、NOKOGI Riderで使われている全ての音楽(全10曲)を聴くことができます。
Lite版の場合、聴けるBGMはSTAGE1、STAGE2、BOSS1、CLEARのみです。

■■■ヒント■■■
このゲームの攻略の鍵は、レーザーの打ち所を抑えることです。
レーザーを駆使すれば、比較的簡単にクリアできると思います。
まずは、レーザーを打ちまくってクリアを目指してください。
しかし、レーザーを使うとSHOT値の維持が難しいため、スコアが低くなってしまいます。
なので、レーザーを駆使してクリアできるようになったら、今度は「如何にレーザーを打たずに攻略するか」を探ってみてください。
あと、通常のショットは、敵の至近距離で打ち込んだ方が、得点が高くなったりします。

■■■対応機種(Android版)■■■
Android2.3以降に対応しています。Android2.2以前では動作できません。
ただし、Android2.3以降だったとしても、正常に動作できない端末も存在します。
以下に、SUZUKI PLANが実施した、Android端末(実機)での動作確認結果を開示します。

Lenovo IdeaPad A1 (Android2.3) → 以下の注意点があります
 (1) フレーム数が62.5fpsで安定します。(若干難易度が難しくなります)
Sony Walkman NW-Z1000 series (Android2.3) → 以下の注意点があります
 (1) フレーム数が55fpsで安定します。(若干難易度が落ちてしまいます)
 (2) パソコンにUSBケーブルを接続中と切断中で、データ保存先が異なります
  - 接続中: 内部ストレージ(SDカード)にデータを保存します
  - 切断中: アプリケーションデータ領域にデータを保存します
Sony Walkman NW-F800 series (Android4.0) → NW-Z1000と同等の動作をします 
Motorola RAZR (Android2.3) → 正常に動作します
Motorola RAZR (Android4.0) → 端末またはOSの不具合によりフレーム数が安定しません
Sony Ericsson Xperia ray SO-03C (Android2.3) → 以下の注意点があります
 (1) フレーム数が63fpsで安定します。(若干難易度が難しくなります)

※2012年12月1日現在の情報です.

■■■アップデート・プラン■■■
アップデートに関する方針は、基本的に次の通りです。
①重大な不具合があった場合、可能な限り即座にアップデートを実施します。
②軽微な不具合については、頻繁なアップデートは行いません。
③エンハンスは、データの互換性に影響しない範囲で実施します。
※例えば、敵のアルゴリズムを変更したり、弾の速度を調整するなどの変更は基本的にやりません。

【Version 1.09】(予定)
(1)対応機種にiPhone/iPod touchを追加
(2)5面で異常終了する恐れがある問題を対策(製品版限定)

【Version 1.08】(Android/Lite版限定)
(1)デモ画面中にSUZUKI PLANのアプリ一覧へのリンクを追加
(2)クリア後の購入促進メッセージの内容を変更
(3)クリア後の画面に製品版へのリンクを追加

【Version 1.07】(Windows版限定)
(1)Windows 8の正式サポート

【Version 1.06】 (15-Sept, 2012)
(1) 非フルスクリーンモード時にタッチ位置がズレることがある問題の対策
(2) リプレイ再生したときのスコアがプレイ時と異なる場合がある問題の対策(製品版限定)
(3) Lite版の「PLAY DATA」にプレイしたスコアがランキングされない問題の対策(Lite版限定)
(4) デフォルト設定を非フルスクリーンに変更

【Version 1.05】 (7-Sept, 2012)
(1) 非フルスクリーンモードへの対応 (Android版限定)
(2) エクステンドした時に効果音が鳴らない問題の対策 (Adnroid/Lite版限定)
(3) リプレイを再生時に、ステージ5クリア後はタッチしてからリセットするようにする (製品版限定)
(4) ENDINGのBGMのベース音がデカイ問題の対策 (製品版限定)
※Android版のみリリースしました。(Version 1.05のWindows版のリリース予定はありません)

【補足事項】
GooglePlayのコメント欄や、eメールでご連絡いただければ、可能な限り対応します。ライト版・製品版のどちらでも、気になる点がありましたら、ご連絡ください。ただし、方針③に影響する案件については、申し訳ありませんが、対応できない可能性が高いです。申し訳ありません。
あと、万が一、Android版で強制クローズする問題が発生した場合、発生した時にレポートを送信していただけると、早期に問題解決ができる可能性が高くなるので、とても助かります。(※ただし、レポート送信は、Javaの例外で落ちたときしかできないようです。SUZUKI PLANのゲームは全般的に、Javaを殆ど使っていない(99.8%ぐらいの割合でCです)ので、仮に落ちる事象が発生する場合、レポートできないかもしれません。そういう時は、GooglePlayのコメント欄やメールで「xxxをやっている時に落ちた」とご連絡ください。「xxxをやっている時に」(発生条件)が重要です。この部分が具体的であるほど、問題が対策される可能性が高くなります)

2012年5月5日土曜日

NO・KO・GI Rider(体験版)完成

開発中のSTG「SHOT04 - NO・KO・GI Rider」の体験版がほぼ完成しました。
タイトルは正式に「NO・KO・GI Rider」にしてしまいました。

このタイトルから、「バトライダーのパクリゲーか?」と期待されるマニアな方のために補足すると、バトライダー的な要素は全くありません。ただし、1面のボスが戦車で、バック走行しながら戦い、オプション破壊するとワッショイな辺りは、インスパイアされていると言えなくもないかもしれませんが。(このタイトルの正式な由来は、以前ブログで書いたような気がするので、詳細は過去ログ参照です)

現在、リリースに向けた最終テスト中です。
完了次第、Google Playで配布開始します。
何とか、目標通り、GW中に体験版をリリースできそうです。
GWなど無かった・・・。

一応、タイトルに「SHOT04」と冠を付けておきました。
前作(SHOT03)との関連性は皆無&SHOTxxシリーズの知名度もほぼ無いのですが、念のため。
SHOT02は、VectorでPickupされたり、雑誌に載ったりしたお陰で、若干沢山出回ったので、もしかすると覚えていてくれる人が居ないとも限らないですし。(ちなみに「沢山」といってもVectorでのDL数は精々2,000本程度)

製品版の完成は・・・2012年中が目標です。
とりあえず、今年は夏休みが長い(というより2回ある)ので、夏が勝負。
できれば、夏頃に完成させたいところ。


追記:
いま、アップロードする作業が終わりました。
明日の昼頃には、GooglePlayで「suzukiplan」で検索すれば見つかると思いますので、是非。


なんとかGW中に間に合った・・・と、思ったら明日(時刻的には今日)も休みか。
明日はジックリとiPod touchの怒首領蜂を堪能します。
ちなみに、(Android版は対応していなくて買えなかった)大復活も買ってみました。
大復活が出た当時、ゲーセンに行ってなかった(というより、横浜ではシューティングができるゲーセンが無いに等しい)ので、ほぼ初プレイ。最大往生もその内出るのかな?できればゲーセンでやりたいけど、例の如く、横浜には皆無らしい。





追記2:
今、GooglePlayをチェックしたところ、もうアップされているようでした。
とりあえず、私のスマホにも、GooglePlayからダウンロードして入れてみました。
販売しているアプリの場合、GooglePlayからインストールすることはできない(自分のものを自分で購入することはGoogleCheckoutのポリシー違反なようで、ブロックされる)のですが、無料で配っているアプリの場合、問題無いようです。

2012年5月4日金曜日

VGS version up(1.01)

http://suzukiplan.blogspot.jp/2012/05/blog-post_476.html
上記記事の対策を施したVGSをアップしました。

InvaderBlockは昨日の内に早々とアップできたのですが、VGSの方は1曲追加して出したので、曲を作るのに時間が掛かり、予定(昨日中)よりも0.5日程度遅れましたが、ギリギリセーフか。

これで大往生に専念できる・・・と、思ったら、体験版を作成する作業をやらなければ・・・
しかし、コレ(大往生)が450円というのは、ちょっと微妙な気分。安過ぎる。
大往生なら700円だろうが、3000円だろうが買うつもりだったんですが。

課金アイテムを販売しているのが値段のカラクリ?
本体は激安or無料にして、課金アイテムで利益を得るという手法は、STGでは微妙な気がしますが。
課金でエキストラステージみたいなものが追加されるのなら買うかもしれませんが。

iPod touch購入

iPod touchを購入。

というのも、iPod touchがあれば大往生ができるらしいので・・・で、大往生も購入。
将来的には、開発中のSTGをiPhone/iPod touchに移植するので必要なんですが、当面は大往生用。

とりあえず、Normalでやったら初見で1周できてしまったので、「こんな楽だったか?」と思いましたが、Endingの後、Hardじゃないと2周目にいけないっぽいことを言われたので、通常モード=Hard以降らしい。なるほど。

ちなみに、使用機種はTypeA/レイニャン(レーザー強化)。
無印の怒首領蜂の頃からTypeA・レーザー強化一筋です。
正確には、無印をやり始めの頃はTypeBでしたが、TypeA(ショットが散らばらないで真っ直ぐ飛ぶ)の方がパターンが組み易くて楽です。(レーザー強化にしているのは、ショットが弱いから、コンボを繋ぎ易いため)

iPod版だと、アーケードみたいにショットとレーザーの切り替えが楽ではないのが難点。
ただ、レバーよりも移動に関しては高速にできるので、TypeA+レーザーなら終始レーザーだけで問題無いっぽい。
コンボを繋ぐのにはショットが必要ですが・・・

2012年5月3日木曜日

強制停止になる原因

ようやく、ソースが触れる環境に帰ってきました。
で、早速エラーレポートで報告されている事案の調査をしました。

ちなみに、落ちたクラス(VgeSurfaceView)のソースは↓のような感じ。
/*
*------------------------------------------------------------------------
* メインループ (スレッド)
*------------------------------------------------------------------------
*/
@Override
public void run() {
SurfaceHolder holder=getHolder();
Canvas canvas;
while (isAttached) {
// 仮想VRAMへの描画処理
PSGTEST.setVram(vram);
// 仮想VRAMを実VRAMへ転送
canvas=holder.lockCanvas();
canvas.drawBitmap(vram,vramRect,screenRect,screenPaint);
holder.unlockCanvasAndPost(canvas);
}
}

赤い網掛け部分がNullPointerExceptionが発生した部分。
なので、青い網掛け(lockCanvas)がnullを返したことが原因。

Android SDKのマニュアルを読んでいたら、妙な記述を発見。(以下、抜粋)
If you call this repeatedly when the Surface is not ready (before Callback.surfaceCreated or after Callback.surfaceDestroyed), your calls will be throttled to a slow rate in order to avoid consuming CPU.

上記を逆説すれば、「リトライは必要」ということ。
(ついでに、リトライ時にsleepをしなくてもハングにはならないらしい)

なので、以下のように修正すればOKかな。
Invader BlockとVGE Chiptune Musicの両方に下記の対策を入れて、本日中にリリース予定です。
public void run() {
SurfaceHolder holder=getHolder();
Canvas canvas;
while (isAttached) {
// 仮想VRAMへの描画処理
IBLOCK.setVram(vram);
// 仮想VRAMを実VRAMへ転送
canvas=holder.lockCanvas();
while(null==canvas && isAttached) canvas=holder.lockCanvas();
if(null==canvas) break;
canvas.drawBitmap(vram,vramRect,screenRect,screenPaint);
holder.unlockCanvasAndPost(canvas);
}
}
修正ポイント:
・リトライ要の場合、リトライ(Destroy時は中断して抜ける)
・リトライ中にDestroyになった場合はスレッド停止

久々にAndroidアプリ開発っぽい内容の記事でした。

初エラーレポート

VGS Chiptune musicがいつの間にやら100DL超えてました。
コメントを見る限り、私の音楽自体が好評みたいで、うれしい限りです。
ありがとうございます。

そして、初めてエラーレポートを1件頂きました。
Javaソース部分でSurfaceViewの使い方にマズイところがあるようです。
マズイですね、これは。
たぶん、Invader Blockの方にも同件の問題がありそう。
今日の夜には、調査&対策したいと思います。

本当は、今から即効で対策したいところですが、Javaソースの入った開発環境には夜にならないと触れない・・・お出かけ環境にJavaソースを持ってくるのを失念してました。ソースが無くてもある程度推理できますが。
・SurfaceViewのrunで落ちている(NullPointerException)
・SurfaceViewのrunでやっていること
 (1) VGEのグラフィック更新(JNI)→AndroidBitmap作成
 (2) Canvasをlockし、AndroidBitmapを書き込み、unlock
で、NullPointerExceptionになるということは、(2)に問題がある可能性が高い筈。
SurfaceHolder.getHolderで取得したホルダーのインスタンスを、スレッド生存中に使い回しているのがマズイのかな?(ソースを見ていないから、ハズレの可能性も高いですが)
 
しかし、ソースを難読化しなかったお陰で、Java部分でバグがあればすぐに分かって便利。
Javaソースは全体の1%に満たない(99%はCでできている)から、仮に解読されても問題ありません。

合理的ではないものを作りたい

ここ最近、実機版の東方VGSの開発が忙しくて、東方VGSの曲追加が滞っています。 東方VGS(実機版)のデザインを作りながら検討中。基本レトロUIベースですがシークバーはモダンに倣おうかな…とか pic.twitter.com/YOYprlDsYD — SUZUKI PLAN (...