以角色系统为例,说明如何在传奇游戏脚本中实现模块化设计
下面以传奇游戏的角色系统为例,详细说明如何实现模块化设计。我会按照功能划分、接口设计、依赖管理等原则进行实现。角色系统的模块化设计
角色系统通常包含属性管理、技能、装备、背包等核心功能。以下是一个基于 Lua 的模块化实现示例:
plaintext
scripts/
└── character/
├── __init__.lua # 角色系统总入口
├── attributes.lua # 属性管理
├── skills.lua # 技能系统
├── equipment.lua # 装备系统
├── inventory.lua # 背包系统
└── states.lua # 状态管理(如buff、死亡等)
1. 核心模块实现
属性管理 (attributes.lua)
封装角色属性的计算和修改逻辑,处理基础属性、装备加成和状态影响。
lua
-- attributes.lua
local Attributes = {}
local base_attrs = {}-- 基础属性
local equip_bonus = {} -- 装备加成
local state_modifiers = {} -- 状态修饰符
-- 初始化角色属性
function Attributes.init(character_id, config)
base_attrs = config or {}
equip_bonus = {}
state_modifiers = {}
end
-- 获取属性最终值(基础 + 装备 + 状态)
function Attributes.get(character_id, attr_name)
local base = base_attrs or 0
local bonus = equip_bonus or 0
local modifier = state_modifiers or 1.0
return (base + bonus) * modifier
end
-- 添加状态修饰符(如buff加成)
function Attributes.add_modifier(character_id, attr_name, modifier)
state_modifiers =
(state_modifiers or 1.0) + modifier
end
-- 注册装备系统的属性变更回调
function Attributes.register_equip_callback(equip_system)
equip_system.on_equip_changed(function(char_id, attr_change)
equip_bonus = attr_change
end)
end
return Attributes
技能系统 (skills.lua)
管理角色技能的学习、释放和冷却,依赖属性系统提供的攻击力等数值。
lua
-- skills.lua
local Skills = {}
local skill_list = {}
local cooldown_timers = {}
local Attributes = require("character.attributes")
-- 初始化技能配置
function Skills.init(character_id, config)
skill_list = {}
cooldown_timers = {}
for _, skill_id in ipairs(config or {}) do
skill_list = true
end
end
-- 检查技能是否可用
function Skills.can_use(character_id, skill_id)
if not skill_list then
return false, "未学习技能"
end
local now = os.time()
if cooldown_timers and
cooldown_timers > now then
return false, "技能冷却中"
end
return true
end
-- 使用技能
function Skills.use(character_id, skill_id, target_id)
local can_use, reason = Skills.can_use(character_id, skill_id)
if not can_use then
return false, reason
end
local skill_config = require("config.skills")
if not skill_config then
return false, "技能配置不存在"
end
-- 计算技能伤害(依赖属性系统)
local attack = Attributes.get(character_id, "attack")
local damage = attack * skill_config.damage_factor
-- 触发伤害事件(由战斗系统监听)
require("combat.event_manager").trigger(
"skill_used", character_id, target_id, skill_id, damage)
-- 设置冷却时间
cooldown_timers =
os.time() + skill_config.cooldown
return true
end
return Skills
装备系统 (equipment.lua)
管理角色装备的穿戴、卸下和属性加成,与属性系统交互。
lua
-- equipment.lua
local Equipment = {}
local equipped_items = {}
local attribute_callbacks = {}
-- 初始化装备
function Equipment.init(character_id)
equipped_items = {
weapon = nil,
armor = nil,
helmet = nil,
-- 其他装备槽...
}
end
-- 穿戴装备
function Equipment.equip(character_id, item_id, slot)
local item_config = require("config.items")
if not item_config or item_config.slot ~= slot then
return false, "装备无效"
end
-- 卸下当前槽位装备
local old_item = equipped_items
if old_item then
Equipment.unequip(character_id, slot)
end
-- 穿戴新装备
equipped_items = item_id
-- 通知属性变更
Equipment.notify_attr_change(character_id)
return true
end
-- 卸下装备
function Equipment.unequip(character_id, slot)
equipped_items = nil
Equipment.notify_attr_change(character_id)
return true
end
-- 计算装备属性加成
function Equipment.calculate_attr_bonus(character_id)
local bonus = {}
for slot, item_id in pairs(equipped_items) do
if item_id then
local item = require("config.items")
for attr, value in pairs(item.attributes or {}) do
bonus = (bonus or 0) + value
end
end
end
return bonus
end
-- 注册属性变更回调
function Equipment.on_equip_changed(callback)
table.insert(attribute_callbacks, callback)
end
-- 通知属性变更
function Equipment.notify_attr_change(character_id)
local attrs = Equipment.calculate_attr_bonus(character_id)
for _, callback in ipairs(attribute_callbacks) do
callback(character_id, attrs)
end
end
return Equipment
2. 角色系统总入口 (__init__.lua)
整合所有子模块,提供统一接口。
lua
-- __init__.lua
local Character = {}
local Attributes = require("character.attributes")
local Skills = require("character.skills")
local Equipment = require("character.equipment")
local Inventory = require("character.inventory")
local States = require("character.states")
-- 创建新角色
function Character.create(character_id, config)
-- 初始化各子系统
Attributes.init(character_id, config.attributes)
Skills.init(character_id, config.skills)
Equipment.init(character_id)
Inventory.init(character_id, config.inventory)
States.init(character_id)
-- 建立模块间联系
Attributes.register_equip_callback(Equipment)
return {
-- 暴露接口
get_attribute = function(attr_name)
return Attributes.get(character_id, attr_name)
end,
use_skill = function(skill_id, target)
return Skills.use(character_id, skill_id, target)
end,
equip_item = function(item_id, slot)
return Equipment.equip(character_id, item_id, slot)
end,
-- 其他接口...
}
end
return Character
3. 使用示例
下面是如何使用这个角色系统的示例:
lua
-- main.lua
local Character = require("character")
local EventManager = require("combat.event_manager")
-- 创建角色
local player = Character.create("player1", {
attributes = {
attack = 100,
defense = 50,
health = 1000
},
skills = {1001, 1002}, -- 火球术和治疗术
inventory = {1, 2, 3}-- 初始物品ID
})
-- 监听技能使用事件
EventManager.on("skill_used", function(caster_id, target_id, skill_id, damage)
print(caster_id .. " 对 " .. target_id .. " 使用技能 " .. skill_id)
print("造成伤害: " .. damage)
end)
-- 使用技能
player.use_skill(1001, "monster1")
-- 装备武器
player.equip_item(10001, "weapon") -- 假设10001是一把剑
-- 打印更新后的攻击力
print("当前攻击力: " .. player.get_attribute("attack"))
4. 模块化设计的优势
可维护性:每个模块只关注单一职责,修改不会影响其他模块。
可扩展性:添加新功能(如坐骑系统)只需新增模块,无需改动现有代码。
可测试性:各模块可独立测试,例如单独测试装备系统的属性计算。
复用性:工具模块(如数学库)可被多个系统复用。
总结
通过将角色系统拆分为属性、技能、装备等独立模块,并定义清晰的接口和依赖关系,实现了高内聚、低耦合的设计。这种模式使代码更易于理解、维护和扩展,适合大型游戏项目的长期开发。
页:
[1]