Как анимировать множество эллипсов вдоль пути с разной скоростью?

Я анимирую ток в цепи в виде эллипсов. Я создаю AnimationPathItem для каждого горизонтального / вертикального отрезка, который в два раза больше и перемещается в бесконечном цикле по линии. Линия знает скорость, которую она использует для анимации эллипсов.

Этот подход выглядит не очень хорошо, потому что переход от одного отрезка к другому может привести к появлению полукругов.

Есть ли лучший способ сделать это? Можно ли анимировать каждый отдельный эллипс и изменять скорость, если он проходит через узел? Сегмент линии внизу знает скорость и должен каким-то образом передавать эту информацию анимированному объекту. Может быть проблема производительности при создании так много QPropertyAnimation объекты?

(Для простоты этот код показывает только горизонтальную анимацию справа)

AnimationPathItem::AnimationPathItem(QGraphicsItem *parent): QGraphicsWidget(parent)
{
    setCacheMode(QGraphicsItem::DeviceCoordinateCache);
    int len = boundingRect().width();
    qreal start = -boundingRect().width();

    while (true)
    {
        QPointF p(start, 0);
        mEllipseItems.append(p);
        start += ELLIPSE_SIZE;
        if(start + ELLIPSE_SIZE > len) {
           break;
        }
    }

void AnimationPathItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->setBrush(Qt::gray);
    for (int i = 0; i < mEllipseItems.size(); i++)
    {
        painter->drawEllipse(mEllipseItems[i], ELLIPSE_SIZE /2, ELLIPSE_SIZE /2);
    }
}

QRectF AnimationPathItem::boundingRect() const
{
    return QRectF(0, 0, 2*parentItem()->boundingRect().width(), 2*parentItem()->boundingRect().height());
}

void AnimationPathItem::Animate(double speed) {
    mAnimation = new QPropertyAnimation(this, DNTs("pos"));
    mAnimation->setStartValue(QPointF(-boundingRect().width(), 0);
    mAnimation->setEndValue(QPointF(boundingRect().left(), 0);
    int duration = boundingRect().width() / speed;
    mAnimation->setDuration(duration);
    mAnimation->setEasingCurve(QEasingCurve(QEasingCurve::Linear));
    mAnimation->start();
}

0 ответов

Другие вопросы по тегам