анимация QGraphicsObject / QGraphicsItem в Qt

ситуация:
Высший класс dialog генерирует растр с квадратами. Игрок сидит в (0,0) и когда пользователь нажимает на квадрат алгоритм поиска пути pathFind генерирует QString направлений, которые игрок должен пройти, чтобы достичь этой цели. QString затем преобразуется в массив int,

dialogвызывает функцию из mysquareкласс с именем movePlayer, который должен перемещать игрока в правильном направлении.

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

мой проблема однако квадрат игрока не движется вообще. Иногда, когда я щелкаю где-то за пределами сетки, она привязывается к конечной позиции. Weird.

MySquare класс (игрок)

 MySquare::MySquare(int x,int y, int w, int h){
curX = x;
curY = y;

initX = x;
initY = y;
width = w;
height = h;
posAnimation.setPropertyName("getGridPos");
posAnimation.setTargetObject(this);
}bool MySquare::movePlayer(int direction){
switch (direction){
case 0: //move right
curX+=width;
break;
case 1: //move up
curY+=height;
break;
case 2: //move left
curX+=-width;
break;
case 3: //move down
curY+=-height;
break;
}
//setPos(curX,curY);
QPoint p;
p.setX(curX);
p.setY(curY);

setGridPos(p);
update();
return true;
}

void MySquare::setGridPos(QPoint myPos) {
posAnimation.setStartValue(pos());
posAnimation.setDuration(2000); // 2 seconds
posAnimation.setEndValue(myPos);
posAnimation.start();
}QPoint MySquare::getGridPos() const {
return pos();
}

Заголовок MySquare (проигрыватель)

 class MySquare : public QGraphicsObject
{
Q_OBJECT
Q_PROPERTY(QPoint getGridPos READ getGridPos WRITE setGridPos) // define meta-property "pos"s
public:
QPropertyAnimation posAnimation;
MySquare(int x,int y,int h, int w);
QRectF boundingRect() const; //outer most edges of the object
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
bool movePlayer(int direction);
public slots:
QPoint getGridPos() const; // getter
void setGridPos(QPoint p); // setter

signals:
void targetChanged(int x, int y);

private:
int curX,curY,height,width,initX,initY;
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
void keyPressEvent(QKeyEvent *event);
void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
};

редактировать:

  • Я добавил несколько qDebug в setGridPos, которые сразу же выводятся на печать; что говорит мне, что скрипт не блокирует анимацию, что может быть частью проблемы.

edit2:

  • Кажется, это работает, когда я вызываю функцию movePlayer только один раз;

edit3: у меня есть ощущение, что это может быть решено с помощью анимационной группы.

1

Решение

Использовать QSequentialAnimationGroup,

Со второго раза, когда я вызвал movePlayer, анимация перестала работать. Я должен был переписать некоторые части dialog aswel: теперь направления больше не задаются одно за другим, а передаются через вектор. Я надеюсь, что я не добавил никаких утечек памяти, используя ‘new’, но я не думаю, что есть какой-то способ обойти это.

 void MySquare::movePlayer(std::vector <int> directions){
QSequentialAnimationGroup *group = new QSequentialAnimationGroup;
//determine direction
//& add each element to the group
QPoint startPosition;
startPosition.setX(pos().x());
startPosition.setY(pos().y());

for (int i=0; i<directions.size(); i++){
int direction = directions[i];
switch (direction){
case 0: //move right
curX+=width;
break;
case 1: //move up
curY+=height;
break;
case 2: //move left
curX+=-width;
break;
case 3: //move down
curY+=-height;
break;
}

QPoint endPosition;
endPosition.setX(curX);
endPosition.setY(curY);

QPropertyAnimation *animation = new QPropertyAnimation(this,"getGridPos");
animation->setStartValue(startPosition);
animation->setDuration(1000); // 1 seconds
animation->setEndValue(endPosition);
group->addAnimation(animation); ////add animatons to a QSequentialAnimationGroup
//delete animation;

//update startPosition for next loop
startPosition.setX(endPosition.x());
startPosition.setY(endPosition.y());
}
qDebug() << "start animation group" << endl;
group->start();
update();
//delete group;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector