Open10

Love2D(Lua)でゲームをつくる

楓

本体と開発環境のインストール

Love2D(執筆現在11.3)はLuaJIT 2.0.5で動いている。
本体だけでも開発はできるけど、テスト環境を整えるため、LuaJITとパッケージマネージャのLuaRocksをインストールする。
手動ビルドに手間どったので、HereRocksを導入することにした。
https://qiita.com/agdf_ydy/items/37592d5ab36e67a86634

LOVE2Dのインストール

LOVE2D本体とコンパイル用のgccをインストール。今回はChocolateyで入れた。

$ cinst love.install mingw -y

HereRocksのインストール

pipで行う。

$ pip install hererocks

LuaJIT + LuaRocksのインストール

今回はLuaJIT2.0.5とLuaRocksの最新版を落とす。
-jでLuaJIT、-rでLuaRocksのバージョンを指定。

$ hererocks /c/luajit -j2.0.5 -rlatest --target mingw

PATHを通す。

~/.bashrc
export LUA_PATH=";;/c/luajit/share/lua/5.1/jit/?.lua";
export LUA_CPATH=";;/c/luajit/bin/?.dll";
export LUA_DEV="/c/luajit";

Love2Dの起動

Windowsだとlovecでコンソールが表示される。
main.luaのあるディレクトリで

$ lovec .

で起動。

楓

tealでLuaの型チェック(WIP)

Luadocではテーブルの型情報が書けない書きづらかったので、tlを導入してみる。
https://github.com/teal-language/tl

インストール

$ luarocks.bat install tl

使う

$ tl check main.tl

叱られたら修正し、tl.bat genで変換。
詳しくはここ。
https://github.com/teal-language/tl/blob/master/docs/tutorial.md

型定義ファイル

型定義を自作することもできる。
早速Love2D用オレオレ定義ファイルを作った。

https://gist.github.com/sigma614/f648916d9814c0cc818085ce32f916d4

  • 一部しかない
  • love.graphics.drawなど複数書き方がある場合、自分が使うパターンしか書いてない
    ので、もしご入り用の場合は修正してください。

これをtlconfig.luaに追加すると、自動で読み込んでくれる。

tlconfig.lua
return {
  global_env_def = 'love-example',
}

定義ファイルについて詳しくはここ。
https://github.com/teal-language/tl/blob/master/docs/declaration_files.md

コンパイル設定

https://github.com/teal-language/tl/blob/master/docs/compiler_options.md
出力するLuaのバージョンも指定できる。

tlconfig.lua
  gen_target = '5.1',

保存したら自動でチェックし、問題なければコンパイル(WIP)

https://marketplace.visualstudio.com/items?itemName=pucelle.run-on-save

tlファイルでもLua拡張を使いたい

VS Codeにはtealの拡張もあるが、自動補完機能はあるものの定義情報などは出してくれない。(recordの折りたたみはしてくれる)
https://marketplace.visualstudio.com/items?itemName=sumneko.lua
こちらが情報豊富なのでtlでも引き続き使いたい。ので、言語モードをLuaにしてしまう。

コマンドパレットを開き「言語モードの変更」→「'.tl'に対するファイルの関連付けの構成...」→「Lua」を選択。
すると…Lua拡張のDiagnosttic機能がアノテーション部分で大量にエラーを吐く。
"Lua.diagnostics.enable": falseでDiagnostticをOFFにすればいいんだけど、
最低でもendで閉じ忘れだけは事前に検出したいので、miss-end以外でエラーが出たものをちまちま除外していく。

.vscode/settings.json
  "Lua.diagnostics.disable": [
    "unknown-symbol",
    "exp-in-action",
    "miss-method",
    "undefined-field",
    "miss-symbol", // record
    "undefined-global", // record
    "keyword", // function
    // "miss-end", // function
    // "unexpect-dots" // 可変長引数
  ],

また除外フォルダも指定できる。

.vscode/settings.json
  "Lua.workspace.ignoreDir": [
    ".vscode",
    "types" // 型定義ファイルのフォルダ
  ],

WIP

  • 互換性オプション
  • ローカル型定義ファイルの読み込み
楓

Busted+LuacovでLuaのユニットテストとカバレッジ(WIP)

インストール

$ luarocks.bat install busted
$ luarocks.bat install luacov
$ luarocks.bat install luacov-reporter-lcov

使う

参考
https://nozomi1773.hatenablog.com/entry/2019/11/13/234241

Windowsで文字化けする

https://pystyle.info/vscode-change-default-encoding-of-terminal-to-utf8/

色がつかない

ansiconがないのでChocolateyでインストール。

$ cinst ansicon -y

アサーション

assert.are.equal(state, arguments)で要素の比較、
assert.are.same(state, arguments)でテーブルの比較ができる。
それぞれfalseの場合両方の情報を表示してくれる。

カバレッジを取る

.luacov
return {
  exclude = {
     -- requireで読み込んだ開発用モジュールも対象のため、LuaJITをインストールしたフォルダも除外
     'luajit',
     'test',
    'lib',
  },
  runreport = true,
  reportfile ='coverage/lcov.info',
  statsfile ='coverage/luacov.stats.out'
}
$ busted.bat main.lua -c

これで更に

$ luacov -r lcov

とするとlcov.infoに変換してくれる。

https://marketplace.visualstudio.com/items?itemName=ryanluker.vscode-coverage-gutters
こちらの拡張でカバレッジを見れる。

WIP

  • tlファイルでカバレッジを見たい
楓

CuteでLove2DのUIテスト自動化(WIP)

https://github.com/gtrogers/Cute

普段Love2Dのコールバック関数には

main.lua
love.mousepressed(x, y, button){
  -- ボタンが押されたときの処理
}

というふうに引数を受け取ったあとの処理を書いているけど、普通に関数だけ呼び出すこともできる。

main_test.lua
love.mousepressed(10, 10, 1)

上記は座標x10,y10でメインボタンをクリックしたことと同じになる。
これを活用し、例えばボタンの表示されるべき位置を指定してクリックし、Cuteで要素の変化を確認するなど、ブラックボックステストを書いていける。

WIP

  • テストの範囲

https://speakerdeck.com/tsuchikazu/vue-component-test

  • cute-headlessとsimple-pre-commitでテスト失敗したらコミット不可にする

とにかくフックをバージョン管理したかったのでシンプルなものを選んだ。
https://www.npmjs.com/package/simple-pre-commit

  • スクリーンショットを撮って画像差分テストする

https://blog.mirakui.com/entry/20110326/1301111196

楓

VS Code + Local Lua DebuggerでLove2Dのデバッグ(WIP)

https://marketplace.visualstudio.com/items?itemName=tomblind.local-lua-debugger-vscode

Love2Dの場合は

.vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug Love",
      "type": "lua-local",
      "request": "launch",
      "program": {
        "command": "love"
      },
      "args": [
        "."
      ],
      "scriptRoots": [
        "."
      ]
    }
  ]
}

main.luaの冒頭で読み込み。

main.lua
if os.getenv("LOCAL_LUA_DEBUGGER_VSCODE") == "1" then
  require("lldebugger").start()
end
conf.lua
  t.console = false
楓

Github Milestoneで進捗管理

  • 期日を決められる
  • Issuesを登録して進捗度合いを可視化できる

https://docs.github.com/ja/issues/using-labels-and-milestones-to-track-work/about-milestones

VS Codeで見るにはこれ
マイルストーンごとにアサインされた・自分が作成したIssuesをリスト表示してくれる
https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github

Projectsはカンバン管理もできる(自動でタスク移動もできるらしい)
Milestoneとの使い分けはまだ模索中
https://docs.github.com/ja/issues/organizing-your-work-with-project-boards/managing-project-boards/about-automation-for-project-boards

とりあえずv1.0公開を1月末に設定した。がんばろ

楓

デザインパターンの記事

生成

Factory Method

https://qiita.com/shoheiyokoyama/items/d752834a6a2e208b90ca

Decorator

新たな機能を被せて生成

https://qiita.com/i-tanaka730/items/a0f53d70b0830cfd150b

構造

Facade

複数クラスをまたいだ処理を行うクラスをひとつ作る。

https://qiita.com/i-tanaka730/items/911604bcd4136684ff1c

Storategy

クラスを切り替えて挙動を変更

https://zenn.dev/nekoniki/articles/396ebc523930c196dc13

Adapter

https://qiita.com/i-tanaka730/items/da8731c219c921d30a59

FlyWeight

インスタンスを共有してメモリを節約する。

https://qiita.com/i-tanaka730/items/ed32b9a7c3f9f72b59ef

振る舞い

Template Method

違う振る舞いをする部分をメソッドに切り出す
→メソッドを抽象クラスに持っていき、具象クラスでそれぞれ違う振る舞いをする同名のメソッドを用意
→残りの部分は共通化できる

https://qiita.com/yoshinori_hisakawa/items/4f19c9cc6a5dccafe053

Strategy

切り出す部分はTemplatr Methodと共通。
具象クラスから委譲を使って切り出す。

https://qiita.com/i-tanaka730/items/4d00c884b7ce1594f42a

State

ページ遷移に使える

https://qiita.com/i-tanaka730/items/49ee4e3daa3aeaf6e0b5

Observer

https://qiita.com/shoheiyokoyama/items/d4b844ed29f84a80795b

Command

https://qiita.com/i-tanaka730/items/6f8c3423eda95c230f3b