Lua事件消息的写法

Lua事件消息的写法

概述

最近在学习Xlua与项目的结合,在这里我们要时间的内容有
监听事件消息,触发事件消息,移除事件消息,在监听与触发的时候都需要能够传值给监听方法

实现

写个基本的创建类的方法,用于给事件消息创建对象

function simpleclass()
	local class_type = {}
	class_type.new = function()
						local self = {}
						setmetatable( self , {__index = class_type})
						return self
					end
	return class_type
end

创建事件消息对象

require("simpleclass")
local EventMessage = simpleclass()
function EventMessage:Create()
	local obj = EventMessage:new()
	obj.data = {}
	return obj
end

添加监听

--[[
self.data 装的是事件信息表
结构分析
data [事件名]= {
callback  回调函数
enable    是否激活回调
attachParam 回调参数
}
]]
function EventMessage:AddNotify(event_name, callback, attachParam)
	if (event_name == nil
		or callback == nil
		or type(callback) ~= "function"
		or type(event_name) ~= "string") then
		__LogError("AddNotify error.param invaild")
		return
	end
	
	if (self.data[event_name] == nil) then
		self.data[event_name] = {}
	end
	
	for i,v in ipairs(self.data[event_name]) do 
		if (v.callback == callback) then
			if (v.enable == false) then
				v.enable = true
				v.attachParam = attachParam
			else
				__LogError("AddNotify error.repeat added.  "..event_name)
			end
			return
		end
	end
	
	table.insert(self.data[event_name], {callback = callback, attachParam = attachParam, enable = true})
end

移除监听并不会做删除操作,只是禁用

function EventMessage:RemoveNotify(event_name, callback)
	if (event_name == nil
		or callback == nil
		or type(callback) ~= "function"
		or type(event_name) ~= "string") then
		__LogError("RemoveNotify error.param invalid.")
		return
	end
	
	if (self.data[event_name] == nil) then
		return
	end
	
	for i,v in ipairs(self.data[event_name]) do 
		if (v.callback == callback) then
			v.enable = false
			return
		end
	end
end

消息触发

function EventMessage:Notify(event_name, value)
	if event_name ==nil or (self.data[event_name] == nil) then
		return
	end
	
	local flag = true
	for i,v in ipairs(self.data[event_name]) do
		if (v.enable == true) then
			v.callback(value, v.attachParam)
		else
			flag = false
		end
	end
	
	if (flag == false) then
		for i,v in ipairs(self.data[event_name]) do
			if (v.enable == false) then
				table.remove(self.data[event_name], i)
			end
		end
	end
end

使用

监听:
local function Refsh(val,self)
	print("现在的状态是"..val)
end

function AddNotify()
__EventMessage:AddNotify("StartGame", Refsh,self)		
end

移除
function RemoveNotify()
__EventMessage:RemoveNotify("StartGame", Refsh)		
end

触发
local function Start()
	__EventMessage:Notify("StartGame", "开始游戏")
end
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Lua中跨脚本调用事件可以通过以下步骤实现: 1. 定义事件名称和处理函数 在一个脚本中定义事件名称和对应的处理函数,例如: ```lua local function onPlayerDeath(playerName) print(playerName .. " has died!") end Events.Subscribe("PlayerDeath", onPlayerDeath) ``` 2. 触发事件 在另一个脚本中,通过`Events.Call`函数触发事件,例如: ```lua Events.Call("PlayerDeath", "John") ``` 这个调用会触发之前定义的`onPlayerDeath`函数,并输出`John has died!`。 3. 取消事件订阅(可选) 如果不再需要监听某个事件,可以取消订阅,例如: ```lua Events.Unsubscribe("PlayerDeath", onPlayerDeath) ``` 这将从事件列表中移除`onPlayerDeath`函数,不再接收对应事件的通知。 以上就是Lua跨脚本调用事件的基本写法。注意,不同脚本之间需要事先约定好事件名称和参数格式,以确保调用正确。 ### 回答2: 在lua中,跨脚本调用事件写法可以通过使用回调函数来实现。下面是一个示例: 首先,在第一个lua脚本中定义一个事件函数eventHandler: ```lua function eventHandler(data) print("Event received: " .. data) -- 在这里处理事件 end ``` 然后,在第二个lua脚本中需要调用事件的地方,可以通过调用第一个脚本中定义的eventHandler函数,并传递对应的数据作为参数: ```lua local script1 = require("script1") -- 引入第一个脚本 -- 调用事件函数,并传递数据 script1.eventHandler("Hello, Lua!") ``` 通过这种方式,可以在不同的lua脚本中进行跨脚本的事件调用。当第二个脚本执行到调用eventHandler函数的地方时,将会触发第一个脚本中定义的事件处理逻辑。 需要注意的是,为了使事件函数能够跨脚本调用,需要在第二个脚本中先引入第一个脚本,使得第一个脚本中的函数能够被第二个脚本访问到。 以上就是在lua中实现跨脚本调用事件的一种常用写法。 ### 回答3: 在Lua中,跨脚本调用事件写法可以通过使用Lua中的全局函数来实现。以下是一种常见的方法: 1. 首先,在调用脚本中定义一个事件函数(例如,函数名为"onEvent"),并在这个函数中编写需要执行的代码。 ```lua function onEvent() -- 在这里编写您的代码逻辑 print("事件已触发") end ``` 2. 在另一个脚本中需要调用这个事件的位置,可以使用`dofile`或者`require`函数加载并运行这个事件所在的脚本文件。 ```lua dofile("event_script.lua") -- 加载并执行事件脚本 ``` 3. 调用事件函数:在需要触发事件的位置,直接调用之前定义的事件函数。 ```lua onEvent() -- 调用事件函数 ``` 通过以上步骤,您可以实现从一个脚本中调用另一个脚本中定义的事件函数。请注意,在使用`dofile`或者`require`加载脚本时,务必保证脚本的路径正确并且脚本文件可被正确加载。另外,跨脚本调用事件时,需要确保所调用的函数已被定义和加载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值