summaryrefslogtreecommitdiffstats
path: root/examples/statemachine/errorstateplugins/seek_ai/seek_ai.cpp
blob: 229f83a372c080cda10f473ed31f7614cf9875ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "seek_ai.h"

QState *SeekAi::create(QState *parentState, QObject *tank)
{
    QState *topLevel = new QState(parentState);
    topLevel->setObjectName("topLevel");

    QState *seek = new QState(topLevel);
    seek->setObjectName("seek");
    topLevel->setInitialState(seek);

    QState *lookForNearestWall = new SearchState(tank, seek);
    lookForNearestWall->setObjectName("lookForNearestWall");
    seek->setInitialState(lookForNearestWall);
        
    QState *driveToFirstObstacle = new QState(seek);
    driveToFirstObstacle->setObjectName("driveToFirstObstacle");
    lookForNearestWall->addTransition(lookForNearestWall, SIGNAL(nearestObstacleStraightAhead()), 
        driveToFirstObstacle);

    QState *drive = new QState(driveToFirstObstacle);
    drive->setObjectName("drive");
    driveToFirstObstacle->setInitialState(drive);
    connect(drive, SIGNAL(entered()), tank, SLOT(moveForwards()));
    connect(drive, SIGNAL(exited()), tank, SLOT(stop()));
    
    // Go in loop
    QState *finishedDriving = new QState(driveToFirstObstacle);
    finishedDriving->setObjectName("finishedDriving");
    drive->addTransition(tank, SIGNAL(actionCompleted()), finishedDriving);
    finishedDriving->addTransition(drive);
        
    QState *turnTo = new QState(seek);
    turnTo->setObjectName("turnTo");
    driveToFirstObstacle->addTransition(new CollisionTransition(tank, turnTo));
    
    turnTo->addTransition(tank, SIGNAL(actionCompleted()), driveToFirstObstacle);

    return topLevel;
}

Q_EXPORT_PLUGIN2(seek_ai, SeekAi)