假设我有一包运行 QStateMachine
. 这些机器人的所有状态机都具有相同的基本结构:
- 状态:
- 睡觉
- 搜索
- 破坏
- 返回
- 转换 (
from
->to
onsignal
:- 睡眠 -> 搜索“下一步”
- 搜索 -> 在“下一个”上销毁
- 销毁 -> 搜索“下一个”
- 销毁 -> 返回“返回”
- 搜索 -> 返回“返回”
- 返回 -> 搜索“下一个”
- 返回 -> 在“返回”上睡觉
// base.h
#include <QObject>
#include <QState>
#include <QStateMachine>
class Base : public QObject
{
Q_OBJECT
public:
Base(QObject* parent = 0);
~Base();
signals:
void next();
void back();
private:
QStateMachine m_machine;
QState* m_sleep;
QState* m_search;
QState* m_destroy;
QState* m_return;
};
// base.cpp
Base::Base(QObject* parent) : QObject(parent)
{
m_sleep = new QState(&m_machine);
m_search = new QState(&m_machine);
m_destroy = new QState(&m_machine);
m_return = new QState(&m_machine);
m_machine.setInitialState(m_sleep);
m_sleep->addTransition(this, &Base::next, m_search);
m_search->addTransition(this, &Base::next, m_destroy);
m_search->addTransition(this, &Base::back, m_return);
m_destroy->addTransition(this, &Base::next, m_search);
m_destroy->addTransition(this, &Base::back, m_return);
m_return->addTransition(this, &Base::next, m_search);
m_return->addTransition(this, &Base::back, m_sleep);
m_machine.start();
}
现在我想要一个更具体的机器人。假设他在破坏过程中更加详细,具有几个子状态,例如dismantel -> sprayWithAcid -> blowUp -> desintegrate
,他在每个next
- 信号上继续前进,或者他继续在return
-back
信号上。
如前所述,我的计划是将它们作为子状态添加到 statedestroy
中,但信号next
不仅会继续子状态机直到完成,还会离开父状态。
我怎样才能避免这种情况?还是有其他类似的好方法?