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
[ ツッコむ ]
以上です。