Love2D 是什么
LÖVE(Love2D)——免费开源 2D 游戏框架,用 Lua 5.1(LuaJIT)写代码。
- 跨平台:Windows / macOS / Linux / Android / iOS
- 自带:图形、音频、物理(Box2D)、输入、网络
- 打包简单:zip 文件 + 执行体 = 可分发
安装
# macOS
brew install --cask love
# Windows / Linux: love2d.org 下载
love --version # 11.5
项目结构
最简一个游戏 = 一个文件夹 + main.lua:
mygame/
└── main.lua
运行:
love mygame/
三个钩子函数
-- main.lua
function love.load()
-- 启动时调用一次:加载资源、初始化状态
end
function love.update(dt)
-- 每帧调用,dt 是上一帧的秒数(如 1/60)
end
function love.draw()
-- 每帧绘制
end
小球弹跳例(30 行)
local ball
function love.load()
love.window.setTitle("Bouncing Ball")
ball = {
x = 100, y = 100,
vx = 200, vy = 150,
r = 20,
}
end
function love.update(dt)
ball.x = ball.x + ball.vx * dt
ball.y = ball.y + ball.vy * dt
local w, h = love.graphics.getDimensions()
if ball.x - ball.r < 0 or ball.x + ball.r > w then
ball.vx = -ball.vx
end
if ball.y - ball.r < 0 or ball.y + ball.r > h then
ball.vy = -ball.vy
end
end
function love.draw()
love.graphics.setColor(0.9, 0.3, 0.3)
love.graphics.circle("fill", ball.x, ball.y, ball.r)
love.graphics.setColor(1, 1, 1)
love.graphics.print("FPS: " .. love.timer.getFPS(), 10, 10)
end
跑 love . 看小球弹跳。
输入
function love.keypressed(key)
if key == "escape" then love.event.quit() end
if key == "space" then jump() end
end
function love.update(dt)
-- 实时按键检测
if love.keyboard.isDown("right") then x = x + 200 * dt end
end
function love.mousepressed(x, y, button)
print("click", x, y, button)
end
加载图片
function love.load()
img = love.graphics.newImage("assets/player.png")
end
function love.draw()
love.graphics.draw(img, 100, 100)
end
PNG / JPG 都支持。newImage 返回的对象可以缩放、旋转、染色——love.graphics.draw(img, x, y, rotation, sx, sy)。
音频
function love.load()
bgm = love.audio.newSource("music.mp3", "stream")
bgm:setLooping(true)
bgm:play()
sfx_jump = love.audio.newSource("jump.wav", "static")
end
function jump()
sfx_jump:stop()
sfx_jump:play()
end
"stream" 边播边读(音乐);"static" 整文件读入内存(短音效)。
物理(Box2D)
function love.load()
world = love.physics.newWorld(0, 9.81 * 64) -- 重力(像素 / s²)
ground = {}
ground.body = love.physics.newBody(world, 400, 580, "static")
ground.shape = love.physics.newRectangleShape(800, 20)
ground.fixture = love.physics.newFixture(ground.body, ground.shape)
ball = {}
ball.body = love.physics.newBody(world, 400, 100, "dynamic")
ball.shape = love.physics.newCircleShape(20)
ball.fixture = love.physics.newFixture(ball.body, ball.shape, 1)
ball.fixture:setRestitution(0.7)
end
function love.update(dt)
world:update(dt)
end
function love.draw()
love.graphics.polygon("line", ground.body:getWorldPoints(ground.shape:getPoints()))
love.graphics.circle("line", ball.body:getX(), ball.body:getY(), 20)
end
打包发布
# 把 mygame 文件夹打成 zip,改后缀
cd mygame
zip -r ../mygame.love .
# Linux/macOS:用户能用 love mygame.love 直接跑
# Windows:把 mygame.love 拼接到 love.exe:
copy /b love.exe + mygame.love game.exe
学习资源
- 官方 wiki:love2d.org/wiki
- 教程:sheepolution.com/learn/book
- 模板 / 库:hump(状态机、计时器、相机)、bump.lua(AABB 碰撞)
Love2D 是入门 2D 游戏开发最低门槛的选择之一——比 Unity / Godot 更轻量、更直接。
→ 下一篇 用 Lua 配置 Neovim