PICO-8でスネークゲームをつくっています。
テーブルを使って、位置と向きの情報を管理し更新していく為、自分で考えていた方法がうまく行かず、原因を調べていました。
そこでわかったのは、テーブルの変数名同士をイコールで渡すと、内容のコピーではなく、参照アドレスを渡すことになり、テーブルの変数名こそ違えど、実態は1つで、同じものを指しているのです。
上のコンソールからの実行結果を見てください。
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()内で行うテーブルの内容を初期化するコードです。
SLはヘビの長さ(単位はキャラクタです)、SXとSYはヘビの先頭の座標です。
_update()内でテーブルを更新します。
ADD命令で、新たな座標(ヘビが進んだ時の先頭座標)を加えます。
その後、移動したために最後の座標が不要になった為、一番最後の座標をDEL命令で削除します(都合上、テーブルの順番とヘビの座標の順番は真反対になっており、ST[1]とテーブルの一番始めが削除の対象になっています)。
この様にすることで、テーブルの要素の1つを追加と削除するだけで、テーブルの更新が済むのです(初めこのやり方を知ったとき、目からウロコでした)。
その実行結果がこちらです。
自分はこの動きが面白くて、しばらく動かして遊んでいました。
これで、ヘビの動きを実装することが出来たので、敵やターゲットの実装に移ります。
実装動画はこちらです。
コメント