Loading...
Loading...
Complete Love2D game development from prototype to polished release. Covers core architecture, graphics, animation, tiles, collision, audio, and iOS deployment. Use when building Love2D games, implementing game mechanics, or deploying to mobile platforms.
npx skill4agent add chongdashu/love2d-pocket-bomber-game love2d-gamedev| Topic | When to Use |
|---|---|
| Core Architecture | Understanding game loop, callbacks, modules |
| Graphics & Drawing | Images, colors, transforms, screen adaptation |
| Animation | Sprite sheets, quads, frame timing |
| Tiles & Maps | Tile-based levels, map loading |
| Collision | AABB, circle, and separating axis collision |
| Audio | Sound effects, music, volume control |
| Project Structure | File organization, conf.lua, distribution |
| Libraries | Popular community libraries |
| iOS Deployment | Build, touch controls, App Store |
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
enddt-- WRONG: Speed varies with frame rate
player.x = player.x + 5
-- RIGHT: 200 pixels per second, regardless of FPS
player.x = player.x + 200 * dtfunction 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
endfunction 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| Module | Purpose | Key Functions |
|---|---|---|
| Rendering | |
| Sound | |
| Keyboard input | |
| Mouse input | |
| Touch input | |
| File I/O | |
| Timing | |
| Window control | |
| Box2D physics | |
my-game/
├── main.lua # Entry point (required)
└── conf.lua # Configuration (optional but recommended)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
endlocal 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 Playerlocal 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| Don't | Why | Do Instead |
|---|---|---|
| Hard-code coordinates | Breaks on different screens | Use percentages or anchors |
Forget | Speed varies with frame rate | Multiply by |
Load assets in | Loads every frame, kills performance | Load once in |
| Use global variables everywhere | Hard to track, name collisions | Use local variables and modules |
| Test only on desktop | Touch behaves differently | Test on device early |
game.lovegame.love