分析 xLua.module.Event 文件夹内的方法

xLua.module.Event 模块主要用于处理事件(Event)系统。事件系统在游戏开发中非常常见,用于处理各种游戏事件,如玩家输入、单位事件、触发器事件等。以下是 xLua.module.Event 模块的主要方法及其使用说明:

主要方法

  1. reg(event_name, params)

    • 功能: 注册一个事件。
    • 参数:

      • event_name (string): 事件名称。
      • params (table): 包含以下字段的表:

        • type (string): 事件类型,例如 'unit''player' 等。
        • unit (unit, 可选): 单位对象(如果事件类型是单位事件)。
        • player (player, 可选): 玩家对象(如果事件类型是玩家事件)。
    • 返回值: 无。
  2. reReg(event_name, params)

    • 功能: 重新注册一个事件。
    • 参数:

      • event_name (string): 事件名称。
      • params (table, 可选): 重新注册事件时的参数。
    • 返回值: 无。
  3. notify(event_name, action, params)

    • 功能: 通知事件池中的事件。
    • 参数:

      • event_name (string): 事件名称。
      • action (string): 操作类型,例如 '注册事件''重新注册事件' 等。
      • params (table): 包含事件参数的表。
    • 返回值: 无。
  4. update(event_name, params)

    • 功能: 更新事件池中的事件。
    • 参数:

      • event_name (string): 事件名称。
      • params (table): 包含事件参数的表。
    • 返回值: 无。

使用案例

下面是一个具体的案例,展示了如何使用 xLua.module.Event 模块注册、更新和处理事件。

案例:注册和处理玩家事件

-- 引入必要的模块
local eventpool = require "xLua.module.EventPool"
local playerModule = require "xLua.module.Player"
local eventModule = require "xLua.module.Event"

-- 获取玩家对象(假设玩家1)
local player1 = playerModule[1]

-- 定义一个事件处理函数
local function onPlayerChat(event, params)
    print("玩家 " .. params.player.id .. " 发送了消息: " .. params.message)
end

-- 注册玩家聊天事件
eventModule.reg('玩家-聊天消息', {
    type = 'player',
    player = player1,
    on_update = onPlayerChat
})

-- 模拟玩家发送聊天消息
local function simulatePlayerChat(player, message)
    eventpool:update('玩家-聊天消息', {
        player = player,
        message = message
    })
end

-- 模拟玩家1发送聊天消息
simulatePlayerChat(player1, "Hello, World!")

扩展案例:注册和处理单位事件

下面是一个更复杂的案例,展示了如何使用 xLua.module.Event 模块注册、更新和处理单位事件。

扩展案例:注册和处理单位事件

-- 引入必要的模块
local eventpool = require "xLua.module.EventPool"
local playerModule = require "xLua.module.Player"
local unitModule = require "xLua.module.Unit"
local eventModule = require "xLua.module.Event"

-- 获取玩家对象(假设玩家1)
local player1 = playerModule[1]

-- 创建一个新的单位(假设单位类型为 'hpea')
local unit = unitModule:new({
    player = player1,
    id = 'hpea',
    x = 500,
    y = 500
})
print("单位创建成功,位置: x=" .. unit.x .. ", y=" .. unit.y)

-- 定义一个事件处理函数
local function onUnitDeath(event, params)
    print("单位 " .. params.unit.id .. " 死亡")
end

-- 注册单位死亡事件
eventModule.reg('单位-死亡', {
    type = 'unit',
    unit = unit,
    on_update = onUnitDeath
})

-- 模拟单位死亡事件
local function simulateUnitDeath(unit)
    eventpool:update('单位-死亡', {
        unit = unit
    })
end

-- 模拟单位死亡
simulateUnitDeath(unit)

完整案例:注册和处理多种事件

下面是一个更完整的案例,展示了如何注册和处理多种类型的事件,包括玩家事件和单位事件。

完整案例:注册和处理多种事件

-- 引入必要的模块
local eventpool = require "xLua.module.EventPool"
local playerModule = require "xLua.module.Player"
local unitModule = require "xLua.module.Unit"
local eventModule = require "xLua.module.Event"
local timer = require "xLua.module.Timer"

-- 获取玩家对象(假设玩家1)
local player1 = playerModule[1]

-- 创建一个新的单位(假设单位类型为 'hpea')
local unit = unitModule:new({
    player = player1,
    id = 'hpea',
    x = 500,
    y = 500
})
print("单位创建成功,位置: x=" .. unit.x .. ", y=" .. unit.y)

-- 定义一个玩家聊天事件处理函数
local function onPlayerChat(event, params)
    print("玩家 " .. params.player.id .. " 发送了消息: " .. params.message)
end

-- 注册玩家聊天事件
eventModule.reg('玩家-聊天消息', {
    type = 'player',
    player = player1,
    on_update = onPlayerChat
})

-- 定义一个单位死亡事件处理函数
local function onUnitDeath(event, params)
    print("单位 " .. params.unit.id .. " 死亡")
end

-- 注册单位死亡事件
eventModule.reg('单位-死亡', {
    type = 'unit',
    unit = unit,
    on_update = onUnitDeath
})

-- 模拟玩家发送聊天消息
local function simulatePlayerChat(player, message)
    eventpool:update('玩家-聊天消息', {
        player = player,
        message = message
    })
end

-- 模拟单位死亡事件
local function simulateUnitDeath(unit)
    eventpool:update('单位-死亡', {
        unit = unit
    })
end

-- 模拟玩家1发送聊天消息
simulatePlayerChat(player1, "Hello, World!")

-- 模拟单位死亡
simulateUnitDeath(unit)

-- 使用计时器模拟玩家发送聊天消息
local chatTimer = timer:new()
chatTimer:start(5, function(event, params)
    simulatePlayerChat(player1, "这是定时消息")
end, false)

-- 使用计时器模拟单位死亡
local deathTimer = timer:new()
deathTimer:start(10, function(event, params)
    simulateUnitDeath(unit)
end, false)

总结

xLua.module.Event 模块提供了一套完整的事件处理机制,包括注册、更新和处理事件。通过上述案例,你可以了解如何使用这些方法来处理游戏中的各种事件,从而实现更复杂的游戏逻辑和交互。


分析 xLua.module.EventPool 文件夹内的方法

xLua.module.EventPool 模块主要用于管理事件池(Event Pool),事件池是事件驱动编程中的一个重要概念,用于存储和分发事件。事件池可以处理各种类型的事件,如玩家输入、单位事件、触发器事件等。以下是 xLua.module.EventPool 模块的主要方法及其使用说明:

主要方法

  1. new(event_name)

    • 功能: 创建一个新的事件池。
    • 参数:

      • event_name (string): 事件名称。
    • 返回值: 事件池对象 (eventPool 类型)。
  2. update(event_name, params)

    • 功能: 更新事件池中的事件。
    • 参数:

      • event_name (string): 事件名称。
      • params (table): 包含事件参数的表。
    • 返回值: 无。
  3. reg(event_name, params)

    • 功能: 注册一个事件到事件池。
    • 参数:

      • event_name (string): 事件名称。
      • params (table): 包含以下字段的表:

        • type (string): 事件类型,例如 'unit''player' 等。
        • unit (unit, 可选): 单位对象(如果事件类型是单位事件)。
        • player (player, 可选): 玩家对象(如果事件类型是玩家事件)。
        • on_update (function, 可选): 事件处理函数。
    • 返回值: 无。
  4. reReg(event_name, params)

    • 功能: 重新注册一个事件到事件池。
    • 参数:

      • event_name (string): 事件名称。
      • params (table, 可选): 重新注册事件时的参数。
    • 返回值: 无。
  5. notify(event_name, action, params)

    • 功能: 通知事件池中的事件。
    • 参数:

      • event_name (string): 事件名称。
      • action (string): 操作类型,例如 '注册事件''重新注册事件' 等。
      • params (table): 包含事件参数的表。
    • 返回值: 无。

使用案例

下面是一个具体的案例,展示了如何使用 xLua.module.EventPool 模块创建、注册、更新和处理事件。

案例:使用事件池管理玩家聊天和单位死亡事件

-- 引入必要的模块
local eventpool = require "xLua.module.EventPool"
local playerModule = require "xLua.module.Player"
local unitModule = require "xLua.module.Unit"
local timer = require "xLua.module.Timer"

-- 获取玩家对象(假设玩家1)
local player1 = playerModule[1]

-- 创建一个新的单位(假设单位类型为 'hpea')
local unit = unitModule:new({
    player = player1,
    id = 'hpea',
    x = 500,
    y = 500
})
print("单位创建成功,位置: x=" .. unit.x .. ", y=" .. unit.y)

-- 创建一个新的事件池
local playerChatPool = eventpool:new('玩家-聊天消息')
local unitDeathPool = eventpool:new('单位-死亡')

-- 定义一个玩家聊天事件处理函数
local function onPlayerChat(event, params)
    print("玩家 " .. params.player.id .. " 发送了消息: " .. params.message)
end

-- 定义一个单位死亡事件处理函数
local function onUnitDeath(event, params)
    print("单位 " .. params.unit.id .. " 死亡")
end

-- 注册玩家聊天事件
playerChatPool:reg('玩家-聊天消息', {
    type = 'player',
    player = player1,
    on_update = onPlayerChat
})

-- 注册单位死亡事件
unitDeathPool:reg('单位-死亡', {
    type = 'unit',
    unit = unit,
    on_update = onUnitDeath
})

-- 模拟玩家发送聊天消息
local function simulatePlayerChat(player, message)
    playerChatPool:update('玩家-聊天消息', {
        player = player,
        message = message
    })
end

-- 模拟单位死亡事件
local function simulateUnitDeath(unit)
    unitDeathPool:update('单位-死亡', {
        unit = unit
    })
end

-- 模拟玩家1发送聊天消息
simulatePlayerChat(player1, "Hello, World!")

-- 模拟单位死亡
simulateUnitDeath(unit)

-- 使用计时器模拟玩家发送聊天消息
local chatTimer = timer:new()
chatTimer:start(5, function(event, params)
    simulatePlayerChat(player1, "这是定时消息")
end, false)

-- 使用计时器模拟单位死亡
local deathTimer = timer:new()
deathTimer:start(10, function(event, params)
    simulateUnitDeath(unit)
end, false)

完整案例:使用事件池管理多种事件

下面是一个更完整的案例,展示了如何使用 xLua.module.EventPool 模块创建、注册、更新和处理多种类型的事件,包括玩家事件和单位事件。

完整案例:使用事件池管理多种事件

-- 引入必要的模块
local eventpool = require "xLua.module.EventPool"
local playerModule = require "xLua.module.Player"
local unitModule = require "xLua.module.Unit"
local timer = require "xLua.module.Timer"

-- 获取玩家对象(假设玩家1)
local player1 = playerModule[1]

-- 创建一个新的单位(假设单位类型为 'hpea')
local unit = unitModule:new({
    player = player1,
    id = 'hpea',
    x = 500,
    y = 500
})
print("单位创建成功,位置: x=" .. unit.x .. ", y=" .. unit.y)

-- 创建一个新的事件池
local playerChatPool = eventpool:new('玩家-聊天消息')
local unitDeathPool = eventpool:new('单位-死亡')

-- 定义一个玩家聊天事件处理函数
local function onPlayerChat(event, params)
    print("玩家 " .. params.player.id .. " 发送了消息: " .. params.message)
end

-- 定义一个单位死亡事件处理函数
local function onUnitDeath(event, params)
    print("单位 " .. params.unit.id .. " 死亡")
end

-- 注册玩家聊天事件
playerChatPool:reg('玩家-聊天消息', {
    type = 'player',
    player = player1,
    on_update = onPlayerChat
})

-- 注册单位死亡事件
unitDeathPool:reg('单位-死亡', {
    type = 'unit',
    unit = unit,
    on_update = onUnitDeath
})

-- 模拟玩家发送聊天消息
local function simulatePlayerChat(player, message)
    playerChatPool:update('玩家-聊天消息', {
        player = player,
        message = message
    })
end

-- 模拟单位死亡事件
local function simulateUnitDeath(unit)
    unitDeathPool:update('单位-死亡', {
        unit = unit
    })
end

-- 模拟玩家1发送聊天消息
simulatePlayerChat(player1, "Hello, World!")

-- 模拟单位死亡
simulateUnitDeath(unit)

-- 使用计时器模拟玩家发送聊天消息
local chatTimer = timer:new()
chatTimer:start(5, function(event, params)
    simulatePlayerChat(player1, "这是定时消息")
end, false)

-- 使用计时器模拟单位死亡
local deathTimer = timer:new()
deathTimer:start(10, function(event, params)
    simulateUnitDeath(unit)
end, false)

-- 重新注册玩家聊天事件
local function onPlayerChatUpdated(event, params)
    print("更新后的玩家 " .. params.player.id .. " 发送了消息: " .. params.message)
end

playerChatPool:reReg('玩家-聊天消息', {
    on_update = onPlayerChatUpdated
})

-- 模拟玩家1发送更新后的聊天消息
simulatePlayerChat(player1, "更新后的消息")