gpt4 book ai didi

c++ - Qt 2D 寻路游戏中的动画

转载 作者:行者123 更新时间:2023-11-30 01:24:03 26 4
gpt4 key购买 nike

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

当点击网格中的一个方 block 时,玩家会按照 A* 算法计算出的路径移动到该方 block 。但是我希望能够对此进行动画处理。因此,玩家不必立即到达目标,而是必须从一个方 block (节点)移动到另一个方 block ,直到它以用户可以设置的速度到达目标。

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

最佳答案

就我个人而言,我的设计类似于以下内容:

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作为一个属性,你必须定义两个插槽:一个读函数和一个写函数,也称为 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 .

关于c++ - Qt 2D 寻路游戏中的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14177158/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com