minetest源码解析二:GUIEngine初始化、菜单刷新流程以及核心函数介绍

GUIEngine初始化、菜单刷新流程以及核心函数介绍


一 流程图




二 流程图中涉及到的核心函数介绍


1.new TextDestGuiEngine

初始换创建一个TextDestGuiEngine类实例,用于后期点击界面上文字位置时通过guiFormSpecMenu获取到相应的文字,然后能够通过函数知道点击了MainMenu中的哪个Buttons或者Event。


主要涉及到以及两个函数:

minetest中的guiEngine.cpp

void TextDestGuiEngine::gotText(std::map<std::string,std::string> fields)

{

m_engine->getScriptIface()->handleMainMenuButtons(fields);

}


/******************************************************************************/

void TextDestGuiEngine::gotText(std::wstring text)

{

m_engine->getScriptIface()->handleMainMenuEvent(wide_to_narrow(text));

}



2.create texture source

m_texture_source = newMenuTextureSource(m_device->getVideoDriver());



3.create formspecsource

m_formspecgui = newFormspecFormSource("");

这个实例中主要一个作用存scriptapilua文件中读取的值,譬如菜单界面显示的那些文字,以及那些按钮、tab的选中在状态等。lua文件中的数据能通过*/MineT.app/Contents/Resources/share/builtin/mainmenu/*.lua文件读取出来的,具体读取在loadMainMenuScript


主要 涉及的函数

mintest->script->lua_api->l_mainmenu.cpp

int ModApiMainMenu::l_update_formspec(lua_State *L)

{

//read formspec

std::string formspec(luaL_checkstring(L,1));

engine->m_formspecgui->setForm(formspec);

...

}



4.create menu


minetest->guiFormSpecMenu.h     minetest->modalMenu.h

m_menu = newGUIFormSpecMenu(m_device,m_parent, -1,m_menumanager, NULL,NULL,m_texture_source,m_formspecgui,m_buttonhandler,NULL);

GUIFormSpecMenu::GUIModalMenu::IGUIElement

创建这个对象,主要作用是创建出Menu菜单中一系列界面元素。

控件的层次关系是gui环境的最顶层的staticText(在mymain中加入的,即这里的m_parent);然后是m_menu这个IGUIElement控件;最后是通过m_formspecgui解析出来的所有控件(button、tab、checkbox、staticText等等),这些控件是m_menu的子控件。



主要涉及函数

void GUIFormSpecMenu::regenerateGui(v2u32 screensize)

{

std::vector<std::string> elements =split(m_formspec_string,’]’);//界面所有元素

for (unsignedint i=0;i< elements.size();i++) 

{

parseElement(&mydata,elements[i]);

}


}

void GUIFormSpecMenu::parseElement(parserData* data,std::string element);解析所有子控件的。



5.Initialize scripting


minetest->script->scripting_mainmenu.h  minetest->script->cpp_api->s_mainmenu.h

m_script = newMainMenuScripting(this);

作用:初始化一些lua相关的模块接口等(初始化lua_State *L、注册lua_State *L等)



6.loadMainMenuScript

加载主菜单的脚本,读取*/MineT.app/Contents/Resources/share/builtin/mainmenu/*.lua文件,存在m_formspecgui中。


主要涉及函数

minetest->script->cpp_api->s_base.cpp

bool ScriptApiBase::loadScript(conststd::string &scriptpath)

int ret = luaL_loadfile(L, scriptpath.c_str()) ||lua_pcall(L, 0,0, m_errorhandler);

mintest->script->lua_api->l_mainmenu.cpp->l_update_formspec

int ModApiMainMenu::l_update_formspec(lua_State *L)

{

//read formspec

std::string formspec(luaL_checkstring(L,1));

engine->m_formspecgui->setForm(formspec);

...

}



7.run

主要的菜单界面刷新就是这个函数。这个函数中主要是一个循环,使用了鬼火引擎渲染绘制方式。


device->run()这个控制的循环,同时界面响应也是从这里为入口的。


场景主要绘制:云

GUI环境绘制:菜单界面上的控件


这个函数一直循环,直到界面上点击了start game之后m_startgame =false之后推出循环。

mintest->script->lua_api->l_mainmenu.cpp->l_start


CIrrDevice::run()->CIrrDevice::postEventFromUser()->CGUIEnvironment::postEventFromUser()->CGUITabControl:onEvent()->GUIFormSpecMenu::OnEvent()->acceptInput()->TextDestGuiEngine::gotText->ScriptApiMainMenu::handleMainMenuButtons()->ModApiMainMenu::l_start(lua_State *L):engine->m_startgame =true;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值