love2d-gamedev について
Love2Dで2Dゲームを開発するためのリファレンススキルです。Luaの基本パターンからプロジェクト設定、iOSへのデプロイまでを扱います。
主な機能
- 01ゲームループとコールバックのパターン
- 02描画、アニメーション、マップ
- 03衝突判定と物理演算の手法
- 04オーディオと入力処理
- 05プロジェクト設定とiOSデプロイ
活用シーン
- 01Love2Dのゲームループを構成
- 02スプライト、マップ、衝突判定の追加
- 03キーボード、マウス、タッチ入力の処理
- 04ゲームのiOSデプロイ準備
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ chongdashu/ love2d-pocket-bomber-game --skill love2d-gamedevインストール後、Claude Code で/love2d-gamedevを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/animation.mdaudio.mdcollision.mdcore-architecture.mdgraphics-drawing.mdlibraries.mdproject-structure.mdtiles-maps.mdreferences/ios/overview.mdsetup.mdtouch-controls.mdxcode-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.physics | Box2D 物理演算 | 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 の概要 を参照してください。
- ビルドのセットアップ - Xcode プロジェクト、ライブラリ、署名
- タッチ操作 - 仮想ジョイスティック、ボタン、ジェスチャー
- Xcode プロジェクト構成 - pbxproj の手動編集
iOS の簡易チェックリスト:
- Love2D の iOS ソースと Apple ライブラリをダウンロードします
- ライブラリを Xcode プロジェクトにコピーします
- デプロイメントターゲットを修正します(8.0 → 15.0)
game.love(Lua ファイルを zip したもの)を作成しますgame.loveを Xcode バンドルのリソースに追加します- 署名を設定してデプロイします
哲学
Love2Dはシンプルさを通じて、ゲーム開発を楽しいものにします。
- Luaは取り組みやすい - 動的型付け、すっきりした構文、素早い反復
- APIに一貫性がある - 関数は予測しやすいパターンに従います
- ゲームループは自分で管理する - 隠れた仕組みはなく、完全に制御できます
- 標準でクロスプラットフォームに対応 - 同じコードがWindows、macOS、Linux、iOS、Androidで動作します
目標は単に「動くようにする」ことではありません。「最高の手触りにする」ことです。
滑らかなアニメーション、反応のよい操作、画面サイズに適応するレイアウト。これが、洗練されたゲームの標準です。
コメント
Markdown 対応