39传奇素材网 发表于 2025-7-10 17:45:35

以角色系统为例,说明如何在传奇游戏脚本中实现模块化设计

下面以传奇游戏的角色系统为例,详细说明如何实现模块化设计。我会按照功能划分、接口设计、依赖管理等原则进行实现。
角色系统的模块化设计
角色系统通常包含属性管理、技能、装备、背包等核心功能。以下是一个基于 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]
查看完整版本: 以角色系统为例,说明如何在传奇游戏脚本中实现模块化设计