
はじめてゲームプログラミングでゲームを作った話
ご覧いただきありがとうございます。
今回はNintendo Switchの「ナビつき!つくってわかるはじめて
ゲームプログラミング」というゲームというよりソフトを使ってゲームを
作った話になります。
前回の記事の後編みたいなものです。
前回ツールと書いてしまいましたが、ソフトの方が適切かなと思ったので
ここではそう呼びます。ゲームもゲームソフトって言いますし。
基本的に取り扱うものが他社様他人様が作成したのもで
当然私に権利がないので、スクショは使ってもコピーライトが載っている
タイトル画面以外載せないようにしてましたが、
今回のは他のスクショがないとどうしても堅苦しいというか
読むのに体力を使う記事になりそうなので、今回はタイトル画面以外も
使います。
他社様他人様に関係ある自分ルールの例外適応です。
クズですねすみません。
このゲームソフトまたはゲーム作りに興味を持つような内容に
がんばってするので、任天堂さん許してほしい。
1. 作ったゲームの説明
まずは作ったゲームの説明をして、どうやってここまで作ったかを
ざっくりにはなりますが説明します。
百聞は一見に如かずということで、とりあえずゲームIDを貼ります。
はじめてゲームプログラミングを持っている方は、是非直接ご覧ください。
ゲームID:G 002 MHT TK0
内容は端的に言うとあっちむいてホイです。
矢印が出るのでその方向に決められたJoy-Conを振って5回成功したら勝ち、
5回失敗したら負け、といった内容です。
スクショを交えて流れを説明します。





これは失敗したパターンですが、画面上のライフが減ります。
左上の青がプレイヤー、右上の赤が敵です。
あとはライフが0になるまでこれを続けて、勝ち負けを決めます。
ちなみに意図してなかったですが相打ちもあります。
面白いので仕様とします。
次に作った過程を説明します。
2. 何を作るか考える
今後作ろうと思ってるゲームの簡易版を作ろうかと思ってましたが
今回使うハードがNintendo Switchなので、せっかくなのでJoy-Conを振った
操作をするゲームにしたいと思いました。
次にどんなルールにするか。
上下左右に振り分けてる絵面が見えたので、そこから考えてあっちむいて
ほい的なものにしようと思いました。
次に画面のイメージを書きだします。
3. ざっくり画面設計
イメージボード、とまではいいませんが
大雑把でも画面の設計図あったほうがいいと思うので
お絵描きツールを使ってざっくり書きました。

今回は他人にイメージを共有する必要はなく、自分だけがわかればよかった
とはいえ、ラクガキみたいに見えるかもしれませんが結構考えまとまるので
雑だろうが毎回作ってます。
何よりここまではまだ楽しい工程ですし。
次にイメージから何を作っていけばいいかを考えます。
4. 作る機能をあげる
何を作るかある程度詳細なイメージできたところで
完成までに必要な機能をあげ作る順番を考えます。
今回はとりあえずこんな感じ。
敵の配置
せーのっ
矢印↑だけ
成功失敗パターン
HP減少
勝ち負け
制限時間カウント
説明書く
乱数と他3つ
8択
最低限の内容でゲームの流れを作り、あとからパターンを増やして
いきます。
風呂敷を広げる前にまずは軸を完成させます。
それができれば気分的には半分以上終わります。
また、作ってみて結局無理とわかったものや没にしたものも混ざってますが
それは追々。
普段のゲーム作りなら画像や音などのリソース面のことも考える必要が
ありますが、今回はそういったものは一からは一切作らず、全てノードンで
用意されたものだけを使います。
では具体的にどう作ったのかを見ていきます。
5. ノードン全体

はいこれが全体です。
入り切ってないです。
ひじょーーーーーにたくさんのノードンを使ってごちゃごちゃしてます。
特に中央のゲーム画面。
画面がスクロールせず、一画面に詰め込みまくった結果です。
ちなみに文字や矢印など表示させるものについては基本的にオシャレな
モノノードンと紐づけており、ワープさせるものなどを個別に識別できる
ようにしてます。
このあたりはナビパートでテクニックとして説明があるし、各々何と紐づけ
ているかは知ってもしょうがないと思うので割愛します。
それでは各処理群を一つ一つ見ていきます。
6. 開始とループ処理

中央左下あたりの処理群です。
Aボタンを押すと開始するようにして、くらべるノードンを挟んで
「1度だけ」カウントダウンとゲーム開始を行うようにしてます。
開始したら勝敗が決まってない間は常に1秒ほど「せーのっ」を画面上に
ワープさせて表示、次に矢印を出しています。矢印表示はここにはないので
後ほど。
スクショ右下に見えるのは勝ったときに表示させる文字です。
見えないですがその下に負けた時に表示させる文字があります。
7. ゲーム画面と矢印出現処理

表示されるゲーム画面部分です。
一番いろいろ重ねまくってます。
とにかくワープさせるものが多いため、モノをワープノードンとそれに
紐づくさわっているセンサーノードンをかなり重ねて置いてます。
これで文字や矢印の表示を管理しています。
あとは説明文と勝利演出、敗北演出、見えづらいですがHPとそれを減らす
ためのワイヤーワープ出口ノードンが画面うえにずらっと並んでます。
次に注目してほしいところは中央上の緑のタイマーノードンです。
「せーのっ」が表示されたら1秒カウントし、「せーのっ」を画面外の元の
位置にワープ、スクショ右にあるランダムノードンが実行され、出す矢印を
決めます。

これが表示させる矢印全4種です。
上から伸びてる線が先ほどのランダムノードンで、1~4の数値が生成され
ます。で、生成された数字に応じた矢印をワープさせて表示、といった具合
です。この矢印らも1秒ほどで画面上からワープさせる処理を入れてます。
8. 操作処理

中央右にある処理群。
各矢印が表示されてる中、Joy-Conを適切な方向に振った場合、敵のHPを
減らすといった部分です。
表示されてる矢印に対して、Joy-Conを正しく振れたかをANDノードンで
確認しています。
注目してほしいところはワイヤーワープノードンRで、どの方向でも
正解だったら同じ処理をさせるためにこのような使い方をしています。

9. 敵のHP減少処理と勝利判定

中央右上の処理群。
矢印が表示されてる最中に正しくJoy-Conを振ってるタイミングのみ処理が
動きます。今のHPと定数を比べて、HPゲージを削ります。
ANDノードンの右につながってるワイヤーワープ:入口ノードンがHPゲージを壊す処理へ、たくさんつながってるXは敵に対しての被ダメエフェクトに
つながってます。
注目してほしいところは1秒のタイマーとフラグノードンをちょくちょく
挟んでる部分です。これらがないとHPが減った際にまだ矢印が表示されて
いれば続きを一瞬で処理され、HPが2以上減ってしまいます。

こちらが1から減った時、つまり勝利判定処理になります。
勝利演出を出しつつ3秒後にゲーム終了させてます。
10. 敵のHPと自分のHPゲージ減少

中央上の処理群。
最下段一行が自分のHPゲージを削る処理、それ以外が敵のHPを管理してる
部分です。
モノがこわれたしゅんかんノードンで、敵のHPゲージに紐づいている球を
監視して、検知したら先ほどの敵HP減少処理へ、壊れず2秒経過したら
失敗したと判断してプレイヤーがダメージを受ける処理になっています。
ちなみになぜ2秒かというと、せーのっで1秒、矢印で1秒表示に使ってる
からです。なので矢印が消えたタイミングで敵にダメージを与えたかどうか
で、プレイヤーへダメージを入れるかの判断をしています。
この左に自分のHPを管理してますが、敵のHPと同じような感じなので
割愛。
11. 自分のHP減少処理

中央左の処理群。
敵のHPとは違い、Joy-Conを気にする必要がないのでちょっと見やすくなっ
てます。それ以外はやってること変わってないです。

こちらがプレイヤーのHPが1から減ったとき、負け判定処理です。
演出が異なるだけで勝ちと同じ動きになります。
ノードンの説明はこんなところです。
12. 実装しなかったもの
あげた作る機能の中の、制限時間カウントと8択は実装してません。
制限時間は単に不要だと思って辞めました。
中央上に変な空間があるのはその名残ですね。
8択という項目は作らなかったというよりソフトの仕様上できませんで
した。この8択というのが何かというと矢印のパターンです。
実装済みの上下左右で4つ、それとは逆の方向に振る4つというのを
想定していましたが、モノをワープノードンが最大8個までしか設置
できず、通常矢印をもとの位置に戻すためワープで4つ、せーのっと勝利
文字敗北文字のワープで3つ、それぞれを中央に設置させるためのワープで
1つと、4択の時点でフルに使ってしまいました。
これで8択はモノをワープノードンが足りないため断念しました。
文字系は上からスライドさせるなど、ワープさせない案を試みたんですが
うまくいきませんでした。
まぁ現状でさえゲーム画面ごちゃごちゃなので、作っても気づきにくい
不具合できてた可能性ありそうなので、これでよかったのかも。
13. 致命的な見落とし
完成直前に想定外のことが起きました。
矢印と逆の方向に振っても成功判定していることに気づきました。
普通にミスして不具合作ったかなと思いつつも、そこの判定で見落とす
ところあったか?とも思いつつ調べたところ、やはりそれらしいものは
見つからず。
でも意図した結果になってないので、これは何が起きているのかと頭を
悩ませていたところ有識者の方から以下のページを教えていただきました。
要約すると、Joy-Con内の加速度センサーが振って止めた際に
慣性により反対方向にも反応していると思う、とのことでした。
これはこっちで作るプログラムじゃどうしようもできないし、
Joy-Conを振る操作を行うと必ず発生する事象です。
知った時には自分の力量を改めて思い知ったというか
相変わらず調べが足りないなと思いかなりショックでした。
そういうのは仕事の時だけにしてほしい。
いや、仕事でそれやる方がまずいか。
というわけで仕様変更。
操作方法は変更したくないので、Joy-Conを2つ使うようにして
左手側は上と左を、右手側は下と右を判定するようにして
今回の問題点を気づきにくいようにしました。
完全な方法ではないし小賢しいですが、肝の部分は変えたくはなかったので
こんな形です。
そういう判断も特には必要。だと思う。思いたい。
14. さいごに
反省点としてはハードでできること、制約等を洗い出す及び把握することが
できてなかった点ですかね。
普段はスペックやOS、想定するコントローラは確認しますが、Joy-Conの
ことは完全に勉強不足でした。
多分画面タッチ操作もわからないことあると思います。
仕事外で経験できてよかったかも。
そして個人的にこのソフトを使って一番良いと思えることは
ゲームの完成からリリースまでの流れをほとんど体験できるうえ
達成するまでのハードルが低いことだと思ってます。
創作って基本なんでも大変だと思いますが、ゲームはプログラム、絵、音、
文字、場合によってはシナリオ、動画、3DCGなど、いろいろなものの
集合体なので、完成させるのはより大変って印象があります。
それを比較的楽に行え、成功体験を得られるということは
今後モノづくりをするうえで大きな自信になると思います。
ちなみに本格的に作るとなったら上記に加え、画像や音周りも自分たちで
作ったり利用したツールの権利関係の確認や公開ストアに必要なスクショ
や説明文の用意、有料なら口座の用意といったことが必要になってくるかな
と思います。
あと英語できると何かと都合いいです。
とにかくこのソフトを利用してでも、ゲームを作ってみませんか。
ゲーム作りはいいですよ。いいからやりましょう。Do it!
私も今作ってるのもいい加減完成させなければ。
最後にもう一度作成したゲームのゲームIDを載せます。
ゲームID:G 002 MHT TK0