本文整理自 CHUAN2《Lua速成班》直播课「Lua速成班 第十课 后端面向对象 class构造」,主讲:浮生梦。 课程体系:996 引擎传奇开发教学 · 威海旷世互娱教学基地
这是一节关于 996引擎 Lua后端开发 的课程,主要讲解 QF触发机制、面向对象封装和基础API调用。
核心操作:在996引擎中创建自定义Lua说明书,用于整理和查阅API接口。
为什么要重做说明书?
创建说明书步骤:
https://www.chuan2.cn/xueyuan/
练习代码:
-- 创建说明书后,在编辑模式中使用Markdown语法美化界面
-- 使用 # 表示标题,- 表示列表
-- 将API分类整理:引擎触发、脚本触发、系统函数
核心概念:QF(引擎回调)是996引擎的钩子(Hook)机制,用于实时监控游戏内事件。
Hook的工作方式:
建议:将QM和QF合并为一个入口文件,避免维护两个文件造成混乱。
练习代码:
-- 在初始化文件中统一加载所有模块
include("Market_Def/飞封装/初始化.lua")
require("envir/Market_Def/飞封装/跑步触发.lua")
核心接口:function chat(actor, message, type)
参数说明:
actor:触发者对象(身份证号概念,代表玩家自己)message:说话内容(字符串)type:说话类型(数字,如6表示附近说话)Object类型概念:
练习代码:
function chattrigger(actor, message, type)
p(actor, message, type) -- 打印三个参数查看
if message == "你好" then
actor:modifyLevel(1) -- 说"你好"就升1级
end
end
参数说明:
actor:玩家对象itemobj:装备对象(看起来是数字,实际是字符串类型)where:穿戴位置(1=武器,查看传2说明书中的装备位置常量)uid:装备唯一ID重要提示:
两种获取等级的方式对比:
方式一(Lua原生):local lv = getBaseInfo(actor, 6) —— 返回数字类型
方式二(TXT接口):local lv2 = getCount(actor, "<$level>") —— 返回字符串类型
常见错误:将数字和字符串直接比较会导致栈溢出错误。
解决方案:使用 tonumber() 进行类型转换。
性能提示:TXT接口耗时远高于Lua原生接口,仅在实在没有其他选择时才临时使用。
---
## 第六节:后端面向对象封装
**核心语法**:`local player = class(actor)`
**执行逻辑**:
1. `actor` 是玩家的"身份证号"(假对象)
2. `class` 是构造函数,调用 `player:new()`
3. 通过身份证实例化,创建包含完整属性和方法的"真对象"
**性能代价**:面向对象会牺牲10%-20%性能(额外内存开销),千人服以上不建议使用。
**封装原理**:在模块中将全局函数转为局部变量,提升30%速度。
**练习代码**:
lua
-- 在人物模块中声明类并封装常用函数
local player = {
new = function(self, actor)
if not isPlayer(actor) then return nil end
local obj = {actor = actor, type = "player"}
setmetatable(obj, {__index = self})
return obj
end,
getName = function(self)
return getBaseInfo(self.actor, 3) -- 3是名字字段
end,
move = function(self, map, x, y, dir)
mapMove(self.actor, map, x, y, dir)
end
}
return player
---
## 第七节:攻击触发与双对象操作
**核心接口**:`function attackdamage(actor, target, hiter)`
**面向对象实战**:
- 将`actor`封装为`player`对象(自己)
- 将`target`封装为`tar`对象(受击目标/怪物)
- 两个对象可以使用相同的方法,但操作的是不同实体
**练习代码**:
lua
--------- 注意接口大小写
function attackdamage(actor, target, hiter)
local player = class(actor) -- 实例化自己
local tar = class(target) -- 实例化怪物
p(player:getName(), tar:getName()) -- 打印双方名字
-- 让自己移动
player:move("0", -1, -1, 3)
-- 让怪物移动(相同方法,不同对象)
tar:move("0", -1, -1, 3)
end
---
## 第八节:Dump调试工具与全局变量
**Dump函数作用**:递归打印表中的所有内容,无需手动写for循环。
**查看全局变量**:`dump(_G)` 可打印所有全局接口,包括996定制的代理接口(约2%)。
**警告**:代理接口不一定稳定,随着更新可能被删除,谨慎使用。
**练习代码**:
lua
-- 打印局部表内容
local t = {name = "测试", data = {a = 1, b = 2}}
dump(t)
-- 查看所有全局变量(内容很多,慎用)
dump(_G)
---
## 课后作业
**作业1**:编写一个聊天触发功能,当玩家说"升级"时,如果当前等级小于10级,直接升到10级;如果大于等于10级,提示"已达到10级"。
**作业2**:编写穿戴触发功能,当玩家装备武器时(位置1),发送私信提示"武器已装备";装备衣服时(位置2),提示"衣服已装备"。其他位置不提示。
**作业3**:使用面向对象方式,在人物模块中添加`getLevel()`方法,返回玩家当前等级(数字类型)。然后在跑步触发中调用该方法,如果等级大于5级,发送消息"你是高级玩家"。
**作业4**:编写攻击触发功能,玩家攻击对方玩家,对方玩家等级提升1级,双开客户端!
---
本文为《Lua速成班》系列课程实录整理。想系统学习 996 引擎 Lua 开发,请查看[课程中心](https://www.chuan2.cn/courses/)与[更多技术文章](https://www.chuan2.cn/articles/)。全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
本文整理自 CHUAN2《Lua速成班》直播课「Lua速成班 第九课 后端面向对象和事件推送」,主讲:浮生梦。 课程体系:9…
本文整理自 CHUAN2《Lua速成班》直播课「Lua速成班 第十课 后端面向对象 class构造」,主讲:浮生梦。 课程体…
代码不说话, 让它自己说 。 print 是 Lua 战士的第一件武器——用好它,八成的 bug 不用看第二眼。 <styl…
新手爱问「我怎么知道玩家上线了」—— 你不用知道,框架会喊你 。轮询是你去问,事件是它来叫:理解事件推送,才算入了框架的门。…
框架给你几百个接口, 本质都是同一件事:参数进去,结果出来 。把「调用约定」刻进肌肉,说明书再厚也不慌。 <style .i…
obj:method() 和 obj.method() 就差一个冒号, self 却是天壤之别 。Lua 的面向对象全靠这颗…