mieki256's diary



2021/02/04(木) [n年前の日記]

#1 [love2d] love2dでコマンドラインオプションを取得

love2dスクリプトで、コマンドラインオプション(コマンドライン引数)を取得できるか試してみたり。環境は Windows10 x64 20H2 + love2d 11.3。

ググったところ、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
getarg_ss01.png
arg[1] : getarg
arg[-2] : love
arg[-1] : embedded boot.lua

Mode : none

コマンドラインオプションを付けて実行してみる。
love getarg /s
getarg_ss02.png
arg[1] : getarg
arg[2] : /s
arg[-2] : love
arg[-1] : embedded boot.lua

Mode : fullscreen

.loveファイルを作成。 :

この love2dスクリプトを、.loveファイルに変換してみる。.loveファイルと言ってるけれど、実態は .zip ファイル。
  1. conf.lua と main.lua を、1つのzipファイル、getarg.zip に圧縮する。(getargフォルダごとzip圧縮しないように注意。)
  2. getarg.zip の .zip を .love にリネームする。
これで、getarg.love を作成できた。

動作確認してみる。
love getarg.love /s
getarg_ss03.png
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 ファイルを結合するだけでいいらしい。
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
getarg_ss04.png
arg[1] : /s
arg[-2] : getarg.exe
arg[-1] : embedded boot.lua

Mode : fullscreen
  • arg[1] が「/s」になった。
  • arg[-2] が getarg.exe になった。

とりあえず…。
  • love2dスクリプトのままでも、
  • .loveファイルにしても、
  • exe化しても、
love2d に渡されたコマンドラインオプションを取得することはできそうだ、ということが分かった。

以上です。

過去ログ表示

Prev - 2021/02 - 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

カテゴリで表示

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


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

Powered by hns-2.19.6, HyperNikkiSystem Project