mieki256's diary



2018/11/16(金) [n年前の日記]

#1 [tic80] TIC-80でシューティングゲームっぽいものを書いてみる。その2

先日、TIC-80上で動く横スクロールシューティングっぽいモノを書き始めたけれど、アタリ判定もつけてみた。

stgsample5_ss1_opt.gif

ブラウザ上で動かしたいなら以下。

_stgsample5.tic.html

操作方法。

ソース。 :

ソースは以下。長くなり始めたので Gist にアップロードしてみた。

_TIC-80 shoot 'em up sample

スプライト画像は以下。

sprites.gif

_sprites.gif

ソースも画像も、CC0 / Public Domain ってことで。

ちなみに。
  • export sprites で、スプライト画像のエクスポート。
  • import sprites で、スプライト画像のインポート。
以下が参考になった。ありがたや。

_TIC-80 初心者講座: マップ・スプライト画像を画像ソフトで描いて取り込もう - Qiita

ソースの簡単な解説。 :

アタリ判定は、hitcheck()、hitcheckCirc() で処理をしている。
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)がリリースされました。

試してみた。 :

とりあえず試してみた。環境は Windows10 x64 + TIC-80 0.70.6。

任意のディレクトリを作って、以下のようなファイル構成にして。
.
|-- 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 というラベルを作ってどうにかする方法が提示されていた。
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 日分です。

過去ログ表示

Prev - 2018/11 - Next
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project