qt, c++, qpropertyAnimation和定时器,绘制火柴人跑动的动画,要让视觉效果是跑动起来的效果,不使用图片资源,用painter绘制
时间: 2024-03-01 20:55:11 浏览: 119
火柴人动画制作器
5星 · 资源好评率100%
好的,让我们来看看如何使用 Qt 和 C++ 中的 QPropertyAnimation 和定时器来绘制火柴人跑动的动画,同时不使用图片资源,用 QPainter 绘制。
首先,我们需要定义火柴人的不同姿势,并使用 QPainter 来绘制它们。然后,我们可以创建一个 QWidget 来绘制火柴人,并在其上使用 QPropertyAnimation 来控制火柴人的位置和姿势。同时,我们可以使用定时器来触发更新事件,以改变火柴人的姿势。下面是示例代码:
```cpp
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPropertyAnimation>
#include <QTimer>
class StickFigure : public QWidget {
public:
StickFigure(QWidget *parent = nullptr) : QWidget(parent) {
setFixedSize(200, 200);
animation = new QPropertyAnimation(this, "pos");
animation->setDuration(2000);
animation->setStartValue(QPoint(0, 0));
animation->setEndValue(QPoint(200, 200));
animation->setLoopCount(-1);
animation->start();
timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &StickFigure::updateAnimation);
timer->start(100);
}
protected:
void paintEvent(QPaintEvent *event) override {
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.translate(width() / 2, height() / 2);
painter.rotate(rotation);
painter.drawLine(0, 0, 0, -50);
painter.drawLine(0, -50, -25, -75);
painter.drawLine(0, -50, 25, -75);
painter.drawLine(0, 0, -25, 25);
painter.drawLine(0, 0, 25, 25);
}
private:
QPropertyAnimation *animation;
QTimer *timer;
qreal rotation = 0;
private slots:
void updateAnimation() {
rotation += 30;
if (rotation >= 360) {
rotation -= 360;
}
update();
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
StickFigure stickFigure;
stickFigure.show();
return app.exec();
}
```
在 paintEvent 函数中,我们使用 QPainter 绘制火柴人。我们使用 rotate 函数旋转 QPainter,并使用 drawLine 函数绘制火柴人的不同部分。
在 StickFigure 的构造函数中,我们创建了一个 QPropertyAnimation,将其与 StickFigure 的位置属性绑定。我们设置了动画的起始位置和结束位置,并将其循环播放。然后,我们创建了一个 QTimer,在每次定时器超时时触发 updateAnimation 函数。在 updateAnimation 函数中,我们通过改变 rotation 的值来改变火柴人的姿势,并调用 update 函数重新绘制。
这样,我们就可以使用 Qt 和 C++ 中的 QPropertyAnimation 和定时器来绘制火柴人跑动的动画,并让其看起来像是在跑步。
阅读全文