mcpField
L
love2d-gamedev

love2d-gamedev

github.com/chongdashu開発1893 回インストール39 週間前に更新
リポジトリ

love2d-gamedev について

Love2Dで2Dゲームを開発するためのリファレンススキルです。Luaの基本パターンからプロジェクト設定、iOSへのデプロイまでを扱います。

主な機能

  1. 01ゲームループとコールバックのパターン
  2. 02描画、アニメーション、マップ
  3. 03衝突判定と物理演算の手法
  4. 04オーディオと入力処理
  5. 05プロジェクト設定とiOSデプロイ

活用シーン

  1. 01Love2Dのゲームループを構成
  2. 02スプライト、マップ、衝突判定の追加
  3. 03キーボード、マウス、タッチ入力の処理
  4. 04ゲームのiOSデプロイ準備

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/chongdashu/love2d-pocket-bomber-game --skill love2d-gamedev

インストール後、Claude Code で/love2d-gamedevを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
animation.md
audio.md
collision.md
core-architecture.md
graphics-drawing.md
libraries.md
project-structure.md
tiles-maps.md
references/ios/
overview.md
setup.md
touch-controls.md
xcode-project.md

詳細

Love2D ゲーム開発

Love2D フレームワークを使って、最初のプロトタイプから iOS リリースまで、完成度の高い 2D ゲームを開発します。

クイックリファレンス

トピック使用する場面
コアアーキテクチャゲームループ、コールバック、モジュールの理解
グラフィックスと描画画像、色、変換、画面への適応
アニメーションスプライトシート、クワッド、フレームのタイミング
タイルとマップタイルベースのレベル、マップの読み込み
衝突判定AABB、円、分離軸による衝突判定
オーディオ効果音、音楽、音量制御
プロジェクト構成ファイルの整理、conf.lua、配布
ライブラリ人気のコミュニティライブラリ
iOS デプロイビルド、タッチ操作、App Store

Love2D のゲームループ

すべての Love2D ゲームは、次のパターンに従います。

function love.load()
    -- Called once at startup
    -- Load assets, initialize state
end

function love.update(dt)
    -- Called every frame
    -- dt = time since last frame (seconds)
    -- Update game logic here
end

function love.draw()
    -- Called every frame after update
    -- All rendering happens here
end

重要なポイント:dt(デルタタイム)を使うと、フレームレートに左右されず速度を一定に保てます。

-- WRONG: Speed varies with frame rate
player.x = player.x + 5

-- RIGHT: 200 pixels per second, regardless of FPS
player.x = player.x + 200 * dt

基本的なパターン

画像の読み込みと描画
function love.load()
    playerImage = love.graphics.newImage("player.png")
end

function love.draw()
    love.graphics.draw(playerImage, x, y)
    -- Full signature: draw(image, x, y, rotation, scaleX, scaleY, originX, originY)
end
入力処理
-- Polling (check every frame)
function love.update(dt)
    if love.keyboard.isDown("left") then
        player.x = player.x - 200 * dt
    end
end

-- Event-based (fires once per press)
function love.keypressed(key)
    if key == "space" then
        player:jump()
    end
end
画面サイズに適応した配置

画面の寸法をハードコードしないでください。

function love.load()
    screenW, screenH = love.graphics.getDimensions()
end

function love.resize(w, h)
    screenW, screenH = w, h
end

function love.draw()
    -- Position relative to screen
    local centerX = screenW / 2
    local bottomY = screenH - 50
end

コアモジュール

モジュール用途主な関数
love.graphics描画draw、rectangle、circle、print、setColor
love.audioサウンドnewSource、play、stop、setVolume
love.keyboardキーボード入力isDown、keypressed コールバック
love.mouseマウス入力getPosition、isDown、コールバック
love.touchタッチ入力touchpressed、touchmoved、touchreleased
love.filesystemファイル入出力read、write、getInfo
love.timerタイミングgetDelta、getTime、getFPS
love.windowウィンドウ制御setMode、getMode、setTitle
love.physicsBox2D 物理演算newWorld、newBody、newFixture

プロジェクトのセットアップ

最小限のプロジェクト
my-game/
├── main.lua      # Entry point (required)
└── conf.lua      # Configuration (optional but recommended)
conf.lua テンプレート
function love.conf(t)
    t.window.title = "My Game"
    t.window.width = 800
    t.window.height = 600
    t.version = "11.5"              -- Love2D version
    t.console = true                -- Enable console on Windows

    -- Disable unused modules for faster startup
    t.modules.joystick = false
    t.modules.physics = false
end
ゲームの実行
# macOS
/Applications/love.app/Contents/MacOS/love /path/to/game

# Create alias in ~/.zshrc
alias love="/Applications/love.app/Contents/MacOS/love"

よく使われるパターン

状態管理
local gameState = "menu"  -- menu, playing, paused, gameover

function love.update(dt)
    if gameState == "playing" then
        updateGame(dt)
    end
end

function love.draw()
    if gameState == "menu" then
        drawMenu()
    elseif gameState == "playing" then
        drawGame()
    end
end
オブジェクト指向のエンティティ
local Player = {}
Player.__index = Player

function Player:new(x, y)
    return setmetatable({
        x = x, y = y,
        speed = 200,
        image = love.graphics.newImage("player.png")
    }, Player)
end

function Player:update(dt)
    if love.keyboard.isDown("right") then
        self.x = self.x + self.speed * dt
    end
end

function Player:draw()
    love.graphics.draw(self.image, self.x, self.y)
end

return Player
カメラ/ビューポート
local camera = { x = 0, y = 0 }

function love.draw()
    love.graphics.push()
    love.graphics.translate(-camera.x, -camera.y)

    -- Draw world objects here
    drawWorld()

    love.graphics.pop()

    -- Draw UI here (not affected by camera)
    drawUI()
end

避けるべきアンチパターン

しないこと理由代わりにすること
座標をハードコードする画面サイズが異なると崩れます割合またはアンカーを使います
移動処理で dt を使わないフレームレートによって速度が変わりますdt を掛けます
update/draw 内でアセットを読み込む毎フレーム読み込まれ、パフォーマンスが低下しますlove.load で一度だけ読み込みます
あらゆる箇所でグローバル変数を使う追跡しにくく、名前が衝突しますローカル変数とモジュールを使います
デスクトップでしかテストしないタッチ操作は挙動が異なります早い段階で実機テストをします

iOS 開発

iOS へのデプロイについては、以下を扱う iOS の概要 を参照してください。

iOS の簡易チェックリスト:

  1. Love2D の iOS ソースと Apple ライブラリをダウンロードします
  2. ライブラリを Xcode プロジェクトにコピーします
  3. デプロイメントターゲットを修正します(8.0 → 15.0)
  4. game.love(Lua ファイルを zip したもの)を作成します
  5. game.love を Xcode バンドルのリソースに追加します
  6. 署名を設定してデプロイします

哲学

Love2Dはシンプルさを通じて、ゲーム開発を楽しいものにします。

  1. Luaは取り組みやすい - 動的型付け、すっきりした構文、素早い反復
  2. APIに一貫性がある - 関数は予測しやすいパターンに従います
  3. ゲームループは自分で管理する - 隠れた仕組みはなく、完全に制御できます
  4. 標準でクロスプラットフォームに対応 - 同じコードがWindows、macOS、Linux、iOS、Androidで動作します

目標は単に「動くようにする」ことではありません。「最高の手触りにする」ことです。

滑らかなアニメーション、反応のよい操作、画面サイズに適応するレイアウト。これが、洗練されたゲームの標準です。

コメント