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

学习资源

Love2D 是入门 2D 游戏开发最低门槛的选择之一——比 Unity / Godot 更轻量、更直接。

→ 下一篇 用 Lua 配置 Neovim