TOP > プログラム関連 > Lua > LÖVE(Love2D) > LÖVE(Love2D)でシンプルなPVなどの動画を作成する > Luaの超駆け足での解説(チートシート)

LÖVE(Love2D)でシンプルなPVなどの動画を作成する
◆◆ Luaの超駆け足での解説(チートシート) ◆◆

--- 目次 ---
・サブルーチン(関数)
・関数オブジェクト
・条件で処理を分ける(if文)
・配列(テーブル)
・連想配列のキーを削除
・クラス(っぽい何か)
Love2DとLuaの関係

話を整理しておきましょう。LÖVE(Love2D)自体は「画像表示とかの機能があるソフト」で、その機能を引き出すための言語が Lua です。

LÖVE と Lua の関係図。

内部を詳しく見たわけではありませんが、Love2D側に「画像表示」「キー入力受付」などの機能があって、 それを Lua言語で呼び出して使用する、といった仕掛けになっているものと思われます。 それから念のために申し添えておくと、Luaというのは独立したスクリプト言語です。 さまざまなシステムに組み込んで使用できるという特徴があります。 で、世の中には操作用のスクリプト言語としてLuaを採用しているシステムが多数存在しており、 LÖVE(Love2D)そうしたシステムの一つ、ということです。

ついでに蛇足ながら、愛するあなたのためにもう一度繰り返しておくと、『Live2D』とは関係ありませんっっ!!

Lua のお勉強

で、Love2Dを扱うには Lua言語の知識が必要になるわけですが…… Lua自体を詳しくお勉強しようとすると命がいくつあっても足りません。 また、プログラミング自体のイロハについても、ここで基礎から解説していたら原稿用紙ン万枚の大長編になってしまいます。

というわけで、プログラミングの「プ」の字ぐらいはご存知だけど Lua はオラちょっとよくわがんね、というカンジのお友達を想定して、 今回の動画作成の企画に必要な機能だけ、超高速で土煙巻き上げながらババッと解説していきます。 「このぐらい既に存じ上げてるぜ!俺様をナメてもらっては困るぜ!」という頼もしいお友達は、ここは元気にすっ飛ばしてね。

以下のサンプルソースを main.lua というファイル名で保存し、Love2D上で実行することができます。 なお、またも繰り返しになりますが、ここで紹介するのはLua言語自体の仕様です。Love2Dの機能ではありません。 実行環境として Love2Dを使う想定ではありますが、Love2Dの機能を使っているというわけではありません。 (Love2D の機能と Lua言語自体の仕様は分けて考えたい。そんなお年頃)

サブルーチン(関数)
↑目次へ↑

こう書いてコマンドプロンプトで実行すると、

ファイル名:main.lua
function aaaaa ()
    print ("来てます。")
end

aaaaa()

こうなるよ、

サブルーチン(関数)の使用例

ちなみにこのとき、以下のような真っ黒なウィンドウが同時に出ていることと思います。 これは Love2Dが表示しているウィンドウですね。Love2D自体の機能は使っていないので真っ黒なままということです。

Love2D側のウィンドウ
関数オブジェクト(変数に関数を代入しておいて、しかるのちに実行)
↑目次へ↑

こう書いたら、

ファイル名:main.lua
x = function ()
    print ("来てます。")
end

x()

こうなるよ。

関数オブジェクトの使用例
条件で処理を分ける(if文)
↑目次へ↑

こう書いたら、

ファイル名:main.lua
a = 10

if ( a > 5 ) then

    print ("( ^ o^)ノ")

else

    print ("ヽ(^o ^ )")

end

こうなるよ。

if文の使用例
テーブル(配列っぽい何か)
↑目次へ↑

こう書いたら、

ファイル名:main.lua
tableTest = {"aaa", "bbb", "ccc"}

print ( tableTest[1] )
print ( tableTest[2] )
print ( tableTest[3] )
print ( "要素数:"..#tableTest )

こうなるよ

配列(テーブル)の使用例
【気をつけるところ】
添字は「1」から始まります。プログラマは「0」から数え始めるという常識を打ち破る新機軸。これだから Luaはヤメられませんね。

Luaの「テーブル」は、配列や連想配列や構造体やオブジェクトをまぜこぜにしたような愉快なお友達となっているみたいで、 「配列!」と言い切ってしまうとエラい人に怒られてしまいそうですよ、とは申し添えておきます。びくびく。


連想配列のキーを削除
↑目次へ↑

急にニッチな感じになって参りましたが、必ず必要になる処理のハズなのに調べてもスバリな方法が出てこなかったので、ここで一応の方法を紹介しておきます。

Lua のテーブルは連想配列としても使用することができます。そのキーを指定してエントリーを削除する方法です(table.remove は連想配列には使えないっぽい)。
結論を言うと、値として nil を代入すると消えたことになるようです。
ただし、Luaの正確な仕様であることを確認はできたわけではない、とは申し添えておきます。(それを言い出したら他のもかな?)

例えばこう書いたら、

ファイル名:main.lua
tableTest = {}
tableTest['key1'] = 'value1'
tableTest['key2'] = 'value2'
tableTest['key3'] = 'value3'

-- この時点での内容を確認
for key, value in pairs(tableTest) do
    print (key..":"..value)
end

print ( '\nkey2 を削除します\n' )

tableTest['key2'] = nil

-- 削除されているかどうかを確認
for key, value in pairs(tableTest) do
    print (key..":"..value)
end

こうなります↓

連想配列のエントリーを削除する実験

一応の典拠はこちらです:
How to remove a lua table entry by its key? - Stack Overflow -


クラス(っぽい何か)
↑目次へ↑

こう書いたら、

ファイル名:main.lua
---------------------------------------------------
-- クラス定義
---------------------------------------------------
ClassTest = {}
ClassTest.new = function (id)

    local this = {}

    this.id = id
    this.value = 0

    this.setValue = function(self, value)
        self.value = value
    end

    this.execute = function(self)
        print("MyID:"..self.id)
        print("value:"..self.value)
    end

    return this
end

---------------------------------------------------
-- 使ってみるテスト
---------------------------------------------------
obj1 = ClassTest.new("o1")
obj2 = ClassTest.new("o2")

obj1:setValue(1)
obj2:setValue(2)

obj1:execute()
obj2:execute()

こうなるよ。

クラスの実装例と動作結果
【気をつけるところ】
プロパティにはピリオド「.」でアクセス。 メソッドにはコロン「:」でアクセス。
(コンストラクタにはピリオド「.」)

Lua自体がクラスの機能を備えているというわけではなく、オブジェクト指向の実現方法はイロイロあるようです。 元気なお友達は研究してみてね。 ちなみに上記の方法は ぱろっと・すたじお様の記事を参考にさせていただきました。 ありがとうございます。


さて、上記以外にも Luaの機能はイロイロありますが、 プログラミングの「プ」の字など4千年前に通過済みっっっ!!という頼もしいアナタなら ソースコードを一目ご覧になれば勘で乗り切れるに違いありません。 なので今後はあまり Lua自体の解説はしません。気合で乗り切ってね。