绘制像素以在Qt中创建运动效果

时间:2018-01-03 18:04:11

标签: c++ 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);

1 个答案:

答案 0 :(得分:0)

您绘制此背景的方法将非常缓慢。当你想要做的就是在浅绿色背景上绘制一些深绿色矩形或者反过来时,不需要对QImage进行像素级操作。

看起来这将被包含在QGraphicsScene中。如果是这样,我只是将QGraphicsRectItem子类化。重新实现其绘制方法,首先用一种颜色填充项目,然后使用另一种颜色绘制带子。每个波段可以绘制为单个矩形。乐队的位置和大小应根据您可以根据速度制作动画的某些进度值而有所不同。每次进度更改后,您都会在整个项目的图形项上调用update,以便框架安排重绘。

如果这是QML的话,我会说实现你自己的QML项目并使用着色器进行绘图。到目前为止,这将是最快的解决方案,绘图很简单,可以在着色器中完全计算。