レトロゲームが盛り上がってる。素晴らしい。
せっかくだからおれのレトロゲームも出そう。脳内だけで作ってないけど。作ろう。
ゲーム開発プラットフォーム比較の結果、MonoGameで製作決定。
作ってみたい本命レトロゲームがある。
本命の前にまずは練習だ。初めて作るゲームにちょうどいい定番題材がいくつかある。
定番筆頭、テトリスでも作ってみようか。→ テトリスの完成度高すぎ問題で挫折。
テトリスは諦めた。スネークでも作ろう。
テトリスと違って厳密な定義がない。再解釈し放題だ。楽しい。
以上で開発経緯は終わり。あとは日記…でさえない。日付が無いので。開発雑記帳かな。
テトリスやスネークがなぜ初心者向け定番かというと、ポリゴン表示やスプライト処理なんて複雑なことはわからなくても、カンタンな文字表示のプログラムを覚えるだけで記号文字”■”や”●”を使ってゲームを作れるからだ。
よし、まずmonogame上にテキスト画面表示システムを作ろう。(ここから狂ってる)
テキスト画面はできた。
Windowsアプリである以上、起動時はウィンドウ表示だ。ウィンドウサイズも自由に拡大縮小できないといけない。もちろんゲームなのでフルスクリーンモードもマストだ。あとポーズ機能とフルスクリーン機能はゲーム本体より上位レイヤで動いているから操作不能演出中だろうがいつでも有効だぜ。(こだわりポイントそこかよ)
F4でウィンドウモード<>フルスクリーンモードのトグル動作で作っていたが、フルスクリーン化の処理後にウィンドウモードに戻すトグル動作に入ってしまいがち。さっくり諦めてウィンドウモードに戻すのはF5キーに変更。
じゃあまず起動画面から作るか。(ゲーム本体から作れよ)
次はタイトル画面だ。(まだゲーム本体作らないのかよ)
せっかくだから背景でスネークも動かそう。
出来た。せっかくだから別パターンも作ってみよう。(まだゲーム本体作らないのかよ)
よし、ゲームシーンを作ろう。すでにタイトル画面用にスネークClassは作ってあるので動くよ。
スネークゲームだからエサも出さなきゃ。エサって林檎だっけ?(根拠ないし調べてもいないがまあいいや)
林檎って1個だっけ?寂しいから3個くらい出しておこう。(ゲームバランスは?)
スネークってどうすると死ぬんだっけ。自分の体にぶつかって死ぬんだよ。その間抜けさがいい。自分の体に衝突判定が無いスネークゲーはスネークゲーじゃない。
壁にぶつかって死ぬ?それはつまらないなあ。やめよう。画面上下端、左右端をつなげてループさせよう。1982の固定画面ゲームは左右ループが普通なんだよ(呼吸をするように嘘をつく)
ループしていきなり逆サイドに移動すると衝突事故が起きるよな。危険だ。上下左右に1行ミラー行を作ろう。突然の出現じゃないから危険も安心。
壁衝突がないと簡単すぎるしアクセントも欲しい。敵スネークも出すか。(原作にそんなものないぞ)
自機スネークを限界まで伸ばすのが楽しいんだよな。よーし父さんどこまでも伸ばせるようにしちゃうぞ。
敵が出るんだったら自分もなにか攻撃技が必要だな。よーしレインボーアタック。(意味が分からないし役にも立ってない)
じゃあレインボー時は敵が自機を避けずに突っ込んでくるようにしとけ。
ゲームが地味すぎない?でもテキスト画面ゲームがテーマだから派手なエフェクトは出さないよ。せめて登場シーンとゲームオーバーくらいは演出入れようよ。(地味すぎ問題は改善してないよ、でもこれ以上は控えておこう)
ゲーム下手な人がターゲットなので(ターゲットじゃなくて自分の事だろ)、難易度自動調整的なロジックは入れたい。プレイ上手だとスネークのスピードが上がるぜ。
タイトル画面に林檎が登場しない。スネークはランダム成長&ランダムレインボーのままだ。修正しよう。これだからゲームよりタイトル画面を先に作っちゃダメだろ。(伏線回収)
タイトル画面は何も考えずゲームデモ(実際のゲーム中画面が勝手に動く)仕様が当然と思って作ったが、そういえば最近のゲームはそうではないかも。
アクションゲームなら当たり判定はコリジョン判定を使うところ、このゲームは蛇がどんどん伸びるし(オブジェクトが増える)、オブジェクト同士の重なりもないしでRPGみたく方眼紙マップ方式を採用。(方眼紙はダサいだろグリッドマップと呼べ)
といっても最初はただのint配列だったら破綻した。真面目にコリジョンMapクラスを作ってリファクタリング。面倒くさ(自業自得)
しかも描画部分と違ってデバッグが面倒くさい。コリジョンマップ可視化機能を実装。隠し機能だからな!
敵が知能もってワラワラ動き始めると楽しいな。テストプレイしてるのか遊んでるだけなのかわからん。しかし敵がお馬鹿さんすぎて激突死が多い。緊急衝突回避を追加するか。
そろそろサイト作成のことも考えないと。スクリーンショットとるならポーズ中の「PAUSE」表示は消せるようにするか。ついでにゲーム名のテロップも重ねられるようにしておくか。
クラス名(ファイル名)の先頭は基底クラス名をつけているので、Sceneシリーズ, Snakeシリーズ, Screen, SaveData とアホみたいにS始まりが多い。扱いづらいよ!思い立ったら変更。1コマンドでリファクタリングできるVisual Studioは神だな。ファイル名まで勝手に変わってくれるし。
コーディングで時間がかかるのが変数やメソッドやクラスのネーミングだが、そのあたりは適当にやっつける方針とした。思いついたらリファクタリングで全ソースコードを書き換えまくり。一人でプログラム組むのは本当に気楽。
他のPCで動かしてみようと試すが、.NET Core 3.1のインストールを求められる。そりゃ.NETアプリだし。ユーザーが面倒なのも困るが、.NET Core 3.1のサポートは2022年までだと!?
開発者としてスマホアプリが死ぬほど嫌いなのは毎年OSに合わせてアプリのアップデートを求められるところ。放置すると得てして数年以内に動かなくなる。
Windowsアプリは一度作れば保守せずに何年何十年も動くのが好きなのに、.NETは対象バージョンのサポート期間は3年です。じゃ困る。
と思って調べたら、単一バイナリで動く.exeをビルドできるのか。やっぱりMicrosoftは最高だな。開発者に一番優しい。開発者はな、保守が嫌いなんだよ!
タイトル画面に選択メニューのプログラムがない。ボタンを押せばゲームが始まる+Esc/Backを押せばプログラムを終了するので必要なかった。隠し設定メニューが必要になったし終了メニューは必要だろう。終了のメニュー名は? EXIT? QUIT? 今時はQUITかー。
Stage, Sizeも大文字に統一しよう。1982っぽいから。(今時を気にしてなかったっけ)
設定メニュー名は?色んなゲームを見てもSETTING,CONFIG,OPTION,SETUPバラバラでわからん。こんな時はgoogleの検索ヒット数で決めよう。OPTIONの勝ち!googleの検索結果は人によって違うけどな。
設定メニュー作ったからついでにスピード設定もつけよう。ゲームの難易度調整はゲームスピードで、がおれの考え方。弾を増やすのは何か違う(このゲームに弾はない)
スネーク同士の衝突判定はマップチップ単位で遊ぶ上では問題ないけど、スネークの見た目はドット単位の移動なので、頭や最後尾と衝突した場合、見た目上はまだ距離が離れているのに衝突したように見える。
死んだ後もマップチップ単位で移動しきることで誤魔化してきたが、後ろから追いかけるように衝突した場合はすぐには距離が縮まらないので目立つ。頭と最後尾はドット単位判定するか…ついでにコリジョン表示の隠し機能にドット単位表示機能も追加。一つ上側にずれて表示するのはわざとだよ。
デバッグがかったるい。Aボタン(Zキー)を押すと倍速で動くようにした。これは気持ちいい。以前から付けようかと思ってたけど、スピード設定による難易度調整の意味がなくなっちゃわない?なんてためらってたのは良くなかった。やはり仕様の基準は「気持ちいいか」オンリーにすべき。難易度調整機能だってそのためだしな。
オートパイロットを作った。最高スピードでかっ飛ばすと気持ちいいな。敵の知能よりはかなり賢くしたのに、出合い頭の衝突でそこそこ死ぬ。作ったのは自分だけどよくわからない。そういうのあるよね!別に無敵モードではないのでちょうどいい塩梅。
現代のゲームを見た後だと画面が寂しすぎる。タイトル画面をまたデコってしまった。開幕ラッシュスネーク追加。うざいし起動時一回だけ。これで最後にしておこう。
ランキング画面作成。ランキングデータは普通にC#のコレクションクラスを使う。そういえばゲーム中はコクレクションみたいな言語側で用意したリッチな機能は使ってない。意識せず複雑そうな処理を避けるCPUパフォーマンス最適化脳かよ。今どきのCPUでその程度は無意味すぎる。呼び出し回数少ない場所でdelegateは使ってる。おれの中でdelegateはイカした機能。
ランキング画面の表示はゲームオーバー時のみ。タイトル画面からの導線は無し。ランキング画面はある程度ゲームを進めて画面を拡げた前提なのでタイトル画面とはサイズが合わないし、ゲームクリアが無いこのゲームにおいてはクリアに替わるご褒美だからいいのだ。
難易度調整は自分が基準。普通は開発者が調整すると難しくなりすぎることが問題だが、自分は下手すぎることが問題だ。とはいえ全く100ステージ行けないのは難しすぎる。スピード上昇率を調整した。オートパイロットも前面に打ち出そう。アンロックを記憶するようにして、オートパイロットもランキングに対応させよう。
突然死で一発ゲームオーバーが厳しいなら残機制か体力制を考えるだろうけど、プレーヤーが意識する情報が増えるのは嫌い。このシンプルなゲーム性には似合わない。次のゲームでは巻き戻り残機制にしようかなとは思ってる。
最後に音楽を付ける。昔はwavのみ対応だったようで心配したが、今のMonoGameではoggファイル再生に対応、mp3も自動的にoggに変換されるようで安心。
著作権フリー曲は初期から探していた。素晴らしい曲は多々あるのだけど、ゲームのBGMとしてはメロディが無くてリズムオンリー位に割り切ったのが欲しい。良い曲ではなく背景としての曲が欲しい、なんて開発者都合の要望は既存アセットではなく自分で作れ、もしくは発注しろということか。
ゲームミュージックが好きなので、効果音ばかり聞こえて音楽が良く聞こえないゲームは苦手なんだが(効果音の音量調整が欲しいわけではない、頻度を下げて欲しい)、このゲームは効果音付けてみたらバランスよくてホッとした。敵同士衝突は音出さないよ。
Release版で挙動が違う部分がある。Debug出力が使えないのでわからない。最後の最後になってログ出力機能を追加。
公開の準備を始めるがプログラムアイコンが気に入らない。作り直し。GIMPでアイコン絵を描いてみるが、GIMPは機能が豊富すぎて意図しないモードやツール表示になったりしすぎ。「このゲームを作るのに何が一番苦労しましたか?」の答えは圧倒的にGIMPの操作。ドット絵描くのにGIMPを使うお前が悪い。さっさとスプライトエディタを買おう。
ゲームをダウンロードして実行まで試してみるも、多重起動しまくり問題発生。初回起動時の.NET展開が怪しい。この現象はウィルスと思われそうでヤバイ。Mutexで多重起動禁止ロジックを入れたがDebugビルドだと期待通り機能するのにReleaseビルドだと機能しない。一番困るバグ。Mutexの解析までしてたらキリがないのでロックファイル方式で実装。ますますレトロ風味が強まった。
しかしWebサイトで.exeをダウンロード~実行させようとすると、今時のブラウザやOSは警告が出まくるのね。Zip形式にしても回避できない。これじゃ一般人向けゲーム配布とは言えない。急遽Windowsインストーラを製作。デジタル署名していないので不明な発行者と言われるが、ゲームは完成しているのに公開がこれ以上遅れるのはもうイヤなので見過ごす。
将来の配布手段としてはSteamに登録したい気もちょっとある。自作ゲームをゲームハードで動かしてみたいがためにSteam Deck予約したし。まずはサイドローディングで試すけど。Steamに失礼とか他のゲームよりあまりに見劣りするとかそういうのは気にしない!
コメントは締め切りました。