2012年4月3日火曜日

STGにおける敵情報のデータ設計

シューティングゲーム(STG)の作り方を解説しているサイトは数あれど、敵のオブジェクト情報をどのように設計するかについて言及しているサイトは割と見かけないような気がするので、軽く解説しておきます。

そんなん、単純に構造体で管理だろJK

・・・かもしれませんが、この部分のデータ設計を予め如何に適切におこなっておくかで、ゲームの表現の幅が大分変わります。私はそのことを、SHOT01~SHOT03(3作品)の開発での失敗を経て実感しています。

まずは、実際に設計中のデータ(実物)を見た方がイメージが沸き易いかと思います。
なので、現在開発中のSHOT04で作成途中のデータ構造を例示します。

クラス構造としては、敵、オブジェクト、パーツの3種類。

E-Rで表記すると、

  • 敵:オブジェクト=1:n(最大8)
  • オブジェクト:パーツ=1:n(最大8)

という感じ。
つまり、1匹の敵は最大64パーツ(8^2)持てます。
数は今後、コロコロ変わっていくんでしょうけど。

実は、SHOT01の頃は単純な1個の構造体で敵を表現していました。
ただ、それだと当り判定が複数個所に分かれるような場合、処理が面倒になります。
そこで、SHOT02とSHOT03では、1つの敵を複数のオブジェクトで表現する感じにしました。
ただ、それでも処理が厄介な部分があったので、今回は、敵、オブジェクト、パーツの3層構造のスキーマを定義。(予定)

オブジェクトには、有するパーツ数+パーツ情報を定義します。
例えば、グラディウスの多節足の敵の場合、根っこの部分、胴体の部分(複数)、頭の部分みたいなパーツをグループ化したものが、ひとつのオブジェクトになります。

それなら、オブジェクトとパーツだけ(2層構造)で十分だ・・・と普通は考えます。
(だから、SHOT02とSHOT03はその形態にしました)

ただ、例えば多節足を2本持っていて、足単位でパーツ破壊できるような敵(足×2+本体)というものを作ろうとするとプログラムが複雑になってしまいます。だから、オブジェクトを更にグループ化した、クラス(Enemy)を追加・・・という訳です。これで、どんなものでも簡単な処理で表現できる筈。まだ、作ってないから確証は持てませんが。

ちなみに、クラスだとかスキーマだとか、オブジェクト指向の用語を使っていますが、プログラム言語はCのみです。私は、C++やJavaが大嫌いなんですが、オブジェクト指向の考え方自体は、重要だと思っています。(ついでに、iPod touch化するときにもに楽になる筈)

2012年4月1日日曜日

背景

背景がクロマティだと寂しいので、マップ機能を実装。

以前、GAME06という名称で作っていたアクションRPG(※開発断念)用に作ったマップエディタとマップシステムを、シューティング用にカスタマイズして作るだけだから、システム自体は一瞬で作れました。

問題は、リソース(チップセットの画像)。

私には絵心がほぼ無いので、ハムコロサマさんの素材あたりを使いたいところですが、フリーゲームで使うのならともかく、商売で作っているものに他人の著作物を使うのは(現時点の使用許諾は未確認なので、実際にダメかどうかは定かではないですが)トラブルの元なので、下手ですが、自分で描くことにしました。
地面の線路(のつもり)と、飛行機のサイズを影の大きさから計算して見てみると、明らかに寸法がおかしかったりしますが、気にしない方向で。

ちなみに、飛翔鮫みたいな感じの左右スクロールはしない方向です。
左右固定(=東方と同じ方式)。
左右スクロールのプログラム自体、簡単に作れるのですが、マップを作るのが(広い分)面倒だし、ゲームバランスの調整も面倒になるので、左右は固定です。
要するに手を抜きます。

GW中には、ステージ1のみのトライアル版(無償)をマーケットに流したいから、開発効率優先で。

上下移動(実装)

上下移動を実装してみました。
かなり良い感じです。

少なくとも、Android市場に出回っている作品の中では、随一の操作性で、尚且つ全盛期(90年代)のシューティングゲームを求めるコアなシューターが満足できる水準のモノを仕上げることが出来ると思います。(たぶん)
問題は、コアなシューターがAndroidユーザーの中に居るかどうかですが。
たぶん、そんなに居ないんじゃないかと思っています。
満足のいく水準に達している作品が想像以上に少なかったので。
ただ、潜在的にはかなり居ると思っていますが。
というのも、Androidはデフォルトが縦画面(=シューティング専用)なので。

とりあえず、この作品の1面が出来た段階のβ版(トライアル版)を無償で市場に流してみて、様子見をしてみるつもりです。そして、売れそうな感触だったら本気で作り、そうでなかったら、このゲーム(SHOT04)の開発はヤメにして、別路線を探るつもり。

ニーズが無くとも、完成させる可能性も大ですが。

2012年3月31日土曜日

上下移動

とりあえず、海外展開で私がやるべき「INVADER BLOCK 2」に関する作業は概ね終わり、後は時を待つばかりなので、2作目の開発にとりかかりました。

画面はこんな感じ。(まだ、自機以外の何も無い状態ですが)
とりあえず、左右の移動は「INVADER BLOCK 2」の方式が一番妥当だと思います。
なので、2作目もその点は引き継ぎます。
問題は上下の移動。

考え得る方式としては、

  1. 左右と同様に、ポイントした地点(指が邪魔にならないように少し上の方)を目指す
  2. ポイント位置に関係なく、スライドした分だけ上下に移動する
  3. マルチタッチにして画面上下を左右移動、画面左右を上下移動に使う
  4. 上下移動はしない


方式1は、ポイント地点を上にズラしたところで、指が邪魔になることに変わりはありません(程度の問題です)。他のAndroid用シューティングを幾つかやってみましたが、この方式のものはやはり、「指が邪魔」という類のコメントが付いていました。そして、私もそういう風に感じたので、不採用。

方式2は怒首領蜂とかと同じ方式なので、有力候補です。実は、あまり直感的に動けない(というより指が疲れる)デメリットがあることを、「INVADER BLOCK 2」開発途中に確認済みなので、単純に方式2を取り入れるのは微妙。


方式3は却下です。マルチタッチだとWindowsで遊べなくなってしまうので。
Windows版を販促用に無償配布する都合上、Windowsで遊べないものは作れません。

方式4はギャラガ方式ですね。一見するとかなり微妙なのですが、そういうものだと割り切れば悪くは無いとも思っています。ゲーム性が狭まるデメリットが大きいのですが、だからこそ出来ることも有るような気がします。必ず、デメリットには相反するメリットが内在するので、そのメリットを高める工夫をすれば、デメリットをかき消すことが可能になる・・・ということも稀に有ります。

つまり、方式2 or 4が有力候補。

今の所、左右移動に「INVADER BLOCK 2」の方式、上下移動に方式2を採る複合案が最有力。
シューティングは、どちらかというと左右の移動が直感的に出来れば良く、上下の移動は補助的な動作になるから、方式2のデメリットはほぼ感じなくなる筈。

ただし、その方式を採用しているゲームは今のところ見当たらなかったので、

  • その方式だと操作し難い
  • 考え付いた人が居ない

の何れかの原因がありそうだ・・・と、思っています。
後者の可能性は低い(普通に誰でも考え付くレベルのアイディア)と思っています。なので、前者の可能性が高いかも。でも、私が熟慮して選んだ案にはハズレが多く、「この方式が良さそうだ」と思ったのは直感なので、アタリかもしれません。

日本語でおk

わたしのサイトを一通り英語化しました・・・しかし、わたしの英語はかなり怪しい。
一応、英検4級を持っているので、結構大丈夫だと思いますが。
個人情報保護方針とか、活動方針とかは、齟齬が無いようにするため、英語が得意な人に確認してもらっておこうと思います。

あとはこのブログも英語で書くようにすれば、少しは英語力が身に付くかと思いますが、やはり面倒くさいので、ブログは日本語でおkの方向です。大した内容は書いてないし。

そういえば、スマホで表示したときに、みょうに字が小さくなる感じだったので、ヘッダのメタタグでビューポイントを設定してみました。

↓こんな感じです。
<HEAD>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, target-densityDpi=medium-dpi">
</HEAD>

上記を入れておけば、とりあえずスマホのブラウザでも大きく表示されるので見易くなります。
私のウェブサイトは情報量が少ないから、単純に上記を設定するだけで、問題無い感じです。

2012年3月30日金曜日

Add english

どうやら、upload.comに登録するには、web siteを英語にする必要があったようです。

とりあえず、情報量が少ないから、トップページは全部英語にするのは簡単。ソフトウェアのダウンロード先はvectorを除き英語対応済み。

問題は、個人情報保護方針の英語対応か。。。

ちなみに、初めてスマホから記事を書いてみました。字はそこそこ打ちやすい。けど、アプリが使いにくい。。。

2012年3月28日水曜日

自動消灯の抑止

Android用のゲームプレイ中に気になることは殆どないのですが、INVADER BLOCK 2では、リプレイデータを再生中、一定時間が経過すると勝手に画面が消灯してしまうことに今さら気付く・・・

デバッグ機(タブレット)は消灯OFFなので気付かず、スマホではリプレイを再生したことが無かったので気付きませんでした。やっぱり、無駄機能でしたかね?(リプレイ)

消灯設定OFFにするには、何か許可(permission)が必要だと思っていたので、ちょっと微妙な気分だったのですが、どうやら、特別な許可を設定しなくても良いようです。

Javaのコードであれば、
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
とやるだけ。

もちろん、4/8に公開するバージョン2.05には入れておきます。

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

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