1

Qt で 2D グリッド ベースのゲームを作成しています。

グリッド内の正方形をクリックすると、プレーヤーは A* アルゴリズムで計算されたパスに従ってその正方形に移動します。しかし、私はこれをアニメーション化できるようにしたいと考えています。そのため、プレーヤーはすぐにゴールに向かうのではなく、ユーザーが設定できる速度でゴールに到達するまで、正方形 (ノード) から正方形に移動する必要があります。

質問: これを達成する最も簡単な方法は何ですか?

4

2 に答える 2

4

個人的には、これを次のように設計します。

class Player : public QObject {
    ...
    QPoint pos;
    QList<QPoint> path;
    QPropertyAnimation posAnimation;
};

として定義posQ_PROPERTYます。これにより、隣接する 2 点間QPropertyAnimationの動きをアニメーション化するために、この値にアニメーションを定義するために使用できます。アニメーションが完了したら、パスから 1 つのポイントを指定してアニメーションを再構成し、パス全体に沿ったアニメーションを作成します。take()

animationFinished()Player クラスのスロットを使用して、アニメーションの次のポイントを提供します。

このようなアニメーションを開始するには、(関数などで) パスにmove(QList<QPoint> path)値を入力し、アニメーションの値を設定して開始します。

これらのコード スニペットは次のことに役立ちます。

// in constructor:
posAnimation.setPropertyName("pos");
posAnimation.setTargetObject(this);
connect(&posAnimation, SIGNAL(finished()), SLOT(animationFinished()));

// in the slot:
if(!path.empty()) {
    posAnimation.setStartValue(pos());
    posAnimation.setEndValue(path.takeFirst());
    posAnimation.start();
}

プロパティとして定義するposには、2 つのスロットを定義する必要があります: 読み取り関数と書き込み関数で、ゲッターとセッターとも呼ばれます。

class Player : public QObject {
    Q_OBJECT
    Q_PROPERTY(QPoint pos READ pos WRITE setPos) // define meta-property "pos"
    ...
public slots:
    QPoint pos() const; // getter
    void setPos(QPoint p); // setter
private:
    QPoint m_pos; // private member
};

QPoint Player::pos() const {
    return m_pos;
}
void Player::setPos(QPoint pos) {
    m_pos = pos;
}

この行は、 meta-propertyQ_PROPERTYを宣言しているだけです。これは C++ とは関係ありませんが、Qt のメタ オブジェクト コンパイラはこの行を解析し、内部プロパティ リストにエントリを追加します。次に、代わりに位置にアクセスするように言うことができます。なぜこれが便利なのか疑問に思うかもしれません。QPropertyAnimation にアニメーション化するプロパティを伝えるなど、プロパティを文字列としてのみ渡したい場合に便利です。もう 1 つのシナリオは、QML のようなスクリプトを使用する場合です。次に、クラス全体にプロパティを定義します。メタ プロパティの詳細については、Qt ドキュメントの The Property Systemを参照してください。player->property("pos")player->pos()

于 2013-01-05T22:56:19.277 に答える
1

V-Play (v-play.net) エンジンで作成されたタワーディフェンスゲームSquabyのデモをご覧ください。ここから完全なソース コードにアクセスできます: Squaby。V-Play は、パス検索などのゲーム コンポーネントを提供します ( API リファレンス)。

于 2013-06-07T08:17:19.997 に答える