Анимация в игре Qt 2D Pathfinding

Я делаю 2D-игру на основе сетки в Qt.

При нажатии на квадрат в сетке игрок перемещается в этот квадрат по пути, рассчитанному по алгоритму A *. Однако я хотел бы иметь возможность оживить это. Таким образом, вместо немедленного перехода к цели, игрок должен переходить от квадрата (узла) к квадрату, пока не достигнет цели со скоростью, которую может установить пользователь.

Вопрос: Какой самый простой способ добиться этого?

1

Решение

Лично я бы сконструировал это так:

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

определять pos как Q_PROPERTY, Это позволяет вам использовать QPropertyAnimation определить анимацию по этому значению для анимации движения между двумя соседними точками. После завершения анимации 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 в качестве свойства вы должны определить два слота: функцию чтения и записи, также известную как геттер и сеттер:

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;
}

Q_PROPERTY линия просто объявляет мета-свойство. Это не имеет ничего общего с C ++, но компилятор мета-объектов Qt анализирует эту строку и добавляет запись во внутренний список свойств. Тогда вы можете сказать player->property("pos") чтобы получить доступ к позиции вместо player->pos(), Вы можете удивиться, почему это полезно. Это полезно всякий раз, когда вы хотите передать собственность название как строка, например, чтобы сообщить QPropertyAnimation, какое свойство анимировать. Другой сценарий — использование сценариев, таких как QML. Затем вы определяете свойства по всем вашим классам. Вы можете прочитать больше о мета-свойствах в документации Qt: Система собственности.

4

Другие решения

Взгляните на демоверсию игры Tower Defense Squaby сделано с V-Play (v-play.net) движок. Вы можете получить полный исходный код здесь: Squaby.
V-Play предоставляет вам игровые компоненты для поиска пути и многое другое (Справочник по API).

1

По вопросам рекламы [email protected]