見出し画像

Pyxelでゲーム開発「ブロック崩しを作ってます」

作り始めて10日経ちました。
ゲームの中身はだいぶ固まってきましたが、まだ挙動不審なところがあるので公開はまだまだ先の模様です。

ブロック崩し作りそのものはそんなに難しくはありません。
ただそこにあるものをプラスアルファすると難易度が上がります。

・壊れないブロックの存在
・玉の速度が増加

壊れるブロックのみなら当たれば消せばいいだけなので何も問題はありません。当たっても残っていると言うことは当たった後の動作も考える必要があります。また、ブロックが壊れないと言うことは、玉がブロック同士を行き来して帰ってこない問題も発生する可能性があります。

そして玉の速度が増加、そう、いわゆるすり抜け問題。増加しなくてもすり抜け問題は発生しますがそんなに気にするほどでもありません。ブロックの形状以上のスピードはもちろんですが、斜めに横切った場合など、当たっているはずなのに当たってない問題が発生します。

Pyxelは、レトロゲームエンジンと名乗っていますが、その実、
・容量に制限が無い
・今時のPC上で動くので大量の計算を要しない限りは速く動作する
という利点があります。
(ハンドヘルド機上で動かした場合はその限りではないと思いますがそのあたりの検証結果が不明なのでここではあえて触れません。)

なので気にせず、サインコサインも平気で使わせてもらってます。
(昔の作り方では、テーブル使って計算も簡略化して見た目勝負な世界でしたが、いい時代になったものです。(遠い目))

話はそれましたが、上記踏まえての「ブロック崩し」の作り方なんぞを説明します。ただし、「作り方」とはいえ10人のプログラマがいると10個のプログラムが存在すると思うのであくまで参考程度に、考え方だけは参考になるかなと思います。

ゲーム画面でのブロックの並びは、横方向に何個、縦方向に何個と並べます。ブロック形状は全て同じ場合、玉の座標とブロックのサイズからどこのブロックにいるかがわかるのでヒットチェック、および、周辺のブロックの情報はすぐに取得できます。
(対象ブロックが移動している場合はまた別の方法を取りますがここでは説明を省略します。)

一発で壊れるブロックならこのまま反射させればいいかと思いますが、壊れないブロックの場合、ブロック内部に玉が入り込んでいる場合があるので、一旦ブロックの外に出してから反射させます。いわゆるめり込み外しですが、この方法にもいろいろありますが一番簡単な方法は当たる前に戻してやれば良いかと思います。(玉の移動速度が速い場合は違和感ありますが、速度が速いと誤魔化しが効くこともあります。)

ブロックの斜めから当たった場合の反射のさせ方(一例)
周辺ブロックを参照して移動方向を決定します。

反射に関して以上となります。
次にすり抜け問題。

一番あり得るのが下記の状態

玉の速度が速い場合は下記のように抜けてしまうので、

速度を分割して細かくチェックしていきます。
分割方法はいろいろありますが大雑把に説明すると、

下記の図において、
速度を分割させて分割させた速度で移動させてチェックしていく。
分割した線分の長さは① = ② = ③ = ④、、、
①を移動した先①'でチェック
②を移動した先②'でチェック
③を移動した先③'でチェック
③'で該当BLOCKに当たる
座標を②'に戻すことによって当たらなくなるのでそこで反射速度を設定する

この方法であればブロックのめり込み外しも同様に実現できます。

ブロックとのヒットチェックは以上。
次にパドルとのヒットチェック。
パドルは玉が当たる位置によって移動方向を変えます。

考え方の一例

こう考えるとすり抜けもめり込みもあまり深く考える必要はありません。
パドルの高さが変わらないことが条件ですが。

これ以外には枠とのヒットチェック、お邪魔敵がいればそれとのチェックもありますが、そのあたりはシューティングゲームのヒットチェックと変わりないのでここでは省略します。

玉がブロック同士を行き来して帰ってこない問題に関しては、パドルに当たらずブロックに当たった回数が一定回数以上だった場合の反射時、反射角度をちょっと加減算してやることで抜け出すことができます。

最後に今のPyxel Blockの現状公開

Pyxel Block

面作りとかいろいろ問題は残ってますが、飽きずに作り続けられればそのうち公開できるかもしれません。



いいなと思ったら応援しよう!