情况:上层类dialog
生成带有正方形的栅格。玩家坐在 (0,0) 处,当用户点击正方形时,寻路算法会pathFind
生成QString
玩家必须采取的方向才能达到此目标。然后QString
将 转换为 的数组int
。
dialog
从名为 movePlayer 的类中调用一个函数,该函数mysquare
应该将玩家移动到正确的方向。
这个动作不应该是瞬间发生的,而是以一定的速度发生的,这就是为什么我试图为每个动作设置动画,所以它需要一定的时间。
然而,我的问题是玩家广场根本没有移动。有时,当我单击网格外的某个位置时,它会捕捉到结束位置。奇怪的。
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);
};
编辑:
- 我在 setGridPos 中添加了一些 qDebug,它们都会立即打印出来;这告诉我脚本没有阻止动画,这可能是问题的一部分。
编辑2:
- 当我只调用一次 movePlayer 函数时,它似乎有效;
edit3:我觉得它可能会使用动画组来解决。