Qt 2D寻路游戏中的动画

时间:2013-01-05 22:37:23

标签: c++ qt 2d-games

我在Qt制作了一个基于2D网格的游戏。

当点击网格中的正方形时,玩家将按照使用A *算法计算的路径移动到该正方形。但是我希望能够为此设置动画。因此,玩家不必立即前往目标,而是必须从正方形(节点)转到正方形,直到它以用户可以设置的速度到达目标。

问题:实现这一目标的最简单方法是什么?

2 个答案:

答案 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)。