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