メインコンテンツへスキップ
見出し画像

ChatGPTがあればGameMakerでマリオ64DSのミニゲームを作れるのか

    こんにちは。
    前回ChatGPTの力を借りながらGameMakerでブロック崩しを作りましたが、もうちょっと凝ったミニゲームを作りたいと思うようになりました。

    そしてミニゲームと言えばスーパーマリオ64DSのミニゲーム集。かつて私はこれを夢中になって遊び、そして画面保護フィルムの必要性を認識しました。みんなそうですよね。

    今回はそのうちの私が特に熱中した二つのゲームをGameMakerで再現したいと思います。

    1.ジャンピングマリオ

    上から降ってくる3人のマリオ達をタッチでジャンプさせ、画面下で飛んでいるヘイホーを踏ませる、というゲームです。
    スーパーマリオ64DSはDSのローンチタイトルだったので、当然のごとくミニゲームにもタッチ操作がふんだんに盛り込まれています。

    私がこれを最初に作るゲームに選んだのは好きなゲームだから以外にも理由があります。
    オブジェクトの少なさ(たったの2種類!)と、操作の単純さです。

    ブロック崩しの次のステップにぴったりですね。

    ではまずは事前準備です。
    スプライトを書き、オブジェクトに割り付けます。

    画像
    誰が何と言おうとマリオとヘイホー

    これでobj_marioとobj_heihoが出来上がりました。
    ではchatGPT、出番です!

    画像
    仕様を全部書く

    この後すぐ出力されたコードは全てcreateイベントとして書かれていたのですが、ぱっと見stepイベントに書くべきものが含まれているように感じたので再考してもらいました。
    chatGPTにコードを書いてもらうということは、『chatGPTがコードを書く→コピペする→実行する→エラー発生→エラーの状況を伝える→chatGPTがコードを書く→コピペする→実行する→エラー発生』を繰り返す作業であり、その内だんだん「あれ、このコードって前stepで書いてなかったっけ」くらいのことは分かるようになってきます。

    画像
    画像

    今度はぱっと見よさそうですね。イベントもいい感じに分けられているようですし。

    実行!

    画像
    ただただ飛び跳ねるだけのマリオ

    クリックしても真上にしか飛びませんね。クリックする位置によって飛ぶ位置をコントロールすることがジャンピングマリオの味噌なので、ここは外せません。

    画像

    obj_marioのクリック位置が中心からどれだけx方向にずれているかを判断し、hspd(水平速度)の値が正か負かを決定する、といった内容のようです。
    さてこのコード、結論から言うと問題が二つあります。

    一つはhspd変数がそもそも定義されておらず、正とか負とか以前の問題であること。
    二つ目はhspdを定義したところで、その値がobj_marioの位置変更に影響を与える記述がないことです。

    一つ目についてはGameMaker側でエラーメッセージが出るので、それをchatGPTに見せたら解決したのですが、問題は二つ目、意味のない変数を定義しているだけなのでエラーが出るでもなく、ただただマリオが上下に動くだけのゲームになってしまっています。

    これについてchatGPTに、マリオが左右に動きません!と何度も言っても一向に解決してくれませんでした。すみませんすみませんと言いながらずっと同じコードを出してきます。

    最終的には私がobj_marioの位置変更にhspdが絡んでないことに気が付き、そこを指摘することでようやくchatGPTがコードを直してくれました。

    結局のところchatGPTを使っているからと言って、コードを読めなくてもいいということにはならない、ということでしょうか。まぁ、人生ってそんなもんだよね……。

    それでできたゲームが以下。

    ヘイホーを全滅させたらGameClearのダイアログボックスが出るようにしてもらって……完成!

    画像
    お~!

    そうそうこんな感じ!これは誰がどう見てもジャンピングマリオでしょう!

    2.ボム兵パチンコ

    中央値に設置されたパチンコを打って、空から降ってくるボム兵からハナを守るゲーム。
    必要となるオブジェクトは、以下の三つ。
    落ちてくるボム兵、守るべきフラワー、パチンコの球

    画像

    ゲームを作るにあたって特に難しそうなのはパチンコの球の挙動です。
    パチンコの球は最初空中に静止した状態であり、ドラッグで引っ張って離すと、引っ張った距離と方向に応じて飛んでいく。飛んでいる最中は重力の影響を受ける。
    この仕組みを作る必要があります。chatGPTが。

    画像
    重力の条件を入れるのを忘れた

    最初は「ドラッグした方向の逆方向に飛んでいく」といった指示の出し方をしていたのですが、chatGPT的には曖昧過ぎたようでうまく解釈してくれませんでした。
    (マウスの現在位置と球の現在位置から球を飛ばす方向を決定しようとしていたが、そもそもドラッグ中はマウスと球の位置関係は同じなので、常に同じ方向に球が飛んでしまう)
    その反省を受けてより誤解なく定義できるように、球の初期位置とドラッグ終了時点の球の位置から方向を決定するように指示を書き直しました。

    画像

    重力のことを忘れていたので指示としては足りていないのですが、パチンコの仕様については二、三回のリトライで驚くほどうまくいきました。よし、あとは球を飛ばした時に重力の影響を受けるようにするだけ!簡単簡単!

    と、思っていたのですが。chatGPT君、何故かこの指示を受け付けてくれません。何度リトライしても球が配置された時点で重力につかまって落ちてしまいます。

    私のイメージとしては、
    ドラック前は動かない→ドラッグされたらマウスに追従する→マウス左ボタンが離されたら重力の影響を受ける
    といった感じにしたいので、ドラッグ終了時のif分に重力の項目を入れればいいんじゃないかと思っていたのですが、それをやると飛んだ球が重力の影響を受けないんです。
    ドラッグ終了タイミングは一瞬しかなく、そこに重力の項目を入れたところで一瞬しか重力が働かないので意味ない、とかかな……。

    ここにきて私のコード読み能力の無さが重くのしかかりだしましたが、まあいろんな抜け道がある物で、とりあえず球が画面中央にある場合に限り重力が働かないようにしました。
    初期配置された球は必ず画面中央にあるので、ドラッグによって位置がずれるまで重力の影響を受けないということですね。あんまり綺麗なやり方ではないですが……。

    後はボム兵スポーンオブジェクトを画面上に配置し、花に向かって落ちてくるようにします。これはすぐに描いてくれました。

    後は花が全部消えたらGameOverのダイアログボックスを表示するようにすれば……。

    画像
    そうそう!こういうのこういうの!

    ただボム兵が必ず左から順に花を狙うのと、球を飛ばす前にも判定があるのが残念ですね……。
    これも直しちゃいましょう。

    フラワーのターゲット設定についてchatGPTに聞いたコードを組み込み、衝突判定に先ほどの重力と同じ条件設定をして……。

    画像

    完成~~~~~!

    と、いう訳で、

    結論:ChatGPTがあればGameMakerでマリオ64DSのミニゲームを作れる!

    おわり

    あなたへのおすすめ