< 山东大学软件学院项目实训 > 渲染引擎系统(四)
发布时间
阅读量:
阅读量
目录
前言
主要工作
一、生成菜单与次级菜单
二、完成基础的菜单布局
三、实现键盘快捷键
前言
本节主要讲述菜单、次级菜单、分隔符等的运用,以及工具栏UI的实现,并实现快捷键功能。
主要工作
本项目使用的软件框架中,包含了UI组件的使用方法,本节的主要工作就是使用对应的函数,实现UI界面的布局以及界面的开启、关闭、快捷键的功能。
一、生成菜单与次级菜单
菜单等组件的生成可以在void MogwaiSettings::renderMainMenu(Gui* pGui)函数中实现。
void MogwaiSettings::renderMainMenu(Gui* pGui)
{
if (mAutoHideMenu && mMousePosition.y >= 20) return;
auto m = Gui::MainMenu(pGui);
}
函数的最开始保留了鼠标操作的判定,如果隐藏工具栏或鼠标坐标y值大于等于20时,该函数不进行具体功能。否则,使用Gui内置函数创建主菜单父级对象。
之后,便可以根据自身需求,使用功能函数生成添加相应的UI组件。
auto file = m.dropdown("File");
if (file.item("Load Script", "Ctrl+O")) mpRenderer->loadScriptDialog();
if (file.item("Save Config")) mpRenderer->saveConfigDialog();
if (file.item("Load Scene", "Ctrl+Shift+O")) mpRenderer->loadSceneDialog();
if (file.item("Reset Scene")) mpRenderer->setScene(nullptr);
file.separator();
if (file.item("Reload RenderGraph and Shaders", "F5")) RenderPassLibrary::instance().reloadLibraries(gpFramework->getRenderContext());
file.separator();
其中,m是主菜单父级对象,其成员函数dropdown用于生成一个下拉菜单,参数为菜单的文本。

之后使用下拉菜单的成员函数item生成选项,参数1为选项文本,参数2为按钮快捷键文本(可选)。为了与具体的功能对应,通过if判断按钮状态,若选项被点击则调用对应的功能函数,功能函数的实现不在此处讨论。

二、完成基础的菜单布局
一一实现主要功能的交互接口
{
auto view = m.dropdown("View");
view.item("Graph UI", mShowGraphUI, "F6");
view.item("Auto Hide", mAutoHideMenu, "F11");
view.item("Window Size", mShowWinSize);
view.separator();
view.separator();
view.item("Console", mShowConsole, "`");
}
{
auto view = m.dropdown("Play");
view.item("FPS", mShowFps, "F10");
view.item("Time", mShowTime, "F9");
view.separator();
}
{
auto help = m.dropdown("Help");
if (help.item("Shortcuts")) shortcuts();
help.separator();
if (help.item("About")) about();
}

三、实现键盘快捷键
在上文的下拉菜单选项中,为了实现快捷键功能,在键盘交互事件中编写快捷键函数。
bool MogwaiSettings::keyboardEvent(const KeyboardEvent& e)
{
if (e.type == KeyboardEvent::Type::KeyPressed)
{
if (e.hasModifier(Input::Modifier::Alt)) return false;
}
return false;
}
首先,第一个if条件为单独按下一个键的情况,之后使用switch语句判断输入字符,执行对应的操作,例如,F1键会呼出快捷键提示窗口;F10键将FPS窗口的显示状态翻转,可以显示或隐藏窗口……其余也是类似。
if (e.mods == Input::ModifierFlags::None)
{
switch (e.key)
{
case Input::Key::F1:
shortcuts();
break;
case Input::Key::F10:
mShowFps = !mShowFps;
break;
case Input::Key::F11:
mAutoHideMenu = !mAutoHideMenu;
break;
case Input::Key::F6:
mShowGraphUI = !mShowGraphUI;
break;
case Input::Key::F9:
mShowTime = !mShowTime;
break;
default:
return false;
}
return true;
}
第二个if条件中,以Ctrl作为modifier,即组合键修饰前缀,当键盘输入为O时,使用三目运算符判断是否按下Shift,以此分别执行加载script或scene的功能。
else if (e.hasModifier(Input::Modifier::Ctrl))
{
if (e.key == Input::Key::O)
{
e.hasModifier(Input::Modifier::Shift) ? mpRenderer->loadSceneDialog() : mpRenderer->loadScriptDialog();
return true;
}
else return false;
}
后续需要键盘响应的功能,都将在此处添加。
全部评论 (0)
还没有任何评论哟~
