绘制像素以在Qt中创建移动效果
drawing pixels to create movement effect in Qt
我正在用QT制作一个飙车游戏。我想画这样的线
https://youtu.be/KkMZI5Jbf18?list=PLwPf3vved8fj9V28pxdD2aauo470UKGUz&t=727
对于运动的错觉,但我只能用QImage画一次,如果我把它放在循环中,它甚至不会启动。
QImage cesta(1200, 800, QImage::Format_RGB32);
for(int y=0; y<visina/2;y++)
{ for(int x=0; x<sirina;x++)
{
float perspective = (float)y / (visina /2.0);
float middle = 0.5;
float rwidth = 0.1 + perspective * 0.8; //0.6
float cwidth = rwidth * 0.15;
rwidth *=0.5;
int leftgrass = (middle - rwidth - cwidth) * sirina;
int leftclip = (middle - rwidth) * sirina;
int rightclip = (middle + rwidth) * sirina;
int rightgrass = (middle + rwidth + cwidth) * sirina;
int row = 800 / 2 +y;
QRgb grasscolor = sinf(20.0 * powf(1.0 - perspective,3) + distance * 0.1) > 0.0f ? qRgb(0, 174, 78) : qRgb(0, 111, 16);
if(x >=0 && x<leftgrass)
{cesta.setPixel(x,row,grasscolor);
QPixmap pixmap = QPixmap::fromImage(cesta);}
if(x >=leftgrass && x<leftclip)
cesta.setPixel(x,row,qRgb(255, 0, 0));
if(x >=leftclip && x<rightclip)
cesta.setPixel(x,row,qRgb(55, 55, 55));
if(x >=rightclip && x<rightgrass)
cesta.setPixel(x,row,qRgb(255, 0, 0));
if(x >=rightgrass && x<sirina)
{cesta.setPixel(x,row,grasscolor);
QPixmap pixmap = QPixmap::fromImage(cesta);}
}
}
QPixmap pixmap = QPixmap::fromImage(cesta);
scene->addPixmap(pixmap);
你绘制这个背景的方法会非常慢。无需对 QImage 进行像素级操作,只需在浅绿色背景上绘制几个深绿色矩形,或者相反。
看起来这是要包含在QGraphicsScene中。如果是这样,我会简单地对QGraphicsRectItem进行子类化。重新实现其绘制方法,首先用一种颜色填充项目,然后使用另一种颜色在该项上绘制条带。每个波段可以绘制为单个矩形。波段的位置和大小应根据某些进度值而有所不同,然后您可以根据速度进行动画处理。每次进度更改后,您都会对整个项目的图形项调用 update,以便框架计划重绘。
如果这是一个QML的东西,我会说实现你自己的QML项目并使用着色器来绘制。这将是迄今为止最快的解决方案,并且绘图非常简单,可以在着色器中完全计算。
相关文章:
- 在从仅移动类型派生的类中定义析构函数在使用 std::vector emplace_back或push_back创建时会
- Qt 创建器:将库移动到 subdir 后无法打开共享对象文件
- 从从可调用参数创建的线程对象参数移动构造 C++11 线程
- c++ 从成员函数创建新线程并移动对象和整个对象
- 如何找到通过仅移动相邻字符创建的字符串的排列?-C++
- ROS创建移动的类
- 通过移动从两个向量创建元组向量
- 创建一个移动分配函数,不断得到"pointer being freed was not allocated"
- std ::移动不要创建派生类
- 如何创建可变参数模板函数来移动参数值并处理左值和右值
- 绘制像素以在Qt中创建移动效果
- 将原始指针移动到已创建函数中的下一个字符
- 我正在从 C 移动到 C++ 并且我没有得到这个类的创建
- 为什么在这种情况下不调用我的移动构造函数?(首先分配 r 值引用并创建对象)
- 如果 std::string 从未被修改,它可以在创建后移动吗?
- 是否可以创建一个只有const/reference成员的可移动类
- 使用可移动节点创建有向图(使用 QT / Boost)
- 将 QFile::copy 创建创建文件的副本或将内容从一个文件移动到另一个文件
- 首先创建字符串,然后通过移动语义将其添加到 vector 或在 vector 中创建元素是否具有内存效率
- 如何以编程方式区分由 subst 命令创建的虚拟驱动器和实际的可移动驱动器