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