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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| class Actor {
public:
enum State {
LookForMushrooms,
EatMushroom,
EnjoyGoodTrip,
SufferBadTrip,
Sleep
};
void changeState(TState stateNext) {
// exits current state
switch (stateCurrent) {
case LookForMushrooms: { /* ... */ break; }
case EatMushroom : { /* ... */ break; }
case EnjoyGoodTrip : { /* ... */ break; }
case SufferBadTrip : { /* ... */ break; }
case Sleep : { /* ... */ break; }
}
statePrevious = stateCurrent;
stateCurrent = stateNext;
stateDuration = 0.;
// enters next state
switch (stateCurrent) {
case LookForMushrooms: { /* ... */ break; }
case EatMushroom : { /* ... */ break; }
case EnjoyGoodTrip : { /* ... */ break; }
case SufferBadTrip : { /* ... */ break; }
case Sleep : { /* ... */ break; }
}
}
void update(double deltaTime) {
stateDuration += deltaTime;
// updates current state
switch (stateCurrent) {
case LookForMushrooms: {
if (mushroomOnCurrentCell()) {
removeMushroomFromCurrentCell();
changeState(EatMushroom);
} else
moveToRandomNeighboringCell();
break;
}
case EatMushroom : {
changeState((rand() % 10 > 3) ? EnjoyGoodTrip : SufferBadTrip);
break;
}
case EnjoyGoodTrip : {
if (stateDuration > 10.) changeState(LookForMushrooms);
break;
}
case SufferBadTrip : {
drainStamina(deltaTime);
if (stateDuration > 25.) changeState(Sleep);
break;
}
case Sleep : {
if (stateDuration > 30.) changeState(LookForMushrooms);
break;
}
}
}
private:
TState stateCurrent,
statePrevious;
double stateDuration;
};
/* ... */
void Simulation::update(double deltaTime) {
// advance all actors state
for (auto actor : actors) actor->update(deltaTime);
} |