LOVEのゲームループ
load、update、drawを学びます。
「LOVEのゲームループ」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
LÖVEとは
LÖVE(love2dとも表記されます)は、純粋なLuaで2Dゲームを作成できる無料のフレームワークです。コールバック関数を記述すると、エンジンがそれらを呼び出してくれます。
LÖVEのゲームは、main.luaファイルを含むフォルダーに配置します。そのフォルダーからlove .で実行すると、エンジンがウィンドウを起動してループを開始します。
3つの主要なコールバック
LÖVEは、main.luaで定義する3つのコールバック、love.load、love.update、love.drawを通じてゲームを動かします。
これらを自分で呼び出す必要はありません。エンジンがlove.loadを一度呼び出し、その後ゲームが動作している間、毎フレームlove.updateとlove.drawを繰り返し呼び出します。
function love.load() end
function love.update(dt) end
function love.draw() endlove.load: 一度だけ行う初期設定
love.loadはゲーム開始時に正確に一度だけ実行されます。状態の設定、画像やフォントの読み込み、テーブルの作成、ループ開始前の変数の初期化に使います。
時間のかかる処理は、love.updateやlove.drawの中ではなく、ここで行うべきです。そうすれば毎フレーム繰り返されません。
function love.load()
player = { x = 100, y = 100, speed = 200 }
score = 0
endlove.update: ゲームロジック
love.update(dt)は毎フレーム一度実行され、オブジェクトの移動、衝突判定、タイマーの更新、入力状態の読み取りなど、ゲームロジックを処理します。
dt引数はデルタタイムで、前のフレームから経過した秒数です。updateの中で描画してはいけません。描画はlove.drawに分けます。
function love.update(dt)
player.x = player.x + player.speed * dt
enddtが重要な理由
フレームレートはコンピューターによって異なります。毎フレーム一定量だけ移動させると、高速なコンピューターでは低速なコンピューターよりもオブジェクトが速く移動してしまいます。
dtを掛けると、動きをフレームレートに依存しないものにできます。speed * dtは「1秒あたりspeed単位」を意味するため、何フレーム描画されるかに関係なく、オブジェクトは同じ距離を移動します。
-- 200 pixels per second, on any machine
player.x = player.x + 200 * dtlove.draw: 描画
love.drawはlove.updateの後、毎フレーム一度実行されます。画面に表示されるものはすべて、love.graphicsモジュールを使ってここで描画します。
各描画呼び出しの前に画面は自動的にクリアされるため、毎フレーム、現在のゲーム状態からシーン全体を描き直します。
function love.draw()
love.graphics.rectangle('fill', player.x, player.y, 32, 32)
endループ全体の流れ
コールバックを組み合わせると、完全なゲームになります。loadでプレイヤーを設定し、updateでdtを使ってプレイヤーを動かし、drawで描画します。
このload-update-drawサイクルは、どれほど複雑になっても、すべてのLÖVEゲームの心臓部です。
function love.load() x = 0 end
function love.update(dt) x = x + 100 * dt end
function love.draw()
love.graphics.circle('fill', x, 150, 20)
end経過時間の測定
dtを累積してタイマーを作成します。よく使われる方法は、経過時間を合計し、しきい値を超えたら処理を実行してから、そのしきい値を差し引くことです。
フレーム数はハードウェアによって変わりますが、dtは実際の秒数を追跡するため、フレームを数えるよりも信頼性が高くなります。
timer = 0
function love.update(dt)
timer = timer + dt
if timer >= 1 then
score = score + 1
timer = timer - 1
end
endlove.runとループの内部
内部では、love.runが実際のメインループです。love.loadを一度呼び出した後、イベントを処理し、dtを計算し、独自のupdateとdrawを呼び出してフレームを表示する処理を永遠に繰り返します。
love.runを上書きすることはほとんどありませんが、これが存在することを知っておくと、dtやコールバックがどこから来るのか理解できます。
-- simplified idea of love.run
-- love.load()
-- while true do
-- dt = timer.step()
-- love.update(dt)
-- love.draw()
-- endlove.quitとライフサイクル
LÖVEには、主要な3つ以外にもライフサイクルコールバックがあります。love.quitはプレイヤーがウィンドウを閉じたときに呼び出され、進行状況を保存できます。
love.quitからtrueを返すと終了をキャンセルできます。love.focusやlove.resizeなどの他のコールバックは、ウィンドウイベントに応答します。
function love.quit()
print('Saving before exit...')
return false -- false lets the game close
endゲームの一時停止
love.updateがすべてのロジックを動かしているため、一時停止は簡単です。フラグでロジックの実行を制御し、一時停止中はスキップします。
描画は引き続き実行されるため、一時停止中のオーバーレイを描画できます。updateとdrawが分離されているからこそ、ループの設計は柔軟なのです。
paused = false
function love.update(dt)
if paused then return end
player.x = player.x + player.speed * dt
end理解度チェック
LÖVEのゲームループについて理解度を確認しましょう。
まとめ
LÖVEはコールバックを通じてゲームを動かします。love.loadは一度だけ初期設定を行い、love.update(dt)は毎フレームロジックを処理し、love.drawは毎フレーム描画します。
dtの値によって動きをフレームレートに依存しないものにでき、love.quitなどのライフサイクルコールバックがループを補完します。このサイクルがすべてのlove2dゲームを動かしています。
よくある質問
「LOVEのゲームループ」レッスンは無料ですか?
はい。「LOVEのゲームループ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「LOVEのゲームループ」で何を学びますか?
load、update、drawを学びます。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「LOVEのゲームループ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- LOVEのゲームループ
- 図形と画像を描画する
- 入力を扱う
- 移動と衝突