Я делаю 2D-игру на основе сетки в Qt.
При нажатии на квадрат в сетке игрок перемещается в этот квадрат по пути, рассчитанному по алгоритму A *. Однако я хотел бы иметь возможность оживить это. Таким образом, вместо немедленного перехода к цели, игрок должен переходить от квадрата (узла) к квадрату, пока не достигнет цели со скоростью, которую может установить пользователь.
Вопрос: Какой самый простой способ добиться этого?
Лично я бы сконструировал это так:
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: Система собственности.
Взгляните на демоверсию игры Tower Defense Squaby сделано с V-Play (v-play.net) движок. Вы можете получить полный исходный код здесь: Squaby.
V-Play предоставляет вам игровые компоненты для поиска пути и многое другое (Справочник по API).