繋げて動く

PICO-8 チャレンジ 第25回 Lua
PICO-8 チャレンジ 第25回

PICO-8でスネークゲームをつくっています。

テーブルを使って、位置と向きの情報を管理し更新していく為、自分で考えていた方法がうまく行かず、原因を調べていました。

そこでわかったのは、テーブルの変数名同士をイコールで渡すと、内容のコピーではなく、参照アドレスを渡すことになり、テーブルの変数名こそ違えど、実態は1つで、同じものを指しているのです。

Luaのテーブル アドレス渡し
Luaのテーブル アドレス渡し

上のコンソールからの実行結果を見てください。

TBとTBBという二つのテーブルを用意し、TB=TBBとして代入すると、テーブルの内容をコピーするのではなく、そのテーブルを参照するアドレスを代入することになるのです。

つまり、この場合だと、TBBのアドレスをTBに代入することになります。

その証拠に、その後実行されているTB.X=256を実行したあと、TBとTBBのXの内容を表示すると、どちらも256と表示されます。

TBとTBB二つのテーブルが存在しているなら、TB.X=256としたなら、TBのテーブルのみが更新されて、TBBのキーXの内容は存在しない(NIL)となるのですが、同じ様にTBBのテーブルも更新されているのです。

この事がわかったので、自分の頭の中で考えていた事と、実際にLuaで実行されていた動きは違っている事を理解しました。

という事で、違うアプローチでテーブル管理と更新をする事にしました。

テーブルをバッファ用に別に作らず、一つのテーブルの最初と最後を削除と追加することで、実現させました。

この方法は、以前他の人が作ったスネークゲームを解析したときに、学んだやり方です。

_init()内でのテーブルの初期化
_init()内でのテーブルの初期化

これは、_init()内で行うテーブルの内容を初期化するコードです。

SLはヘビの長さ(単位はキャラクタです)、SXとSYはヘビの先頭の座標です。

_update()内で、テーブルを更新
_update()内で、テーブルを更新

_update()内でテーブルを更新します。

ADD命令で、新たな座標(ヘビが進んだ時の先頭座標)を加えます。

その後、移動したために最後の座標が不要になった為、一番最後の座標をDEL命令で削除します(都合上、テーブルの順番とヘビの座標の順番は真反対になっており、ST[1]とテーブルの一番始めが削除の対象になっています)。

この様にすることで、テーブルの要素の1つを追加と削除するだけで、テーブルの更新が済むのです(初めこのやり方を知ったとき、目からウロコでした)。

その実行結果がこちらです。

スネークゲーム ヘビの動き
スネークゲーム ヘビの動き

自分はこの動きが面白くて、しばらく動かして遊んでいました。

これで、ヘビの動きを実装することが出来たので、敵やターゲットの実装に移ります。

実装動画はこちらです。

コメント

タイトルとURLをコピーしました