love2d-core について
LuaでLÖVEゲームの基礎を構築・デバッグするスキルです。LÖVE 11.5を対象に、コールバック、時間に応じた移動、入力、画面状態の管理を扱います。
主な機能
- 01main.luaのコールバック設定
- 02conf.luaでのウィンドウとバージョン設定
- 03デルタタイムによる移動量の調整
- 04ポーリング入力とイベント入力の処理
- 05ステートスタックによる画面管理
- 06LÖVE 11.xの色値の適用
活用シーン
- 01main.luaとconf.luaでLÖVEプロジェクトを開始
- 02フレームレート依存の移動を修正
- 03メニュー、ゲーム、ポーズ画面を切り替え
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ gamedev-skills/ awesome-gamedev-agent-skills --skill love2d-coreインストール後、Claude Code で/love2d-coreを入力して読み込まれたか確認します。
同梱ファイルreferences/state-stack.md
詳細
LÖVE(Love2D)コア
Lua で LÖVE ゲームの基盤を構築し、デバッグします。コールバックループ、フレームレートに依存しない移動、入力、画面状態を扱います。対象は LÖVE 11.5 です。
使用する場面
- LÖVE ゲームを始めるとき、
main.lua/conf.luaを連携させるとき、またはコアループ、意図した速度で動かない移動、入力処理、画面の切り替えを修正するときに使用します。 - ワークスペースに
love.*を呼び出すmain.lua、conf.lua、または.loveファイルがある場合に使用します。
使用しない場面: LÖVE と無関係な Lua 言語 に関する質問。物理ボディ/ジョイント(LÖVE は love.physics 経由で Box2D を使用します。これは別のトピックです)。シェーダーコード(love.graphics の GLSL は独立したトピックです)。複数のゲームエンジンで共通するセーブ/ロードのパターンには、save-systems を使用してください。
基本的なワークフロー
- エントリーポイントを確認します。 LÖVE ゲームは
main.luaを実行します。ここではlove.load()(初期化を一度だけ実行)、love.update(dt)(状態更新)、love.draw()(描画)を定義します。ウィンドウとバージョンの設定はconf.luaに記述します(モジュールの読み込み前に実行されます)。 - バージョンを固定します。 LÖVE のバージョンが一致しない場合に警告が表示されるよう、
conf.luaでt.version = "11.5"を設定します。 - すべての動きを
dt(秒単位のデルタタイム)で制御し、フレームレートに依存しない速度にします。 - 入力は 2 通りで処理します。 ポーリング方式(押し続けているキーには、
update内のlove.keyboard.isDownを使用)とイベント方式(単発のキー入力には、love.keypressedコールバックを使用)です。 - 画面(メニュー、ゲーム、ポーズ)を管理するには、
ifフラグを大量に並べるのではなく、小規模な状態スタックを使用します。「パターン」とreferences/state-stack.mdを参照してください。 - 実行して動作を確認します。 プロジェクトフォルダーから
love .を実行します。問題なく動作すると判断する前に、画面上でウィンドウ、移動速度、入力を確認してください。
パターン
1. main.lua の基本構成(コールバックループ+入力)
-- main.lua — LÖVE calls these callbacks for you. Colors are 0–1 in LÖVE 11.x.
function love.load()
-- One-time setup. speed is in PIXELS PER SECOND, not per frame.
player = { x = 100, y = 100, size = 40, speed = 220 }
love.graphics.setBackgroundColor(0.1, 0.1, 0.12)
end
function love.update(dt)
-- Polled input: good for continuous movement while a key is held.
if love.keyboard.isDown("right") then player.x = player.x + player.speed * dt end
if love.keyboard.isDown("left") then player.x = player.x - player.speed * dt end
if love.keyboard.isDown("down") then player.y = player.y + player.speed * dt end
if love.keyboard.isDown("up") then player.y = player.y - player.speed * dt end
end
function love.draw()
love.graphics.setColor(0.2, 0.8, 1.0) -- tint ON
love.graphics.rectangle("fill", player.x, player.y, player.size, player.size)
love.graphics.setColor(1, 1, 1) -- reset tint before text/images
love.graphics.print("Arrow keys to move, Esc to quit", 10, 10)
end
function love.keypressed(key)
-- Event input: fires once per physical press. Use for menus, jumps, toggles.
if key == "escape" then love.event.quit() end
end
2. フレームレートに依存しない動き(最もよくあるバグ)
-- RIGHT: scaled by dt → same real-world speed at 30 or 240 FPS.
player.x = player.x + player.speed * dt
-- WRONG: "pixels per frame" → moves twice as fast at double the frame rate.
player.x = player.x + player.speed
3. conf.lua(ウィンドウ+バージョンの設定。main.lua より前に実行)
-- conf.lua — must be its own file; love.conf will NOT run from main.lua.
function love.conf(t)
t.version = "11.5" -- the LÖVE version this game targets (string "X.Y")
t.window.title = "My LÖVE Game"
t.window.width = 800
t.window.height = 600
t.window.vsync = 1 -- number since 11.0: 1 = on, 0 = off, -1 = adaptive
t.window.resizable = false
t.modules.physics = false -- disable modules you don't use to trim startup/memory
end
4. LÖVE 11.x の色の値は 0~1(0~255 ではありません)
-- LÖVE 11.x uses normalized floats. (Pre-11.0 code used 0–255 and will look wrong.)
love.graphics.setColor(1, 0, 0) -- opaque red
love.graphics.setColor(0.2, 0.8, 1.0, 0.5) -- translucent cyan (alpha 0.5)
-- Need to convert old byte values? Use the helper instead of dividing by hand:
love.graphics.setColor(love.math.colorFromBytes(128, 234, 255))
5. 画面状態(概要。完全なマネージャーはリファレンスを参照)
-- A screen is a table with optional :update(dt), :draw(), :keypressed(key).
-- Keep the active screen on a stack so pause/menu overlays are trivial to pop.
local Stack = require("state_stack") -- see references/state-stack.md for the module
function love.load() Stack.push(require("screens.menu")) end
function love.update(dt) Stack.current():update(dt) end
function love.draw() Stack.current():draw() end
function love.keypressed(key) Stack.current():keypressed(key) end
注意点
- FPS によって速度が変わる →
* dtを忘れています。位置、タイマー、アニメーションに対するフレームごとの変更には、必ずdtを掛けてください。 love.confをmain.luaに置いている → 何も起きません。LÖVE がモジュールを読み込む 前に 実行するconf.luaに置く必要があります。- 色が薄くなる、または見えなくなる → 0~255 の値を使っています。11.x では
setColor(255,0,0)は白にクランプされます。setColor(1,0,0)またはlove.math.colorFromBytesを使用してください。 - 一度
setColorを呼ぶと、すべてに色が付く → 色はグローバルで、描画後も保持されます。色を付けずに描画したいテキスト/画像の前に、love.graphics.setColor(1, 1, 1)でリセットしてください。 - キーを離したとき/キーリピート時に何も起きない →
love.keypressed(key, scancode, isrepeat)はキーを押したとき(および OS のキーリピート時)に呼び出されます。キーを離したときはlove.keyreleasedを使用してください。押し続けたときのキーリピートを無視する必要がある場合は、isrepeatを確認します。
リファレンス
- コールバックを委譲する、画面状態の完全なプッシュ/ポップマネージャー(メニュー → ゲーム → ポーズ)については、
references/state-stack.mdを参照してください。
関連スキル
save-systems— ゲーム状態のセーブ/ロード(ゲームエンジンに依存しません)。input-systems— 再割り当て可能で、複数のデバイスに対応する入力アーキテクチャ。pygame-core/phaser-core— 他の軽量ゲームエンジンにおける同様のループ概念。
コメント
Markdown 対応