Qt で 2D グリッド ベースのゲームを作成しています。
グリッド内の正方形をクリックすると、プレーヤーは A* アルゴリズムで計算されたパスに従ってその正方形に移動します。しかし、私はこれをアニメーション化できるようにしたいと考えています。そのため、プレーヤーはすぐにゴールに向かうのではなく、ユーザーが設定できる速度でゴールに到達するまで、正方形 (ノード) から正方形に移動する必要があります。
質問: これを達成する最も簡単な方法は何ですか?
個人的には、これを次のように設計します。
class Player : public QObject {
...
QPoint pos;
QList<QPoint> path;
QPropertyAnimation posAnimation;
};
として定義pos
しQ_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()
V-Play (v-play.net) エンジンで作成されたタワーディフェンスゲームSquabyのデモをご覧ください。ここから完全なソース コードにアクセスできます: Squaby。V-Play は、パス検索などのゲーム コンポーネントを提供します ( API リファレンス)。