2017-05-07 1 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-contains-time-delay -immediately-a-key-is-pressed) –

+0

메인 파일의 헤더 파일 –

+0

은 lcd 헤더 파일, systime.h, kbd.h (내 4 개의 버튼 용) 및 backgroundservices.h (그 중 i 디스플레이 용 매크로가 있음) – 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에서이 기능을 볼 수 있습니다. 참조를 위해 나는 AtMega328pb 마이크로 컨트롤러를 사용하고있다.