2017-05-07 10 views
2

ゲーム用のコードに問題があります。私が知りたいのは、ボタンを押すとどのように時間遅延を壊すかです。終わり ゲームのボタンでエスケープ遅延

List of files

は、ゲームは10秒LCD上の最終スコアを書き込みます。そして、開始のための待機に戻ります。私はそのままにしておきたい - 唯一含めるべきことは、10秒以内にボタンを押すと、すぐに開始待ちに戻ることです。


機能コードは、ここで


ゲームは、この機能はあなたのレベルに基づいて、あなたのスコアを描く上で

void DrawGameScore() 
{ //&RFONT_8X12 &RFONT_16X26 
    //char key; 
    //key = KBD_GetKey(); 
    char txt[10]; 
    UG_FontSelect(&RFONT_16X26); 
    UG_SetForecolor(C_WHITE); 
    switch (level){ 
     case 1: 

      UG_PutString(60,130,"Peasant Score:"); 
      sprintf(txt,"%d",score); 
      UG_PutString(120,160,txt); 
      _delay_ms(10000); 
      break; 
     case 2: 
      UG_PutString(60,130,"Knight Score:"); 
      sprintf(txt,"%d",score); 
      UG_PutString(120,160,txt); 
      _delay_ms(10000); 
      break; 
     case 3: 
      UG_PutString(60,130,"Queen Score:"); 
      sprintf(txt,"%d",score); 
      UG_PutString(120,160,txt); 
      _delay_ms(10000); 
      break; 
     case 4: 
      UG_PutString(60,130,"King Score:"); 
      sprintf(txt,"%d",score); 
      UG_PutString(120,160,txt); 
      _delay_ms(10000); 
      break; 
     case 5: 
      UG_PutString(60,130,"God Score:"); 
      sprintf(txt,"%d",score); 
      UG_PutString(120,160,txt); 
      _delay_ms(10000); 
      break; 
    } 
    //UG_PutString(60,130,"Final Score:"); 

    //sprintf(txt,"%d",score); 


    //UG_PutString(120,160,txt); 
    //_delay_ms(1000); 
} 
です。この次の関数では、dsip_end_score makroにあるdrawgamescore関数を呼び出しています。ここで

int EndOfGame() 
{ 
    char key; 
    //static int state; 
    int result = 1; 
    key = KBD_GetKey(); 

    display_msg = DSIP_END_SCORE; 
    if (key == BTN_OK){ 
     //display_msg = DISP_REFRESH_ALL; 
     //display_msg = DSIP_END_SCORE; 
     return result; 
    } 
    return result; 
} 

メインゲーム機能は

void Game() 
{ 
    static int state; 
    int result; 

    switch (state) 
    { 
     case 1: //waiting for the game start 
      result = WaitForStart(); 
      if (result == 1) state++; 
      break; 
     case 2: //Play the game 
      result = PlayTheGame(); 
      if (result == 1) state++; 
      break; 
     case 3: //Display the score 
      result = EndOfGame(); 
      if (result == 1) state=0; 
      break; 
     default: //0 or unknown value: reset the game 
      state = 1; 
      break; 
    } 
} 

おかげです。


私は解決策を見つけた

int EndOfGame() 
{ 
    char key; 
    static int state; 
    int result = 1; 
    key = KBD_GetKey(); 

    display_msg = DSIP_END_SCORE; 
    if (key == BTN_OK){ 
     //display_msg = DISP_REFRESH_ALL; 
     //display_msg = DSIP_END_SCORE; 
     return result; 
    } 
    return result; 
} 
    /* 
    display_msg = DSIP_END_SCORE; 
    if (key != 0){ 
     switch (key) 
     { 
      case BTN_OK: 
      return result; 
      break; 
     } 
    } 
    */ 

    /* 
    switch (state) 
    { 
     case 0: 
     display_msg = DSIP_END_SCORE; 
     state++; 
     break; 
     case 1: 
     key = KBD_GetKey(); 
      if (key != 0){ 
      switch (key) 
      { 
       case BTN_OK: 
       return result; 
       break; 
      } 
      break; 
      } 

    } 
    return result; 
    */ 

    //display_msg = DISP_REFRESH_ALL; 
    //display_msg = DSIP_END_SCORE; 

    //return result; 

    /* 
    char key; 
    int result=0; 
    //static int state; 
    key = KBD_GetKey(); 
    if (KBD_isKeyStatePressed(BTN_OK)) 
    { 
     display_msg = DSIP_END_SCORE; 
     result = 1; 
    } else { 
     result = 1; 
    } 
    //return result; 
    */ 
    /* 
    switch (state){ 
     case 0: 
      KBD_flush(); //empty buffer 
      //display_msg = DISP_REFRESH_ALL; 
      display_msg = DSIP_END_SCORE; 
      return result; 
      state++; 
      break; 
     case 1: 
      key = KBD_GetKey(); //kbd read dela background services 
      if (key == BTN_OK){ 
       //display_msg = DISP_REFRESH_ALL; 
       display_msg = DSIP_END_SCORE; 
       return result; 
       break; 
      } 
      break; 


    } 
    return result; 
    */ 
    /* 
    key = KBD_GetKey(); 
    if (key == BTN_OK) { 
     //display_msg = DISP_REFRESH_ALL; 
     return result; 
    }else{ 
    display_msg = DISP_REFRESH_ALL; 
    display_msg = DSIP_END_SCORE; 


    //TODO: write the program 

    return result; 
    }*/ 
+0

[キーが押された直後に時間遅延を含むループを終了する]の可能な複製(http://stackoverflow.com/questions/13953257/exit-from-a-loop-that-c​​ontains-time-delay - 即時にキーを押した後) –

+0

あなたのヘッダファイルは何ですか?main.ciの –

+0

は、lcdヘッダファイル、systime.h、kbd.h(私の4つのボタン用)、backgroundservices.hを持っています表示のためのマクロを持っている) – Drejc

答えて

0

を試してみました!

興味があればここにコードがあります。

int EndOfGame() 
{ 
    int result = 0; 
    char key; 
    static uint32_t timeStamp; 

    static int state = 0; 
    display_msg = DISP_REFRESH_ALL; 

    switch (state) 
    { 
     case 0: //Show end score 

      display_msg = DSIP_END_SCORE; 
      timeStamp = GetSysTick(); 

      state++; 
      break; 
     case 1: //read keys after 2 seconds 
      if (Has_X_MillisecondsPassed(2000, &timeStamp) 
      { 
       state++; 
       KBD_flush(); 
       break; 
      } 
      break; 
     case 2: 
      key = KBD_GetKey(); 
      if (key != 0) 
      { 
       switch (key) 
       { 
        case BTN_OK: 
        state = 0; 
        result = 1; 
        break; 
       } 
      } 
      //finish after 10 seconds 
      if (Has_X_MillisecondsPassed(10000, &timeStamp)) 
      { 
       result = 1; 
       state = 0; 
       break; 
      } 
      break; 
    } 
    return result; 
} 

あなたは

Has_X_millisecondsPassed()を知りたい場合は、

上記の質問のファイルリストのハイパーリンクにあるsystime.cでsystime.cに表示される機能です。参照のために私はAtMega328pbマイクロコントローラを使用しています。