minetest源码解析三:菜单响应以及核心函数介绍

菜单响应以及核心函数介绍


一 流程图




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


1.点击响应鼠标事件

在device->run()控制的循环体内,一直循环,当有鼠标事件时,CIrrDevice::run()->CIrrDevice::postEventFromUser()->CGUIEnvironment::postEventFromUser()->CGUITabControl:onEvent()->GUIFormSpecMenu::OnEvent()->acceptInput()->TextDestGuiEngine::gotText->ScriptApiMainMenu::handleMainMenuButtons()


第一个代码中可以控制接受到的event事件是GUIFormSpecMenu::OnEvent()

主要涉及函数

acceptInput()

{

m_text_dst->gotText(fields);

}


这里的m_text_dst就是最初创建的TextDestGuiEngine对象。可以执行如下操作,最终更改了m_formspecgui存的控件以及控件属性值。

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

{

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

}


void ScriptApiMainMenu::handleMainMenuButtons(std::map<std::string,std::string> fields)

{

// Call it

if (lua_pcall(L,1, 0,m_errorhandler))

scriptError();

}


int ModApiMainMenu::l_update_formspec(lua_State *L)

{

if (engine->m_formspecgui !=0) {

engine->m_formspecgui->setForm(formspec);

}

}



2.CGUIEnvironment绘制

流程如下:CGUIEnvironment::drawAll()->IGUIElement:draw()->GUIModalMenu:draw()->GUIFormSpecMenu:drawMenu()-> 获取m_form_src->getForm(),即m_formspecgui刚刚响应界面后设置的值->regenerateGui()->parseElement()->parseButton()->Environment->addButton()


主要涉及函数

void GUIFormSpecMenu::drawMenu()

{

if(m_form_src)

{

std::string newform =m_form_src->getForm();

if(newform !=m_formspec_string)

{

m_formspec_string = newform;

regenerateGui(m_screensize_old);

}

}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值