2015年7月(46歳)から始めた、「C言語でのゲームプログラミングの学習」。当初の目標をほぼ達成することができました。「メガドライブ版ダライアス」完成です。C言語の勉強を始めてから約3年かかりました。ゲームバランス調整、動作確認、バグ修正などまだまだ改善の余地がありそうなので念のためβ版としています。
中学生の頃に一度挫折したゲームプログラミングですが、最近は沢山の書籍や、ネットでも多くの情報を得ることができます。またゲームプログラミングに必要なソフトも充実しています。
*ドットエディタ(EDGE, Photoshop)や、音楽作成ツール (DefleMask, VGM Maker)、秀逸なメガドライブ開発ツールであるSGDKなど。
またブログやツイッターでの皆様からの暖かいアドバイスや応援のメッセージのお陰で、モチベーションを3年間も維持することができました。自分だけの力では途中で挫折していたと思います。
細かい微調整を除いて、ダライアスを題材とした、ゲームプログラミング学習は一旦終了したいと思います。そこで、プログラミングや移植について苦労したことや、こだわった点などを、忘れない様にまとめてみました。
<プログラミングについて>
メガドライブ版ダライアスのプログラムのメイン部分です。
メガドラ起動時に、Hard_init()関数を実行して、変数の初期化や、VRAMのマップ割り当てなどのハードの設定などを行い、その後ループに入ります。ループは60分の1秒ごとに発生するVSyncが基準になり、ループ毎にGame_pProcess()に割り当てられた関数を実行します。この関数の処理に時間がかかると、いわゆる処理落ちが発生します。
VBlank中に実行する関数です。60分の1秒毎に行われる、画面書き換えの間に発生する時間で、ブラウン管では走査線が右下から左上に戻るまでの時間に実行されます。 この間は、DMAを使ってメモリから VRAMへデータ書き込みが高速に行えるようですが、あまり多くの処理をすると、PCM再生の質が下がるようで、自分の場合は使用は控えめにしています。(シルバーホークのアームの画像書き換え、スコア表示、パレットの書き換えや、スクロール面のスクロール値の設定など)
プログラムのサイズが小さい時は、main.cに全てのプログラムコードを書いていましたが、プログラムのサイズが大きくなり、構造が複雑になると、プログラムを構成する「機能」ごとにソースファイルを分割した方が、管理しやすくなります。
三角関数系のテーブルや角度を求める関数、キー入力、スプライト、スクロール面操作など、汎用的に支える関数群をhc_func.hにまとめました。ダライアスに特化していない汎用性のある関数群です。
ゲームの内容から、スコアパネル、プレーヤー、ボス、敵機、マップ、アイテム、デモ、エンディング、ネームエントリーと、機能別にファイルを分割して管理しました。
C++なら機能別にクラスを作成すると思いますが、Cにはクラスが使えません。そこで、ファイルの分割と構造体を使用することで、Cでも機能を分割でます。staticをつけて変数を宣言すると外部から参照できなくする事も可能です。
ゲームの流れ(フローチャート)です。
フローチャートの書き方は勉強したことがないので、書き方は間違っているかもしれません。ゲームを各場面(Scene)に分け全体の流れを決めます。
それぞれの、Sceneに対応した、関数を作って、ループ毎にScene関数を実行します。プログラムの構造がさらに複雑になっても、各Sceneの関数を追加して、フローチャートを変更すれば、対応可能です。最初ボスモードしかプログラミングしていなかったのですが、通常プレイを追加しても、大きな構造修正は必要なくプログラムを完成することができました。
メイン部分はなるべくシンプルにした方が、メンテナンスがしやすいことは最近気がつきました。ただ書籍やネットの情報での独学なので、まだまだ未熟でプログラムの改善の余地は沢山ありそうです。機会があれば、当時のプログラマーの方にソースを見て頂いて、アドバイスを頂きたいところですが、それはまた夢の様な話ですね。
<ダライアスの移植について>
基本的に、自分が持っている基板(初期のニューバージョン)に準じて移植を行いました。スーパーダライアスのオリジナルボスキャラは、PCエンジン版より移植しました。
プログラミング(移植)するにあたって、特にこだわった点、あえてオリジナルと異なる仕様にした点、PCエンジン版「スーパーダライアス」との相違点などをまとめてみました。
・ゲームセレクト画面
ゲームモード:通常モード or ボス26戦モード
(ボス26戦モードのみコンティニュー機能あり)
ボスタイプ:オリジナルの11体 or スーパーダライアスの26体
連射機能:ON or OFF
プレイヤー:PROCO or TIAT(TIATは攻撃力が2倍)
サウンドテストもあります。
・アーケードバージョン
隠しコマンドでアーケードバージョンに変更(プレイ中一時停止できないなど)
・オリジナルボス or 26体ボス
オリジナルボスは、26体のボスではなく、色違いのボスが出現します。
・エンディング
当然ですが、エンディングは5種類
・デモ画面
デモ時のゾーンプレイ画面もプログラミングしました。GAME OVERは赤文字です。
・ボムの当たり判定
ツイッターで教えて頂くまで知らなかったのですが、ボムがマップ(地形)に当たった時に当たり判定が発生していて、この爆風で敵機を攻撃できるとの事。爆風が消えるまでの数フレーム間、当たり判定の処理を追加しました。また、アイテムを取得するたびに当たり判定の範囲が広くなります。
・ハイパーアーム
オリジナルのハイパーアームは、わりと広い範囲でマップとの当たり判定が発生して、狭い地形だとすぐにバウンドしてしまいます。自分的には嫌な仕様だったので、少し当たり判定の範囲を狭くして、バウンドが起こりにくいように変更しました。
・ボス撃沈時のアニメーション
オリジナルのボスは撃沈時にもアニメーションしています。スクロール面にボスを描画しているため、そのまま下にスクロールすると画面上から出てきます。ボスの描画(動かす処理)と消去を同時に行う必要があるため、処理が煩雑になります。破壊後なので動かなくても良いのでは?と勝手に判断して、撃沈時のアニメーションをやめました。
・山岳地帯の稲妻
オリジナルの山岳地帯は、時々稲妻が光ります。プログラムの工夫次第で、光らせることができそうですが、VRAMの容量がギリギリで断念しました。宇宙洞窟や都市地帯の背景はパレット操作でオリジナルと同じように光ります。
・オリジナルと同じマップ(地形)
PCエンジン版「スーパーダライアス」はスプライトでマップを描画しているため、建造物が低くなっていたり、若干マップが変更されています。メガドライブはスクロール面を2画面持っているため容易に再現できました。使える色数は少ないですが、なんとかごまかしています。
・ボスのアニメーション
目で見てわかる範囲の動きは全てプログラミングに取り入れました。GREEN CORONATUSの体節やOCTOPUSの脚もオリジナルと同じ動きをしているはずです。(目コピーなので微妙に間違っているかも?)
2013年2月に筐体制作を趣味で始めて、2015年4月にブラウン管3画面ダライアス筐体完成。2015年7月にC言語の学習を始めて、メガドライブ版ダライアスのプログラミング完成。5年間以上もダライアスをネタに遊び続けてきました。これを期にダライアス関係の活動を一旦終了しようと思います。ブログやツイッターでアドバイスを頂いたり、励ましのお言葉をいただいたり、記事を読んでいただいたり、本当に楽しかったです。皆さま有り難うございました。
最後に、この素晴らしいゲームを世に送り出して頂いた、当時の開発スタッフの方々、良い思い出を有難うございました。
さて、次は何をしようかな…。