ぶれにぶれまくってこんな記事を書こうと思ったのは昨日のことです。
実はここ数日、Windows移植ロックマンの開発が滞っていましてね。
これはまずいと思いながらもVS(Visual Studio)でプロジェクトを広げてコードを閲覧はしているのですが、次の追加実装へ進めずにいる状況。
それはなぜかと考えた時に可能性として
「現在のコードになんらかの原因があるのではないか?」
「プロジェクトを別の視点から見直すタイミングが来ている?」
などを考えてしまっているのです。
実際のところはよく分かりません。
私はあまり人間の頭脳という組織を使いこなせない生物?なので、その点は自然な成り行きに身を任せる事にしました(というかそうするしかない😂)。
解説概要
で、なんの記事をこれから書くの?
という話ですが、
Windowsで2Dアクションゲームを作成する手順を現在進行中のプロジェクトを一例にして解説していこうと思います。
こういう記事を書かないと本編の報告が何もないからブログのエントリーが減ってしまうんです🤫💦
ゲーム開発という事で、基本的に実行速度が速いとされるC++言語を使う事になります。
ウェブ上の記事ではC#でゲームを開発する方法、Unityを使う方法、unsafeでC#を動かせばC++と大差ない速度になる等の情報が散見されますが、世の中ネイティブがインタプリタに敵う事はほぼありません。
それは子は親を上回らないという自然の原則であり、宇宙の法則です。
この解説を書く事によって私自身も何か気づくことがあるかもしれないですし、物事は普段から常に客観的に見れるものではなかなかありません。
客観的視点でものごとを見る事は自分以外の視点でものごとを見る事であり、それはクリエイティブに関わらず様々な分野で必要な事です。
実際にC++やゲーム開発の参考書を見るとシェアが高い分野での解説や全般に関わる解説が少ないように感じます。
コンソールアプリケーションのソースコードの構築方法や、開発環境のインストール~サンプルコードの解説など…。
もうちょっと具体的な例ってないのかな?と思う事がよくあるんですが、それってもしかして一般的に知れ渡ってしまうと都合の悪い事だったりするのでしょうか?
そうだとしたら何があるのかよく分かりませんが、それをなるべく今から解説していこうかなと思います。
観点は、プログラムコードを採用するきっかけとか、そういう実装になった経緯とかの説明です。
どっちかというとプログラマーとしての解説ではなく、一般常識とか思考回路のお話も含まれるかもしれませんが、その点はご了承ください。
そもそもなぜWindowsでロックマンを作ろうと思ったか
色んな事情があったりするわけですが、
主因はやはりアセンブラ開発が困難な事情でしょう。これは致命的な問題です。
開発に着手した題材のロックマンはファミコン版の本家バージョンなので、そのプラットフォームで同じものを作る場合アセンブリ言語をコーディングしていく必要があります。
そもそもファミコン自体がもう40年以上前に発売したハードですし、ファミコン専用のアセンブラのリファレンスがすぐ手に入るかと言われたらそれは微妙な話です。
それよりはモダンな言語を使って自身の自己啓発も促進すれば効率的な時間消費になるんじゃない?という発想にたどり着くわけであります。
そういう観点でいきますとC++は割とモダンなプログラミングパラダイムですし、ゲーム開発に求められる高速レスポンスの要件を達成できる手段である事は確かです。
アセンブラなんて今更資料を調べて研究しても、その能力が何か自分のためになるかと言われたら・・・
・・・無いですよ。。。( 一一)
更に言うと、ファミコンというプラットフォームで開発するという事はファミコン上で動作する制約を遵守する必要性も出てきます。
これが思った以上に障害として立ち塞がってきます。
ファミコンは8ビットゲーム機なのでその性質上、CPUやRAM(いわゆるメモリ)、V-RAM(いわゆるグラフィックメモリ)、バスバッファなどは全て8ビットです。
その制約の中で自分の思い通りのゲームを作成するとなると設計にその制約を考慮に含めないといけなくなり、それは現代ゲーム開発において無駄な労力でしかないです。
それを遵守しないゲームなんかレトロゲーじゃないだろ・・・という批判もありそうですが、それを払拭する一つの手段としてファミコンのゲームをWindowsに移植してしまうという対応が考えられます。
この経緯があってWindowsでファミコンのロックマンを完全移植するプロジェクトが立案されました。
ちなみにこの構想が初めて出たのがもう10年以上前です。
めっちゃ前ですね😅
こんなに期間が空いているのには私生活などプライベートに理由がありまして。。。
しかしその点についてはちょっと言いたくない話もあるので言いませんが、いかんせん個人の時間ってなかなか確保できないですよね。
それだけ世間や社会に浸透している証拠なのでしょうか。
そしてWindowsにゲームを移植するプロジェクトにおいて最も大きな利点があります。
それが先ほどの話の真逆の説明になりますが、制約がほぼないという事です。
これは非常に大きいメリットです。むしろこれだけのためにゲームをPC版に移植してもいいくらいです!😀
それは自分の好きな進行形態でのゲームシステムですら構築できるという話です。
例えばステージを選べない方式、1面、2面・・・といった展開のロックマンも作れちゃうわけです。
もっぱらファミコンハックロムでそれをしているゲームもかつて見た事があります。もう10年以上前ですが、あれはさすがに凄まじい衝撃を受けました。
そもそもロックマンってステージ選択式が醍醐味なのに、それを潰してしまって何が面白いのか。。。という意見はもちろんあると思います。
しかしロックマンというゲームを知り尽くしてしまうと、その点はあまり意味を持たなくなってくる場合があります。
おそらく難易度やゲーム展開の懲り思考の問題だとは思われますが、実際のところ人間が自分に持ってないものを追い求める生物である以上この説は無視できません。
Windowsでロックマンを作れる環境さえ出来てしまえば、容量制限やコンシューマーの制約を気にする事なく好きな実装ができる。
それを思ったのがこのプロジェクトを始めようと思った契機です。
もちろんドット絵じゃない明らかにFC(ファミコン)じゃない、違和感のあるグラフィックとかにするのは論外ですけどね(笑)
開発環境
FC版ロックマンについて知っておく
そしたら実際に開発に取り掛かっていくわけですが、その前の準備として実際にどんな環境で作っていくかという事を考えていきます。
まずロックマンというゲームを移植する以上、このゲームについては熟知している必要があるかなと思います。
それは実際にファミコン本体をテレビに接続して、ロムスロットへロックマンのソフトロムを差し込みゲームをプレイしまくる必要があるでしょう。
今現在はファミコン本体を持っていないため古い画像から探してきましたが、上記の画像しかありませんでした😂
ファミコンは今となっては入手困難ですが、私は昭和生まれのゲーマーで幼少の頃から自宅にファミコン本体が2台既にあった家柄で育ちました。
ロックマンというゲームを初めてプレイしたのが3才の時という話を親族から聞きましたので、恐らく事実だと思われます。
素材作成用のツールについて
若干話が逸脱しましたが、実際にロックマンを制作するにはそれらの素材データをどうやって作るのか?という問題があります。
いわゆる「ドット絵」「チップチューン」「プログラムコーディング」です。
コーディング環境は「Visual Studio」などの一般的に主流になっているコンパイラで妥当ですが、問題は「ドット絵」と「チップチューン」です。
これらはWindows付属のペイントやフリーの作曲ソフトを使うだけではそう簡単には作れません。
そこで私はこの制作過程を経るためにいくつかのアプリケーションを選択しました。
まずはファミコン特有のドット絵を作成するために特化したツール、TAKABO SOFTさんの「EDGE」です。
高機能ドット絵エディタ EDGE2 | TAKABO SOFT
→ウェブサイトはこちら
まずファミコンのグラフィックの仕様なのですが、52色の既定色を持っているハードになるので、それらの色を使用する事がファミコンのゲームとして自然に目に映る形となります。
これは非常に大きなポイントです。
そうなってくるとパレットの管理などが必要になってくるので、専用のカラー選択インターフェースがあると作業効率が大幅に向上します。
EDGE2はライセンスが有償(4000円/1ライセンス、2024年現在)ですが私はこのソフトウェアを開発に導入しました。EDGE2にはカラーパレットをウィンドウとして表示できるので便利です。
上記のようにファミコンの独特なドット絵を制作する過程において効率アップする機能を有したアプリを使用すれば良いでしょう。
次にサウンド関連のデータの作成ですが、これもファミコン特有の音を再現できるソフトが必要になってきます。
私はDAWソフトなどにあまり詳しくないので、Googleで検索してファミコン音源制作ツールを検索したものを使用しています。
一般的にはMIDIなどを作成するツールが多く巷に出回っていますが、その中にファミコンの音を発音する機能があるものを使用することになります。
FamiStudio – NES Music Editor
→ウェブサイトはこちら
このソフトウェアはここ数年に開発されたアプリケーションで、モバイル端末Android向けのアプリとしてもリリースされているチップチューン作曲の主流ソフトになります。
0CC-FamiTracker Development Log
→ウェブサイトはこちら
こちらはトラッカーと呼ばれるエディタースタイルの作曲ソフトで、特殊な打ち込みを必要とします。
私はこのソフトウェアを使用してBGMやサウンドエフェクトを作成しています。
ファミコンの音源データ(NSFファイル)が取り込めたり、パルス波などのチャンネル単位でwavファイルなどを出力する事ができるため、ゲーム制作の素材づくりに特化した機能が盛り込まれています。
FamiTrackerは別の方が作成されていましたがOSS(オープンソースソフトウェア)なので、有志の方が機能を追加したバージョンをGithubで公開されています。
0cc-FamiTrackerはSN5B(SUNSOFT 5B、拡張音源の1つ)が使用可能になっていたりと、かなりアップグレードされている上位互換ソフトになります。
ロックマンの音楽は非常に特徴的で、カプコンが同時期に発売したソフトでもロックマンに関してはチップチューンの質が群を抜いて洗練されている印象です。
そのBGMやSEを参考に全くオリジナルのサウンドクリエイトをしていくわけなんですけども、それがまた難しいんです。。。
プロとアマチュアの壁はあまりにも高い。
まさに城壁です😅
オーナーのゲーム制作環境
以上がスポット的なツールの選定になりますが、一例として私自身の開発環境をご紹介させてください。
- Microsoft Visual Studio
プログラムコードからゲーム実行ファイルを生成するためのコンパイラと呼ばれるアプリケーションになります。インストール時に「C++によるデスクトップ開発」を選択する事が必要です。MSVC。
作成した素材やコードはこのツールで結合し、最終的にexeファイルとして出力してゲームファイルとする必要があります。
他に代用できるコンパイラとしては「Clang」「GCC」などがありますが、MSVCは統合開発環境と呼ばれるものでコーディング~ビルドまでを一貫して行えるツールのため作業が容易なメリットがあります。 - Atom
プログラムコードを効率よくテキストエディタです。
コーディングは基本的に多くの英単語やソースファイルと付き合っていく事になるので、視覚的に効率の良いインターフェースを備えた機能のテキストエディタを選択する事がポイントです。
テキストエディタは非常に多くの種類がありフリーウェアから高機能のシェアウェアまで多数存在するので、使いやすいテキストエディタをダウンロードするとよいでしょう。 - FCEUX
ファミコンのROMデータを読み込ませる事でPC上で仮想実行する事ができるコンシューマー環境エミュレータ―です。
エミュレーターについては海外製であれば数多くのファミコンエミュレーターがありますので、代用アプリは探してみて下さい。「NES EMU」などで検索すると数多くヒットします。
ROMデータをPCに吸い上げる方法は専用の吸い上げ機を制作する必要があります。私は少し前までウェブ上で販売されていた「パソファミ」というものを使用しておりますが現在は入手する事ができません。代わりになるものはAmazonなどのマーケットで入手できる「FCダンパー」などがあります。
ゲームソフトの完全移植をするためにはこのようなエミュレーターを使用してメモリマップなどを解析し、それを現代のプログラムコードに変換して再現する必要があるため私はこの手法を取り入れています。 - Bz
上記で完全移植を目指す場合はこのバイナリエディタが必須になってきます。
一般的にROMデータを解析するために使用します。他に代用できるバイナリエディタは「Stirling」などがあります。
ちなみに私は今時点で使用していませんが、ファミコンのROMデータからアセンブリコードを取り出す逆アセンブラを使用する事も手です。しかしその場合はネイティブ言語を読み進める知識が必要になります。ファミコンのプログラムは6502というMOSテクノロジー製CPUをリコー社が最適化したカスタムチップになっており、このCPUに対応する命令などを使う資料を入手する必要があり、導入にはかなりハードルが高いでしょう。しかしアセンブリコードを解析する事でより再現性の高いファミコンゲームをWindowsで開発する事が可能になるのは確かです。 - Edge2
上記で紹介したドット絵エディタです。
代用ソフトについては「Aseprite」「Pixel Studio」などがあるほか、ファミコンのROMデータのスプライト領域からデータを読み込める「yy-chr」というツールもあります。 - FamiStudio
上記で紹介したピアノロールエディタ風チップチューン作曲ソフトです。
代用ソフトとしては「FamiTracker」などがあります。DAWのUIを備えたアプリケーションならFamiStudioを使用して音源を作曲するのがおすすめです。
- その他役に立ちそうなツール
- Git
ファイル管理するためのツール。GitHubというサービスがあり、それ利用します。バージョン管理システム。 - ZiiDetector
ファイルの文字コード、ファイルの改行コードをフォルダ単位で一括変更できます。フリーソフト。 - ゲームパッド
PCにUSBなどで接続できるゲームコントローラー。機敏な動きが要求されるアクションゲームなどは必須と言えるでしょう。
XInput対応のものや、DirectInput対応のものなど様々な種類が販売されているので、開発するゲームに対応したコントローラーを選択しましょう。各種ウェブサイトや家電量販店などで購入できます。
ちなみにですがXInput対応のゲームを作成する場合はXbox One X、またはXbox OneのコントローラーをPCに接続して使用することができます。
- Git
Windowsにおけるゲームの作り方
さて、ようやく実際の制作工程に入っていくわけなんですけども、実はWindowsのゲームの作り方とは簡単に言ってしまうと、Windowsのアプリケーションの作り方になります。
それは一体どういう事か?というと、WindowsにおいてはExcelやWordのようなアプリケーションもゲームアプリケーションも同じ物質ですよ、というお話です。
ようはつまり同じアプリケーションソフトウェアになります。
では普通のプログラマーにもゲームは簡単に作れるのか?という質問が飛び交うかと思いますが、それは少し違いますし、そもそもそんな結論付けができる話ではない、という事です。
それはどんなジャンルのアプリケーションであっても、プログラムの技量とデザインの技量とでは畑違いなんです。
どうしてもそこに結論を見出すとしたら、
ITエンジニアがゲームデザイナーになれますか?
ゲームクリエイターがデータアナリストになれますか?
という事実が残ってしまう事に尽きます。
ゲームの世界では、プログラムの知識の他にゲームのアニメを作成する文系の知恵が必要になってきます。
ベクトルが分かっても、ゲームの世界はイラストに影を付ける絵画気質も必要になってきます。
ゲームのエンディングなどでスタッフロールがよく流れますが、そこに多くの人の名前が流れるのはそういった理由です。
正直言うとゲームを一人で作れる人は天才と言ってもいいのではないでしょうか😅
プログラムをコンパイルする
少し前置きが長くなりましたが、Windowsのプログラムには必ず存在する要素があります。
プログラムは開始トリガーと終了処理が必ずあります。
まずはそこを構築していきましょう。
C++のプログラミングは一般的にmain関数によって、プログラムの開始と終了が制御されます。
つきましては、Windowsのゲームアプリケーションもmain関数が必要です。
#include <iostream>
int main()
{
std::cout << "Hello, World!" << std::endl;
return 0;
}
・・・(´・ω・`)
いや分かりますよ。これって黒い画面に文字が一瞬出て消えるやつでしょ?と。
C++の入門の書籍に書いてあるありがちなソースコードです。
しかしここで作りたいのはそれではありません。
これではゲームを作れないです。
ではどうするのかというと、WinMain関数を使います。
#include <Windows.h>
int WINAPI WinMain(
_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow
) {
return 0;
}
この時点で諦めようと思った方はもう諦めたほうがいいです。この先、このようなMicrosoft Windows節謎キーワードが無限に湧いてくるので耐えられなくなるのは必至です。
解説していきましょう。
小難しい単語がブワッと出てきましたが、全部意味を調べて理解する必要はありません。
それは「家の入口には必ずドアがある理由」という事を調べるのと同じくらい意味のない事だからです😂
つまりこれはWindowsのプログラムを作成する場合に必ず書かないといけない文なのです。
そうとわかればさっそくテキストエディタに上記WinMain関数を書いてコンパイルしていきます。
コンパイルのやり方は各々コンパイラーの説明を見ましょう。
例えばVisual Studioの場合は以下です。
「ソリューションのビルド」。
ビルドというのは、コンパイルとリンク2つを行う作業のことです。
さて。
この時点で正常にコンパイルが出来た方はいいです。
コンパイルできねーぞコラっとなった方、いると思います。
それはプログラムの種類を間違えているからです。
例えばVisual Studioなんかで言うと、こんな感じかなと↓
なんかよく分からない警報がデターーーーーーー(^ω^)ーーーーーーー!!
LNK2019?未解決のシンボル?
全く意味の分からないエラーメッセージが表示されますね。
これはコンパイルがうまく出来なかった状況なのですが、プログラムの種類が間違っている場合に多くみられる見落としになります。
ではプログラムの種類ってなんですか?という話をしていきましょう。
Windowsアプリケーションの種類
Windowsのプログラムは一般的にコンソールアプリケーションとGUIアプリケーションの2種類に分類されます。
これは何なのかというと、
- コンソールアプリケーション
黒い画面に文字が出力されるだけのアスキータイプのアプリケーション - GUIアプリケーション
ウィンドウ、アイコン、ボタン、メニューなどが視覚的に確認できるタイプのアプリケーション
という事です。
つまりゲームを作る場合はGUIアプリケーションを作りたいですよという事になります。
GUIアプリケーションを作りたいのにも関わらず、コンソールアプリケーションとしてコンパイルしようとしてませんか?
問題点はそこにあります。
例えばMinGWコンパイラを使用する場合は、コンパイル時にコマンドへ「-mwindows」を指定します。
(これはWin32 APIを利用する場合です)
Visual Studioの場合は、プロジェクトの「プロパティ」→「リンカー」→「サブシステム」をコンソールからWindowsにする必要があります。
こういった部分に出力するプログラムの制御が入っているので注意してください。
Windowsのアプリには上記の種類があるんだよ、という事を覚えておきましょう。
これでコンパイルが通ったら実際に開発作業が始まります。
ゲーム開発も最初はこんな感じでスタートします。
今回はここまで。
次回はゲームライブラリの導入とウィンドウを作成するところまで進めたいと思います。
よろしくお願いします。
コメント