Nibiruman:2080 Postmortem

2020年6月8日

fantasy console gamedev Lua TIC-80

t f B! P L

TIC-80で小さなゲームを作る

TIC-80で小さなゲームを作ったので、更新内容とか見直してメモです。TIC-80のメモリを読み書きしたり、SCN(),OVR()使って、fantasy consoleっぽいことは、ほとんどやってないです。Luaは少し書けるようになったけど、また書かなくなったら、すぐ元通りに戻っちゃうと思う。だいたい一か月くらいLua書いたり消したりしてました。作ったゲームは以下です。

調査とチュートリアル

hello worldのカートリッジから始めた。zombie.ticから作成したので、ゾンビ倒すゲームつくる気持ちだったっぽい。いつも通りツインスティックシューターを作ろうとして、TIC-80スティック2つないしなぁと思いながら、TIC-80ですでに作られていないか調べたりしてた。マウスが使えるのでマウスでエイムする操作にすることにした。

Entity追加

Entityをリストに登録して、リストのEntityのupdateとdrawを回すmanagerを作成し、playerとmouse位置のEntityを登録した。Luaのoopをどう記述していいのかわからなくて、たくさん検索した、今でもよくわかってなくて、継承の記述は行き当たりばったりになってる。

Entityの削除対応

打った弾が消せるようになった、Entityにフラグ追加して、削除フラグが立っていたら、リストからremoveするようになってる。Vec2を追加したりした。

verlet integrationのテスト

敵キャラ同士もcollision detectionやりたいけど、どれだけ敵を出して動かせるか試してる。あと画面にどれくらい出すと、密度感でるか見てる。別のカートリッジ追加して試した。お互いcollision detectionやって、500体くらい出しても大丈夫そうだったので、作れそうかなと判断した。collisionのブロードフェーズはどうするかいろいろ動かしてみた。最初、sweep and pruneを探してきて試したけど、パフォーマンス出なかったのでやめた、Entityは毎フレーム位置の変動があるので、ソートでO(nlogn)かかってたと思う。SpatialHash uniform-grid試して、それを使っている、これはさらに後で、collisionのリストの処理がやりづらかったので、別のを使ている。ゲームエンジンのLoveのライブラリが割と少し直すと使えるものが多いと感じた、PICO-8はLuaのライブラリそのまま動かないみたいなので、TIC-80はこのあたりは有利っぽいかなと思った。

ランダムマップ

今回壁の衝突をちゃんととろうと決めていた。スクロールなしの1画面で全部敵を倒したら次のwaveにしようと考えていたようだ。

コリジョン応答

verletを組み込んで、ステージコリジョン対応しようとしている。コリジョン応答をいれた。壁との応答とるとやっぱり重い。あとmoving circle vs AABBでとらないとまともにならないっぽいので、ステージは単純な形状で、壁やめることにした。

robtronの影響

カートリッジを別にした、tictron.tic,robtronの影響。BGのスクロールをやったりした。TIC-80のチュートリアルを参考にしたけど、自分のはスタート位置が原点で、負の方向にも移動するようにしたかったけど、負の値の方に対応されてなくて、結局自分でまじめにやった。でも完璧でなくて、スプライトの表示とBGが少しずれる場合があるけど、どうせキャラずっと動いてるでしょで、修正してない。

タイトル追加

Nibirumanは、惑星ニビルから、設定とかなくて適当。モードはマネージャーで実行するcurrentのclassを書き換えて切り替えるだけ。ゲームとタイトルの2モードしかない。

spawner

spawnerを追加。coroutineのリストを作って、登録したcoroutineを順次実行していく、spawnのシーケンス終わったらリストから削除されて破棄される。フレームで複数同時に動かせる。matrixを渡して、2d座標をtrans, rotationできるようにして、単純な生成を組み合わせができるように。この辺から、プログラムの文字数が苦しくなてきてる、インデントをspace2からtab2に切り替えた。

ダッシュのシステム

humanや矢印のenemyなんかを加えた。ダッシュのシステムを追加。領域にはいっている敵はadd forceで追い出すように。

2重スクロール

背景どうしようかなやんでる。2重スクロールやってみたけど死ぬほどみにくい。

カメラ

カメラのcontrolをかえた、lerpするようにしたり、端はlimitつけたりするように。

パーティクル

パーティクル追加したり、エネルギーdot追加したり。パーティクルは、pix()関数で、ピクセル打ってるだけ、colorのフェードもかけてないし、だいぶ手抜き。エネルギーdotは雰囲気でいれてる。この段階ではなにに使うかとか考えてないよね。背景の見づらさやばい。

ボス

ボスのEntityを追加した。とりあえずいれてる感ある。

透視変換

タイトルをまともにしようとする試み。流れる星にした。ゲームプログラマなら透視変換そらで書けるよねって思いながら、Qiitaとか見てた。

shake

カメラのshakeいれた。解像度低いし演出そんなにできないけど、画面揺らすの効果的。PICO-8にはカメラがあるみたいだけど、TIC-80には特にそれがないっぽい。スクロールさせる段階でカメラ追加しといてよかった。

dashを強く

背景をなおしたり、ダッシュをまともにつかえるようにしようとしている。ダッシュは移動中も敵を轢き殺せるようにして、最後停止時にダメージ与えるように、あと停止時に慣性いれすぎてたのを大分削除したりした。

textri

矢印はtextriでかくようにした。textri、回転の表示はあまりきれいでない。

animation

dotのキャプチャとかスコアの倍率とかいれた。キャラのアニメーションをまともにした。データつくるの苦手。唐突に始まるので入りの演出とかいれた。

キーリプレイ

キーリプレイをいれようとしてる。gifアニメをとるのにいい感じのところとれるようにするためとか。Luaは現在のrandomのseed値がとれないっぽいかよ。Luaからxorshiftの乱数とかを生成した方が融通ききそう。次があればそうする。

調整

新しい敵を入れたりした。ダッシュをつかわせたいので、ダッシュのダメージの耐性をさげてショットに対しては固い敵を追加。ダッシュでひき殺せて、爆風で殺せる。SEも追加した。データつくるの苦手。BGMは無理だった。データつくるの苦手。
難易度をいれた。難易度曲線でぐぐったけど、ゲームの進行と、難易度の関係式をみんなどうしてんのか知りたかったけどわかんなかった。結局線形で、特定のイベントで下げる、ゼビウスっぽい制御だった、何年前のだよ。スクショいいところとりやすいように、ポーズできるようにとかした。ダッシュをさらに強くしたり、最終調整したつもり。ボスのパフォーマンスは調整しきれてない。弾いっぱい打つところ、お互い衝突判定とってないのになんで重いんだろう。単に数が多い?でも5-600ぐらいなんだけど。

結論

一通り手がつけれた、TIC-80では大きなプログラムは組めないので、ある程度のところで、あきらめがつける。解像度が低いのでデータ作るのが苦手でもそれなりにできる気がする。BGMが作れないのはつらい。とりあえずでも完成させたのはえらい。実はこれは3Dで作っていたものから要素を差し引いたもの、2Dやfantasy consoleの制約のおかけで、発散しすぎないで、完成できたのかも。fantasy console,結局32bitのfloatで計算してるし、メモリも結構使っちゃってるのを考えると、8bit風の見た目とかなんなんだろうって気がする。collisionの判定を自分でかいたり、physics自分で書いたり、わりと計算自分でしないといけないのを考えると、TIC-80でゲーム作るの、unityで作ったりするより難しいかもと思ったけど、どうなんだろう。あと、マウスの二つのボタンでショットとダッシュになっているけど、Macの人はボタン一つしかないので、遊べないといまさら気づいた、操作直そうかな。

QooQ