2018/11/16(金) [n年前の日記]
#1 [tic80] TIC-80でシューティングゲームっぽいものを書いてみる。その2
先日、TIC-80上で動く横スクロールシューティングっぽいモノを書き始めたけれど、アタリ判定もつけてみた。
ブラウザ上で動かしたいなら以下。
_stgsample5.tic.html
操作方法。
ブラウザ上で動かしたいなら以下。
_stgsample5.tic.html
操作方法。
- Move : Cursor key (UP, DOWN, LEFT, RIGHT)
- Shot : Z key (keep holding down)
◎ ソース。 :
ソースは以下。長くなり始めたので Gist にアップロードしてみた。
_TIC-80 shoot 'em up sample
スプライト画像は以下。
_sprites.gif
ソースも画像も、CC0 / Public Domain ってことで。
ちなみに。
_TIC-80 初心者講座: マップ・スプライト画像を画像ソフトで描いて取り込もう - Qiita
_TIC-80 shoot 'em up sample
スプライト画像は以下。
_sprites.gif
ソースも画像も、CC0 / Public Domain ってことで。
ちなみに。
- export sprites で、スプライト画像のエクスポート。
- import sprites で、スプライト画像のインポート。
_TIC-80 初心者講座: マップ・スプライト画像を画像ソフトで描いて取り込もう - Qiita
◎ ソースの簡単な解説。 :
アタリ判定は、hitcheck()、hitcheckCirc() で処理をしている。
判定の仕方は色々あるけど、今回は、点と点の距離で判定。
アタリ判定用のデータは、 _DXRuby Sprite#collision= を参考に、{x,y,r} を各クラスで持つことにした。
ちなみに、Lua で、テーブルが空かどうかを判定する際は next(テーブル名) が使えるらしい。
_Lua ちょっとしたコードチューニング - Qiita
function hitcheckCirc(e,b) if not next(b.collision) then return false end local x,y,r x=e.collision[1]-b.collision[1] y=e.collision[2]-b.collision[2] r=e.collision[3]+b.collision[3] if x*x+y*y <=r*r then return true end return false end function hitcheck() -- enemys vs bullet for i,e in ipairs(enemys) do if e.alive and next(e.collision) then for j,b in ipairs(bullets) do if b.alive and hitcheckCirc(e,b) then e:hit(b) b:shot(e) break end end end end if player.alive==false or not next(player.collision) then return end -- enemys vs player -- ... -- enemy bullets vs player -- ... end
判定の仕方は色々あるけど、今回は、点と点の距離で判定。
if x*x+y*y<=r*r then return true end return false敵と弾、敵と自機、等、x座標とy座標の差が得られれば、 _三平方の定理 で距離は求められる。式に平方根が入ってくるけど、今回は正確な距離を求めたいわけじゃなく、任意の距離より近いか遠いかを知りたいだけなので、判定に使う距離を二乗して比較に使えば平方根を求めなくて済む。
アタリ判定用のデータは、 _DXRuby Sprite#collision= を参考に、{x,y,r} を各クラスで持つことにした。
ちなみに、Lua で、テーブルが空かどうかを判定する際は next(テーブル名) が使えるらしい。
_Lua ちょっとしたコードチューニング - Qiita
[ ツッコむ ]
#2 [tic80] TIC-80用のソースコードを外部エディタで編集したい
TIC-80は、エディタ、スプライトエディタ(ドットエディタ)、マップエディタ、サウンドエディタ、ミュージックエディタ ―― 全部入っているので、気軽に触り始めることができて便利なのだけど。しかし、エディタが貧弱なので、せめてソースコードを外部エディタで編集出来たらな、と思う時があって。
まあ、お金を出してPro版を買えば、外部エディタで編集することもできるらしいのだけど。そこらへん、無料版でも、ちょっとはどうにかならんか…。
と思ってググっていたら、「ソースコードの一行目に dofile("game.lua") と書けば game.lua を読み込んで使えるよ」という話を見かけて。
_Add the ability to export/import the game code so it can be edited externally - Issue #85 - nesbox/TIC-80
_TIC-80さんのツイート: "TIC tip: if you place your game.lua file near TIC exe, add dofile('game.lua') to the code you can edit game in your favorite editor
なるほど…。その機能を使えば、.lua ファイルを外部エディタで編集できそうだなと。
注意点としては…。
更に、以下によると「dofile() は非推奨」と書いてあるので、いつまでこの機能が使えるのかは不明。
_Time Tripper: TIC-80の新バージョン(0.50.0)がリリースされました。
まあ、お金を出してPro版を買えば、外部エディタで編集することもできるらしいのだけど。そこらへん、無料版でも、ちょっとはどうにかならんか…。
と思ってググっていたら、「ソースコードの一行目に dofile("game.lua") と書けば game.lua を読み込んで使えるよ」という話を見かけて。
_Add the ability to export/import the game code so it can be edited externally - Issue #85 - nesbox/TIC-80
_TIC-80さんのツイート: "TIC tip: if you place your game.lua file near TIC exe, add dofile('game.lua') to the code you can edit game in your favorite editor
なるほど…。その機能を使えば、.lua ファイルを外部エディタで編集できそうだなと。
注意点としては…。
- tic80実行ファイルが置いてあるフォルダ(ディレクトリ)に .lua を置いてないと読み込めない。らしい。
- リリースする際は、カートリッジ(.tic)にソースコードを含めておくこと。うっかり分離したまま配布して「あのー動かないんですけど」と言われたりしないように。
更に、以下によると「dofile() は非推奨」と書いてあるので、いつまでこの機能が使えるのかは不明。
_Time Tripper: TIC-80の新バージョン(0.50.0)がリリースされました。
◎ 試してみた。 :
とりあえず試してみた。環境は Windows10 x64 + TIC-80 0.70.6。
任意のディレクトリを作って、以下のようなファイル構成にして。
DOS窓を開いて、そのディレクトリをカレントディレクトリにして。(cd C:\hoge\fuga)
コマンドラインオプションをつけて、TIC-80を起動。
_Home - nesbox/TIC-80 Wiki
load stgsample5 で、カートリッジ(.tic)をロード。
F1キーを押してエディタに入って、ソースコードを全部消して(Ctrl+Aで全選択、Deleteで消去)、1行目に、dofile("stgsample5.lua") とだけ書いておく。
この状態で Ctrl+R を叩いて実行してみたら、.lua に書かれた内容で動いてくれた。
外部エディタで .lua を修正して、TIC-80上で ESCキー → run をしたら、修正内容が反映された動作になった。
つまり、無料版の TIC-80 0.70.6 でも、外部エディタを使って .lua を編集することが一応可能な状態にできるっぽいなと。
任意のディレクトリを作って、以下のようなファイル構成にして。
. |-- tic80.exe |-- stgsample5.lua `-- stgsample5.tic
DOS窓を開いて、そのディレクトリをカレントディレクトリにして。(cd C:\hoge\fuga)
コマンドラインオプションをつけて、TIC-80を起動。
tic80 .「.」をつけて起動すると、いつもと違って、カレントディレクトリをストレージ場所にした状態で起動できるらしい。ちなみに、folder と打てばストレージ扱いの場所がエクスプローラで開かれるので、反映されてるかどうかも確認できる。
_Home - nesbox/TIC-80 Wiki
tic80 . will use current directory as storage tic80 ../path/to/cart.tic will use ../path/to/ as storage and load cart.tic tic80 -code game.lua load and run the code without startup animation tic80 -code-watch game.lua same as -code but also reload it when TIC is focused tic80 game.tic -code game.lua load cartridge, inject the code and run without startup animation
load stgsample5 で、カートリッジ(.tic)をロード。
F1キーを押してエディタに入って、ソースコードを全部消して(Ctrl+Aで全選択、Deleteで消去)、1行目に、dofile("stgsample5.lua") とだけ書いておく。
この状態で Ctrl+R を叩いて実行してみたら、.lua に書かれた内容で動いてくれた。
外部エディタで .lua を修正して、TIC-80上で ESCキー → run をしたら、修正内容が反映された動作になった。
つまり、無料版の TIC-80 0.70.6 でも、外部エディタを使って .lua を編集することが一応可能な状態にできるっぽいなと。
[ ツッコむ ]
#3 [prog] Luaにcontinueが無いのがツライ
Lua というプログラミング言語には、ループを制御する continue文が無い。
_break文とcontinue文
_continue文 - Wikipedia
_Tips/continue - Lua Memo
_Luaには『continue』は存在しない | とど。
地味にツライ。ループ内の記述が結構グチャグチャになる…。
Lua でもどうにかして continue を使えないかという質問に対して、こういうやり方はどうかと提案してる事例を見かけた。
_loops - Why does Lua have no "continue" statement? - Stack Overflow
どれもなんだかしっくりこない…。
一般的には、continue を呼び出す条件判定に not をつけて、if文で処理を囲むというのが定番だろうけど。Lua 5.2 から goto文が追加されたので、continue というラベルを作ってどうにかする方法が提示されていた。
そういえば、love2d は Lua 5.1相当(LuaJIT)を内蔵してたはずなので、この記述はできないだろうな…。
_Lua 5.1.2 is goto statement possible? - LoVE
_Why isn't Love 0.8.0 on Lua 5.2? - LoVE
_Lua 5.2 released, is there a plan to use it? - LoVE
いや、どうかな。 _LuaJIT Change History を眺めると、LuaJIT 2.0.0-beta11 - 2012-10-16 の時点で Lua 5.2 の goto/labels を追加した、と書いてある。
Windows10 x64 + love2d 11.1 では、LuaJIT 2.0.5 が内蔵されてるっぽいので…。もしかすると goto も使えるのかな…。そのうち試してみよう…。
_break文とcontinue文
_continue文 - Wikipedia
_Tips/continue - Lua Memo
_Luaには『continue』は存在しない | とど。
地味にツライ。ループ内の記述が結構グチャグチャになる…。
Lua でもどうにかして continue を使えないかという質問に対して、こういうやり方はどうかと提案してる事例を見かけた。
_loops - Why does Lua have no "continue" statement? - Stack Overflow
どれもなんだかしっくりこない…。
一般的には、continue を呼び出す条件判定に not をつけて、if文で処理を囲むというのが定番だろうけど。Lua 5.2 から goto文が追加されたので、continue というラベルを作ってどうにかする方法が提示されていた。
for i=1,10 do if i % 2 == 0 then goto continue end print(i) ::continue:: end手元の環境、Windows10 x64 + Lua 5.3.4 で試してみたけど、たしかに動いた。
そういえば、love2d は Lua 5.1相当(LuaJIT)を内蔵してたはずなので、この記述はできないだろうな…。
_Lua 5.1.2 is goto statement possible? - LoVE
_Why isn't Love 0.8.0 on Lua 5.2? - LoVE
_Lua 5.2 released, is there a plan to use it? - LoVE
いや、どうかな。 _LuaJIT Change History を眺めると、LuaJIT 2.0.0-beta11 - 2012-10-16 の時点で Lua 5.2 の goto/labels を追加した、と書いてある。
Windows10 x64 + love2d 11.1 では、LuaJIT 2.0.5 が内蔵されてるっぽいので…。もしかすると goto も使えるのかな…。そのうち試してみよう…。
[ ツッコむ ]
以上、1 日分です。