在QML游戏中实现菜单系统的最佳实践?

时间:2018-04-20 13:16:25

标签: qt qml qtquick2

我对QML / QtQuick 2比较陌生,我非常喜欢它。为了开始掌握它,我正在实施一个小型全屏游戏。我的想法是拥有(简单)游戏,当使用时按下ESC键弹出带有某些设置的图形菜单。

现在我已经掌握了所有基础知识,但我并不完全确定哪种方法是管理菜单和来回传递键盘焦点的最佳声明方式。 最好是静态创建菜单并将其隐藏在我的主文件中,如下所示:

MyMenuSystem {
   visible: false
}

然后将其设置为"可见"什么时候需要它?或者推迟加载并使用Loader并创建一个新实例?我更喜欢在我的QML代码中声明它的清洁度,但这里的最佳做法是什么?或者是否有一些组件可以在我完全缺失的视图之间切换?我可以找到关于这个主题的非常少的信息和例子。谢谢!

2 个答案:

答案 0 :(得分:0)

你的问题有点广泛,可能会产生自以为是的答案,但由于这是一个让我心动的话题,我想我会尝试提出一些建议。

装载机

当我需要加载的项目仅在某些情况下相关时,我倾向于仅使用Loader。例如,如果打开的文档不支持某个功能,则表示该功能的UI元素可以放入Loader中。这样做的好处(除了(通常)非常小的性能提升)是它避免了为该功能添加大量空值检查的需要。例如,如果在这种情况下不使用Loader,最终可能会得到大量代码如下:

Makefile

使用Loader,您可以控制何时加载项目,以便仅在启用可选功能时加载项目。然后代码变得更好:

text: optionalFeature.foo ? optionalFeature.foo.bar : ""

弹出

对于游戏菜单,我会使用Popup。如果您希望用户能够在后台看到游戏,这是很好的,但如果您愿意,也可以使用overlay来模糊游戏。

StackView

如果您不想使用弹出窗口,那么我建议StackView。无论如何,您可能应该在游戏中的每个屏幕上使用它,因为它非常适合它。

答案 1 :(得分:0)

以下是我设法做菜单系统的方法: 我使用Component创建了一个Component,并使用createObject()将其转换为该组件的一个实例。

MyMenu.qml:

import QtQuick 2.9

Popup {
    /* Menu Item 1 */
    /* etc etc */

}

Game.qml:

Component {
   id: myMenuId
   MyMenu {

   }
}

Game {
  id: myGameId
property var dynamicItem
 Keys.onPressed: {
          if (event.key == Qt.Key_ESC) {
              dynamicItem = myMenuId.createObject(myGameId);
              dynamicItem.open()
           }

      }

}