Situation:
An upper class dialog generates a raster with squares. A player sits at (0,0) and when the user clicks on a square a pathfinding algoritm pathFind generates a QString of directions the player has to take to reach this goal. The QString is then converted to an array of int.
dialogcalls a function from the mysquareclass named movePlayer which should move the player in the correct direction.
This movement should not happen instantaneous but at a certain rate which is why I’m trying to animate each movement so it takes a certain amount of time.
My problem however is that the player square is not moving at all. Sometimes when I click somewhere outside of the grid it snaps to the ending position. Weird.
MySquare class (the player)
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 header (the player)
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);
};
edit:
- I’ve added some qDebug inside the setGridPos which are all immediately printed; which is telling me that the script is not blocking on the animation which could be part of the problem.
edit2:
- It seems it works when I only call the movePlayer function once;
edit3: I have a feeling it might be resolved using an animation group.
Use a
QSequentialAnimationGroup.From the second time I called movePlayer the animation stops working. I had to rewrite some parts of the
dialogaswel: now the directions are no longer given one by one but are passed trough a vector. I hope I didn’t add any memory leaks using the ‘new’ but I don’t think there is any way around it.