跳到主要内容

Lua 游戏编程

Lua 在游戏领域非常常见。很多游戏引擎会把 Lua 嵌入进去,让你用 Lua 编写关卡逻辑、角色行为、UI 脚本、技能配置和热更新逻辑。

如果你想直接用 Lua 做 2D 游戏,LÖVE 是一个很适合入门的框架。

Lua 在游戏中的角色

Lua 常见用途包括:

  • 游戏配置和数据表。
  • 关卡脚本。
  • NPC 行为逻辑。
  • UI 动画和交互。
  • 技能、道具、任务脚本。
  • 热更新业务逻辑。

底层渲染、物理、资源加载和平台适配通常由游戏引擎负责,Lua 负责更灵活的上层逻辑。

使用 LÖVE 写第一个窗口

安装 LÖVE 后,创建目录:

hello-love/
└── main.lua

main.lua 内容:

main.lua
function love.draw()
love.graphics.print("Hello, LÖVE!", 100, 100)
end

在目录外运行:

love hello-love

你会看到一个窗口,里面显示文字。

LÖVE 的三个常用回调

LÖVE 程序通常由几个回调函数组成:

回调说明
love.load()程序启动时调用一次
love.update(dt)每帧更新逻辑
love.draw()每帧绘制画面

示例:

main.lua
local x = 100
local speed = 120

function love.update(dt)
x = x + speed * dt
end

function love.draw()
love.graphics.circle("fill", x, 100, 20)
end

dt 表示距离上一帧经过的时间,单位是秒。使用 dt 可以让移动速度不依赖帧率。

键盘控制

main.lua
local x = 100
local y = 100
local speed = 150

function love.update(dt)
if love.keyboard.isDown("left") then
x = x - speed * dt
elseif love.keyboard.isDown("right") then
x = x + speed * dt
end

if love.keyboard.isDown("up") then
y = y - speed * dt
elseif love.keyboard.isDown("down") then
y = y + speed * dt
end
end

function love.draw()
love.graphics.circle("fill", x, y, 20)
end

运行后,你可以用方向键移动圆点。

一个简单状态机

游戏逻辑经常需要状态机。例如开始界面和游戏中:

main.lua
local state = "menu"

function love.keypressed(key)
if state == "menu" and key == "return" then
state = "playing"
elseif state == "playing" and key == "escape" then
state = "menu"
end
end

function love.draw()
if state == "menu" then
love.graphics.print("Press Enter to start", 100, 100)
elseif state == "playing" then
love.graphics.print("Playing... Press Esc to menu", 100, 100)
end
end

Lua 的 table 和函数很适合组织这种状态逻辑。

其他游戏框架和引擎

除了 LÖVE,你还可能遇到:

  • Defold:使用 Lua 编写游戏逻辑。
  • Solar2D:面向 2D 移动游戏。
  • Roblox:使用 Luau,Lua 的一种方言。
  • 自研引擎:常把 Lua 嵌入到 C++ 引擎中。

不同引擎的 API 差异很大。学习 Lua 语法只是第一步,真正开发游戏时还要学习对应引擎的生命周期、资源管理和调试工具。

小结

你需要掌握:

  • Lua 在游戏里常作为脚本语言嵌入引擎。
  • LÖVE 是适合入门的 Lua 2D 游戏框架。
  • love.load()love.update(dt)love.draw() 是 LÖVE 常用回调。
  • 使用 dt 可以让运动速度与帧率解耦。
  • 游戏逻辑常用 table、函数、状态机和模块组织。