ロゴ ロゴ

ゲーム作りは計画的に

はじめに

Den3GameJamの期限が終わってから1週間が経ってしまいました。どうしてこんなに遅くなったかというとGameJamの期間が終わってからも開発を続けていたからです(テーマ発表から「1週間でゲームを作るという」意味が…)。

申し訳ありません。

作りたかった

今回のDen3GameJamのテーマは「テトリス+α」でした。ですが結果は…
正直に言えばうまくできませんでした。何がいけなかったかを少々書いていきます。

一列は消せるけど…

一列そろったらブロックが消えて、上から落ちてくるブロックを左右に移動させたり回転させることで配置できるようになりました。しかしブロックが消えてからそれよりも上の列のブロックが落ちてきません。

上の画像はL字がすでに積まれたブロックであり、本来ならこの下の段に落ちるようにならないといけなかった。

実装するなら消えた列は何列目なのか、最大で同時に4列まで消せるため何個列が消えるかを記録をする必要がありそうです。積み上げられたブロックは二次元配列を扱うGridで管理されていて、左上から右下に向けて配列の中身を判定して描画しています。列が消えたら数値を要素数が小さいほうから大きいほうに移動させます。全くブロックを積まれていない列もあるでしょうが、移動させるためには消した列より上のブロックのすべてを移したほうが効率は悪いが処理の記述は単純になると思います。

上から下にかけてブロックをOpenSiv3Dで提供されているデータ構造であるGrid型のデータを用いて描画していましたが、下から上に向けて描画したほうが画面の動きとデータの操作がかみ合って分かりやすかったかもしれないです。またArrayを使っても良さそうです。

まず下から描画、つまり一番下の段(正確には下から2段目)が一列消えるとすると配列から削除され、データがあった箇所が空きます。
そして削除された列より上の段に相当するデータがスライドして連続したデータとして再び使えるようになります。
消した数の列を配列に追加することでブロックが落ちているように見えます。
配列に追加するときは配列の一番後ろになるため描画するときは一番上の列になります。

ブロックの底はどこ?

ブロックにはいろんな形があります。正方形・L字・T字・棒が主な形です。正方形・棒なら底面が平らなので大丈夫ですが、L字・T字はでこぼこするので底面が平らではありません。
ここで問題が起きました。

この画像ではうまくはまりそうな形なのにそれよりも上で止まって浮いてしまった例です。
まずこのブロックは4×4の配列を一旦すべて”0″で初期化してブロックを形成する(当たり判定を適用させる)ために”1″を上書きします。
1つのブロックを形成するのは4マスとして、ブロックの底面はブロックの中で一番下のマスの高さを基準としました。

この場面の対処法は4×4のブロックなので底面の高さの座標を1つではなく4つ持っておくことでしょうか?

ここは自分で考えても悩みどころです…

行き当たりばったり実装

今までOpenSiv3Dの便利さに助けられてきました。増えるがテーマだったときは具体的に満たさないといけない条件が少なく何とか形にはできましたが、今回はテトリスというかなり完成されたゲームを題材にする必要がありました。Unity等のゲームエンジンを使っていても同じ話だと思いますが、作りたいゲームにはどのようなデータが必要か、どのようにデータを操作すれば望んだ結果を実現できるかの計画を立ててからプログラムを組み始める必要があると感じました。ブロックが「落ちる」、「回転する」、「横に移動する」、すでに積まれているブロックに「ぶつかる」、ブロックが消えたら「列をつめる」。これらの要素をほとんど思い付きで処理を追加していきました。今回の失敗はプログラミング言語の知識不足というよりも、ゲーム開発の手順を間違えてしまったのが原因のように考えています。

ゲーム開発に限らず、ソフトウェアを開発するときはいきなりプログラムを書き始めるのではなく、必要な要素を書き出してからその要素・操作は本当に必要かを考える方が良いです。

さいごに

どんなにゲームエンジン・ライブラリが高機能でもそれをプログラムに落とし込むための手順を適切に踏まないと無茶苦茶になりゲーム開発が未完成で終わってしまうことを痛感しました。

コメント入力

関連サイト