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

drawing pixels to create movement effect in Qt

本文关键字:创建 移动 Qt 像素 绘制      更新时间:2023-10-16

我正在用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项目并使用着色器来绘制。这将是迄今为止最快的解决方案,并且绘图非常简单,可以在着色器中完全计算。