1

状況: 上位クラスdialogが正方形のラスターを生成します。プレーヤーは (0,0) に座り、ユーザーが正方形をクリックすると、パスファインディング アルゴリズムによって、プレーヤーがこの目標に到達するために取らなければならない方向がpathFind生成されます。QString次にQString、 は の配列に変換されintます。

dialogmysquaremovePlayer という名前のクラスから、プレーヤーを正しい方向に移動させる関数を呼び出します。

この動きは瞬時に発生するのではなく、一定の速度で発生する必要があります。そのため、各動きをアニメーション化して一定の時間がかかるようにしています。

しかし、私の問題は、プレーヤーの正方形がまったく動いていないことです。グリッドの外側のどこかをクリックすると、終了位置にスナップすることがあります。変。

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: アニメーション グループを使用して解決される可能性があると感じています。

4

1 に答える 1

1

を使用しQSequentialAnimationGroupます。

2 回目に movePlayer を呼び出したときから、アニメーションが機能しなくなりました。dialogaswelのいくつかの部分を書き直さなければなりませんでした。今では、方向は 1 つずつではなく、ベクトルを介して渡されます。「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;
    }
于 2013-01-06T13:29:32.617 に答える