使用Qt为基于文本的游戏制作GUI

时间:2011-05-26 23:48:43

标签: c++ model-view-controller qt user-interface

我和我的同学决定在夏天做一场比赛。起初我们决定使它成为一个基于文本的控制台应用程序,但后来我可以使用Qt为游戏创建一个GUI。我玩了一下,能够创建小部件和什么不是,但无法做一件事。例如,我们的游戏包含一个Player类。我在main.cpp中创建了一个虚拟播放器,然后尝试通过按下按钮使播放器信息显示在标签上。经过多次尝试,我能够做到的唯一方法就是将玩家放在mainwindow.cpp中。有没有办法显示在main.cpp中制作的播放器的信息?如何通过不同的窗口(例如战斗窗口,库存窗口等)访问数据

3 个答案:

答案 0 :(得分:2)

main.cpp尽可能精简是一件好事,它不应该包含很多代码。

如果我理解正确你有几个窗口(可能很简单QWidgets没有父版或QMainWindows)在同一个QApplication上运行,并且你想在它们之间共享数据?为什么不在两个窗口共享一个Player指针?

您的main.cpp将如下所示:

QApplication app(argc,argv);
YourWindows1 mw1;
YourWindows2 mw2;
Player player;
mw1.setPlayer(&player);
mv2.setPlayer(&player);
mw1.show();
mw2.show();
app.exec();

更奇特的方式,可能是使用单身人士。这个单例可以拥有并保存你的Player实例,每个窗口都可以随时静态访问这个单例以获取Player信息。这对你来说可能是有用的东西。

注意:我不确切地知道这里有什么问题,也许你可以分享更多关于导致你麻烦的细节......

答案 1 :(得分:1)

在典型的Qt应用程序中,main.cpp仅用于启动单个应用程序UI对象,然后将控制权转移到Qt的事件处理程序。有可能偏离该模型,但除非你对Qt很有经验,否则它不会被推荐。

答案 2 :(得分:0)

我同意本主题中的其他海报,因为您的主要功能应尽可能保持精简。你只想生成一个新的游戏实例,然后让游戏循环或状态控制管理器来处理剩下的事情。它基本上归结为这样的事情:

class Game{
    Game();
    ~Game();
    int OnExecute();
};

int Game::OnExecute(){
    while(running){
        // do game stuff
    }
    return 0; // No errors, game closed correctly.
}

int main(int argc, char* argv[]){
    Game myGame;
    myGame.OnExecute();
}

在游戏进入主循环之前,所有初始化方法/代码都包含在OnExecute函数中。在主while(running)循环中,您可以调用每帧的Update和Rendering函数来控制逻辑计算,如实体位置,物理更新,AI更新等,然后渲染该帧的所有内容。这显然是一种超级简单的策略,但它确实帮助我准确掌握游戏引擎的工作原理。

现在,就Qt而言,我已经尝试了你正在尝试的东西,这并不容易。 Qt,虽然它可以被装配用于游戏界面等,但在我看来,主要用于应用程序而不是游戏。如果您需要程序中的简单表单和按钮,它提供了出色的功能,但就定制设计的HUD等而言,您将希望在其他地方寻找以避免大量麻烦。但是,有大量可扩展的GUI库专门用于游戏。我建议只根据OpenGL寻找一个,因为大多数图形/游戏引擎都建立在它之上并且可以非常好地集成。