如何在c++ /Qt中设置30fps循环
How to set up a 30fps loop in C++/Qt
我目前正在用Qt在c++中为学校开发一个小型游戏/模拟,我有一些Java背景。我的问题是如何设置一个基本的游戏循环与Qt在800/600窗口。我试图绘制到一个GraphicsView-window与覆盖的paintEvent,但我不能设置这样的循环,我有某种错误与覆盖它。
#include "mainwindow.h"
#include <QGraphicsView>
#include "graphicsview.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
resize(800, 600);
setWindowTitle("A* Pathfinder");
gView = new GraphicsView(this);
setCentralWidget(gView);
}
MainWindow::~MainWindow()
{
}
GraphicsView-class:
#include "graphicsView.h"
void GraphicsView::paintEvent(QPaintEvent *event) {
QPainter painter(this);
painter.drawLine(10,10, 100,100);
}
graphicsView.h:
#ifndef GRAPHICSVIEW_H
#define GRAPHICSVIEW_H
#endif // GRAPHICSVIEW_H
#include <QGraphicsView>
class GraphicsView : public QGraphicsView
{
protected:
void paintEvent(QPaintEvent *event);
};
抱歉,如果类似的问题已经问了,但我真的卡住了,不能找到我的具体情况的帮助。同样,我想要一个800x600的窗口,我可以在其中以30fps绘制图形。
首先,您正在朝着错误的方向前进-您不需要覆盖QGraphicsView
,一个股票就足够了。您不需要重写paintEvent()
-它不会做您认为它做的事情。你不渲染你的场景在那里,这是代码只渲染帧的视图-如何空视图看起来,而不是视图包含什么。
如果你有自定义绘图,而不是由库存图形项目(如矩形,文本,弧线等)提供,你需要实现自己的QGraphicsItem
并实现其paint()
功能-这就是它的工作方式,每个项目负责其绘画,场景只是管理所有项目,视图只是可视化场景。
你肯定不希望计时器以固定速率发射,这是一个非常幼稚和糟糕的解决方案。它没有考虑到渲染和游戏逻辑处理所花费的时间,如果你想要一个稳定的帧率,你就需要考虑到这些变量。
30 FPS意味着你必须每33.33毫秒生成一帧。所以你需要根据前一帧所花的时间来安排接下来的每一帧。例如,如果上一帧花了15毫秒,你需要在33.33 - 15
毫秒内调度下一帧,实现更细粒度的控制和更稳定的帧率,只要你的CPU能跟上。
您可以使用静态函数QTimer::singleShot()
以自定义间隔调度每个后续帧。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何在24位SDL_Surface上设置像素的颜色
- std::设置自定义比较器
- 如何设置一个范围来提取我想要获得的信息
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 通过选项卡的文本设置QTabWidget顺序
- 将特征矩阵的向量设置为0
- 如何在c++ /Qt中设置30fps循环