状況: 上位クラスdialog
が正方形のラスターを生成します。プレーヤーは (0,0) に座り、ユーザーが正方形をクリックすると、パスファインディング アルゴリズムによって、プレーヤーがこの目標に到達するために取らなければならない方向がpathFind
生成されます。QString
次にQString
、 は の配列に変換されint
ます。
dialog
mysquare
movePlayer という名前のクラスから、プレーヤーを正しい方向に移動させる関数を呼び出します。
この動きは瞬時に発生するのではなく、一定の速度で発生する必要があります。そのため、各動きをアニメーション化して一定の時間がかかるようにしています。
しかし、私の問題は、プレーヤーの正方形がまったく動いていないことです。グリッドの外側のどこかをクリックすると、終了位置にスナップすることがあります。変。
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関数を1回だけ呼び出すとうまくいくようです。
edit3: アニメーション グループを使用して解決される可能性があると感じています。