Advertisement

< 山东大学软件学院项目实训 > 渲染引擎系统(四)

阅读量:

目录

前言

主要工作

一、生成菜单与次级菜单

二、完成基础的菜单布局

三、实现键盘快捷键


前言

本节主要讲述菜单、次级菜单、分隔符等的运用,以及工具栏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)

还没有任何评论哟~