mcpField
L
love2d-core

love2d-core

github.com/gamedev-skills開発5.4k5.6k 回インストール1 日前に更新
リポジトリ

love2d-core について

LuaでLÖVEゲームの基礎を構築・デバッグするスキルです。LÖVE 11.5を対象に、コールバック、時間に応じた移動、入力、画面状態の管理を扱います。

主な機能

  1. 01main.luaのコールバック設定
  2. 02conf.luaでのウィンドウとバージョン設定
  3. 03デルタタイムによる移動量の調整
  4. 04ポーリング入力とイベント入力の処理
  5. 05ステートスタックによる画面管理
  6. 06LÖVE 11.xの色値の適用

活用シーン

  1. 01main.luaとconf.luaでLÖVEプロジェクトを開始
  2. 02フレームレート依存の移動を修正
  3. 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 を使用してください。

基本的なワークフロー

  1. エントリーポイントを確認します。 LÖVE ゲームは main.lua を実行します。ここでは love.load()(初期化を一度だけ実行)、love.update(dt)(状態更新)、love.draw()(描画)を定義します。ウィンドウとバージョンの設定は conf.lua に記述します(モジュールの読み込み前に実行されます)。
  2. バージョンを固定します。 LÖVE のバージョンが一致しない場合に警告が表示されるよう、conf.lua で t.version = "11.5" を設定します。
  3. すべての動きを dt(秒単位のデルタタイム)で制御し、フレームレートに依存しない速度にします。
  4. 入力は 2 通りで処理します。 ポーリング方式(押し続けているキーには、update 内の love.keyboard.isDown を使用)とイベント方式(単発のキー入力には、love.keypressed コールバックを使用)です。
  5. 画面(メニュー、ゲーム、ポーズ)を管理するには、if フラグを大量に並べるのではなく、小規模な状態スタックを使用します。「パターン」と references/state-stack.md を参照してください。
  6. 実行して動作を確認します。 プロジェクトフォルダーから 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 — 他の軽量ゲームエンジンにおける同様のループ概念。

コメント