2021/02/04(木) [n年前の日記]
#1 [love2d] love2dでコマンドラインオプションを取得
love2dスクリプトで、コマンドラインオプション(コマンドライン引数)を取得できるか試してみたり。環境は Windows10 x64 20H2 + love2d 11.3。
ググったところ、arg というテーブルにコマンドラインオプションが入った状態で love2dスクリプトが実行されるらしい。
とりあえず、サンプルを書いてみる。今回、コマンドラインオプションを取得して画面に表示するサンプルを書いてみた。
getarg というフォルダを作成して、conf.lua と main.lua を置く。
_conf.lua
以下のようにループを回せば、arg テーブルのキーと値を順々に取り出すことができる。
動かしてみる。love フォルダ名、で実行できる。まずはコマンドラインオプションを付けない状態で試してみる。
コマンドラインオプションを付けて実行してみる。
ググったところ、arg というテーブルにコマンドラインオプションが入った状態で love2dスクリプトが実行されるらしい。
とりあえず、サンプルを書いてみる。今回、コマンドラインオプションを取得して画面に表示するサンプルを書いてみた。
getarg というフォルダを作成して、conf.lua と main.lua を置く。
_conf.lua
function love.conf(t) t.window.title = "get arg with love2d" t.window.vsync = true t.window.width = 640 t.window.height = 480 -- t.window.fullscreen = true -- t.window.fullscreentype = "exclusive" end_main.lua
-- get arg with love2d function love.load(arg) -- Check command line options ssmode = "" for k, v in pairs(arg) do lv = string.lower(v) if lv == "/s" then ssmode = "fullscreen" elseif lv == "/c" then ssmode = "config" elseif lv == "/p" then ssmode = "preview" elseif lv == "/a" then ssmode = "passwordlock" end end if ssmode == "" then ssmode = "none" end min_dt = 1 / 60 next_time = love.timer.getTime() end function love.update(dt) next_time = next_time + min_dt if dt > 0.75 then return end end function love.draw() love.graphics.setCanvas() love.graphics.clear(0, 0, 0.2, 1.0) love.graphics.setColor(1, 1, 1, 1) love.graphics.print("FPS: " .. tostring(love.timer.getFPS()), 10, 10) y = 32 for k, v in pairs(arg) do love.graphics.print(string.format("arg[%d] : %s", k, v), 10, y) y = y + 18 end y = y + 18 love.graphics.print("Mode : " .. ssmode, 10, y) if love.system.getOS() == "Windows" then -- wait local cur_time = love.timer.getTime() if next_time <= cur_time then next_time = cur_time else love.timer.sleep(next_time - cur_time) end end end function love.keypressed(key, isrepeat) if key == "escape" then -- ESC to exit love.event.quit() end end
以下のようにループを回せば、arg テーブルのキーと値を順々に取り出すことができる。
for k, v in pairs(arg) do -- key, value end
動かしてみる。love フォルダ名、で実行できる。まずはコマンドラインオプションを付けない状態で試してみる。
love getarg
arg[1] : getarg arg[-2] : love arg[-1] : embedded boot.lua Mode : none
- arg[1] にフォルダ名が入ってることがわかる。
- arg[-2] には、love が入っている。
- arg[-1] には、love2d を動かした際に、一番最初に呼び出されてる内蔵luaスクリプト名が表示されているのだろうと思われる。
コマンドラインオプションを付けて実行してみる。
love getarg /s
arg[1] : getarg arg[2] : /s arg[-2] : love arg[-1] : embedded boot.lua Mode : fullscreen
- arg[2] に「/s」が入ってる。
- love.load(arg) 内で、「/s」「/c」「/p」「/a」等が指定されてるかチェックしているが、「/s」が指定されてることを検出できている。(Mode : fullscreen になっている)
◎ .loveファイルを作成。 :
この love2dスクリプトを、.loveファイルに変換してみる。.loveファイルと言ってるけれど、実態は .zip ファイル。
動作確認してみる。
- conf.lua と main.lua を、1つのzipファイル、getarg.zip に圧縮する。(getargフォルダごとzip圧縮しないように注意。)
- getarg.zip の .zip を .love にリネームする。
動作確認してみる。
love getarg.love /s
arg[1] : getarg.love arg[2] : /s arg[-2] : love arg[-1] : embedded boot.lua Mode : fullscreen
- フォルダ名を指定した時と違って、arg[1] が getarg から getarg.love に変わっている。
- それ以外は、love getarg /s を動かしたときと同じ。
◎ exe化する。 :
getarg.love を exe化してみる。
love2dスクリプトの exe化は、love.exe の末尾に .love ファイルを結合するだけでいいらしい。
これで、getarg.exe を作ることができた。
getarg.exe を動かすためには、love.exe に同梱されているDLLファイル群が必要になる。こうして .exe化した exeファイルを配布する際は、それら .dll も一緒に配布しておかないと動作しないよ、ということになっているけれど…。
とりあえず、今回は love2d をインストールしてある環境で動作確認しているので ―― OSの環境変数PATHに love2d のインストールフォルダが登録してあるので、DLLが必要になったら PATH の中からDLLを探して呼び出して一応実行することはできるだろう、と。実際、getarg.exe をいきなり呼び出しても動いてくれた。
動作確認してみる。
とりあえず…。
love2dスクリプトの exe化は、love.exe の末尾に .love ファイルを結合するだけでいいらしい。
copy /b love.exe+getarg.love getarg.exe
これで、getarg.exe を作ることができた。
getarg.exe を動かすためには、love.exe に同梱されているDLLファイル群が必要になる。こうして .exe化した exeファイルを配布する際は、それら .dll も一緒に配布しておかないと動作しないよ、ということになっているけれど…。
とりあえず、今回は love2d をインストールしてある環境で動作確認しているので ―― OSの環境変数PATHに love2d のインストールフォルダが登録してあるので、DLLが必要になったら PATH の中からDLLを探して呼び出して一応実行することはできるだろう、と。実際、getarg.exe をいきなり呼び出しても動いてくれた。
動作確認してみる。
getarg.exe /s
arg[1] : /s arg[-2] : getarg.exe arg[-1] : embedded boot.lua Mode : fullscreen
- arg[1] が「/s」になった。
- arg[-2] が getarg.exe になった。
とりあえず…。
- love2dスクリプトのままでも、
- .loveファイルにしても、
- exe化しても、
[ ツッコむ ]
以上です。