示例#1
0
static void doLevel()
{
  uint8_t idx = 0;
  do
  {
    doIndicateStep(idx);
    delay(STEP_DURATION);
    stepEnd();
    idx++;
  } while(idx < currentLevel);
}
示例#2
0
static uint8_t mainStateFunc(StateM* sm)
{
  uint8_t retValue = 0;

  switch(sm->getCurrent())
  {
    case GAME_STATE_POR:
    {
      currentLevel = 1;
      generateSequence();
      sm->setNext(GAME_STATE_PRE_GAME);
      break;
    }

    case GAME_STATE_PRE_GAME:
    {
      static uint8_t leds = LOW;
      if(sm->isStateEntered())
      {

      }
      else
      {
        if(getInput() != NO_KEY)
        {
            sm->setNext(GAME_STATE_PLAY_SEQUENCE_INIT);
            leds = LOW;
        }
        else if(sm->getDuration() > 500)
        {
          sm->resetEnterTime();
          leds = leds ? LOW : HIGH;
        }
        digitalWrite(RED_LED_PIN, leds);
        digitalWrite(GREEN_LED_PIN, leds);
        digitalWrite(BLUE_LED_PIN, leds);
        digitalWrite(YELLOW_LED_PIN, leds);
      }
      break;
    }

    case GAME_STATE_PLAY_SEQUENCE_INIT:
    {
      if(sm->getDuration() > 2000)
      {
        Serial.print("Level: ");
        Serial.println(currentLevel);
        currentStep = 0;
        sm->setNext(GAME_STATE_PLAY_SEQUENCE_INDICATE_STEP);
      }
      break;
    }

    case GAME_STATE_PLAY_SEQUENCE_INDICATE_STEP:
    {
      doIndicateStep(currentStep);
      sm->setNext(GAME_STATE_PLAY_SEQUENCE_INDICATE_DELAY);
      break;
    }

    case GAME_STATE_PLAY_SEQUENCE_INDICATE_DELAY:
    {
      if( sm->getDuration() > STEP_DURATION )
      {
        stepEnd();
        currentStep++;
        if(currentStep >= currentLevel)
        {
          //All done, now handle player repeating this level
          sm->setNext(GAME_STATE_CHECK_SEQUENCE_PAUSE);
        }
        else
        {
          //Play next step in this sequence
          sm->setNext(GAME_STATE_PLAY_SEQUENCE_INDICATE_STEP);
        }
      }
      break;
    }

    case GAME_STATE_CHECK_SEQUENCE_PAUSE:
    {
      if( sm->getDuration() > 1000 )
      {
        currentStep = 0;
        sm->setNext(GAME_STATE_CHECK_SEQUENCE);
      }
      break;
    }

    case GAME_STATE_CHECK_SEQUENCE:
    {
      if( sm->getDuration() > REPEAT_STEP_TO )
      {
        Serial.println("Too slow!!!");
        sm->setNext(GAME_STATE_GAME_OVER);
      }
      else
      {
        uint8_t playerKey = getInput();

        if(playerKey != NO_KEY)
        {
          Serial.print("Key: ");
          Serial.println(playerKey);

          if(sequence[currentStep] == playerKey)
          {
            doIndicateStep(currentStep);
            sm->setNext(GAME_STATE_CHECK_SEQUENCE_INDICATE);
          }
          else
          {
            Serial.println("Wrong Key!!!");
            Serial.print("Excpected: ");
            Serial.println(sequence[currentStep]);
            sm->setNext(GAME_STATE_GAME_OVER);
          }
        }
      }
      break;
    }

    case GAME_STATE_CHECK_SEQUENCE_INDICATE:
    {
      if( sm->getDuration() > STEP_DURATION )
      {
        stepEnd();
        currentStep++;
        if(currentStep >= currentLevel)
        {
          //All done, now handle player repeating this level
          currentLevel++;
          if(currentLevel > MAX_LEVEL )
          {
            Serial.println("You won!!");
            sm->setNext(GAME_STATE_GAME_OVER);
          }
          else
          {
            Serial.println("Level complete!!");
            sm->setNext(GAME_STATE_PLAY_SEQUENCE_INIT);
          }
        }
        else
        {
          //Play next step in this sequence
          sm->setNext(GAME_STATE_CHECK_SEQUENCE);
        }
      }
      break;
    }

    case GAME_STATE_GAME_OVER:
    {
      if(sm->isStateEntered())
      {
        indicateFail();
      }
      else if(sm->getDuration() > 4000)
      {
        stepEnd();
        sm->setNext(GAME_STATE_POR);
      }
      break;
    }

    case StateM::STATE_INVALID:
    default:
    {
      sm->setNext(GAME_STATE_POR);
      break;
    }
  }

  return retValue;
}
示例#3
0
void QSofaScene::reset()
{
    SofaScene::reset();
    emit stepEnd();
}
示例#4
0
void QSofaScene::step()
{
    SofaScene::step(_dt);
    emit stepEnd();
}