加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Lua消息处理入门

发布时间:2020-12-14 22:21:32 所属栏目:大数据 来源:网络整理
导读:把GUI的消息处理从代码中分离出来,并交给lua脚本处理,这样可以给你的界面带来很大的灵活性.GUI 的相关地东西可以在测试期间很轻松的修改. Lua中的负责处理消息的东西其实只不过是普普通通的只带一个参数的Lua函数而已.若想用它作事件 处理函数,你必须先在系

把GUI的消息处理从代码中分离出来,并交给lua脚本处理,这样可以给你的界面带来很大的灵活性.GUI
的相关地东西可以在测试期间很轻松的修改.
Lua中的负责处理消息的东西其实只不过是普普通通的只带一个参数的Lua函数而已.若想用它作事件
处理函数,你必须先在系统中注册它.所以除非你在初始化脚本中载入他们,你必须在处理相应事件之前
载入相关脚本文件.
载入脚本文件
有2种载入脚本文件的方法:使用c++代码或者在初始化脚本中使用Lua代码,由于Lua函数和相应的c++
函数一一对应,这2种方法看起来很像.
CEGUI::System::executeScriptFile(const?CEGUI::String?&filename,const?CEGUI::String&?resourceGroup="");
显然这个函数有两个参数:文件名和资源组。大多数情况下,可以不用管最后一个参数。
通过CEGUI指定的Lua脚本模块调用此函数就可以执行指定的Lua脚本文件。这意味着:你的程序可以访问脚本中文件定义的函数等所有东西了,当然,被定义为局部范围的除外。
例如,用C++可以这么写:
CEGUI::System::getSingleton().executeScriptFile("../datafiles/scripts/guiscript.lua");?

如果有错误产生,它会抛出一个异常。
用Lua可以这么写:
CEGUI.System:getSingleton():executeScriptFile("../datafiles/scripts/guiscript.lua")?

脚本文件中的全局代码也将被执行,所以要注意对每次执行进行必要的处理(使用一个计数器fx)。
注册事件到Lua函数
既然我们已经载入了脚本文件,下一步就可以绑定事件到脚本处理函数上了.
绑定Lua函数的函数与绑定C++函数的函数名称不同。
Event::Connection?subscribeScriptedEvent(const?String&?name,????
????????????????????????????????const?String&?subscriber_name);?
参数name是你要绑定的事件。参数subscriber_name为处理此事件的Lua函数的函数名。


调用完此函数后,指定的Lua函数就将成为那个事件的处理函数。而且它运行起来和C++版本的函数几乎一模一样(当然,不同的是:它是Lua脚本)。?
如下是绑定PushButton单击事件到一个Lua函数上的代码片段:


CEGUI::PushButton*?pb?=?(CEGUI::PushButton*)CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/Button","lua_powered_button");???
pb->setSize(CEGUI::Size(0.1f,0.1f));???
pb->setPosition(CEGUI::Point(0.1f,0.1f));???
pb->subscribeScriptedEvent("Clicked","luabtn_clicked");???
CEGUI::System::getSingleton().getGUISheet()->addChildWindow(pb);

这段代码将创建一个简单的TaharezLook按钮,把它的Clicked事件绑定到Lua函数luabtn_clicked中,然后把它添加到当前的GUI。
现在,我们看一下那个Lua事件处理函数:


function?luabtn_clicked(e)???
local?we?=?CEGUI.toWindowEventArgs(e)???
we.window:setText("handled?from?Lua");???
end?

它使得当按钮被按下时,它的文本会变成“handled?from?Lua”。
我们使用了一个公用的函数:

CEGUI.toWindowEventArgs(e)?

从它的名字可以看出:它把EventArgs参数转换为WindowEventArgs类型。其他的EventArgs类型也有类似的转换函数。?

在Layout文件中注册Lua事件处理函数
在Layout文件中绑定用Lua写的事件处理函数是很简单的。看下这个例子吧:
<?xml?version="1.0"?>???
<GUILayout>???
<Window?Type="TaharezLook/Button"?Name="lua_powered_button">???
<Property?Name="Width"?Value="0.1"?/>???
<Property?Name="Height"?Value="0.1"?/>???
<Property?Name="XPosition"?Value="0.1"?/>???
<Property?Name="YPosition"?Value="0.1"?/>???
<Event?Name="Clicked"?Function="luabtn_clicked"?/>???
</Window>???
</GUILayout>?

这个简单的layout文件所做的事和上面的C++代码是一样的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读