我在Qt制作了一个基于2D网格的游戏。
当点击网格中的正方形时,玩家将按照使用A *算法计算的路径移动到该正方形。但是我希望能够为此设置动画。因此,玩家不必立即前往目标,而是必须从正方形(节点)转到正方形,直到它以用户可以设置的速度到达目标。
问题:实现这一目标的最简单方法是什么?
答案 0 :(得分:4)
就个人而言,我的设计类似于以下内容:
class Player : public QObject {
...
QPoint pos;
QList<QPoint> path;
QPropertyAnimation posAnimation;
};
将pos
定义为Q_PROPERTY
。这使您可以使用QPropertyAnimation
在此值上定义动画,以便为两个相邻点之间的运动设置动画。动画完成后,take()
从路径中选择一个点并重新配置动画,沿整个路径给您一个动画。
使用Player类中的一个插槽animationFinished()
来提供动画的下一个点。
要启动此类动画,请使用值填充路径(在函数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
定义为属性,您必须定义两个插槽:读取和写入功能,也称为getter和setter:
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()
来访问该职位。您可能想知道为什么这有用。每当您只想将属性 name 作为字符串传递时,它就很有用,就像告诉QPropertyAnimation要设置动画的属性一样。另一种情况是使用像QML这样的脚本。然后在类中定义属性。您可以在Qt文档中阅读有关元属性的更多信息:The Property System。
答案 1 :(得分:1)
看看使用Squaby(v-play.net)引擎制作的塔防游戏V-Play的演示。您可以在此处访问完整的源代码:Squaby。 V-Play为您提供了路径查找等游戏组件(API reference)。