Search code examples
cavr

Escape delay with a button in a game


I have a problem with a piece of code for a game. I would like to know, how to break the time delay if I press the button.

List of files

At the end, the game writes your end score on the LCD for 10 seconds. And goes back to the wait for start. I want to keep that as it is - the only thing that I want to include is that if I press the button within those 10 seconds I want it to go immediately back to the wait for start.


Function code is here

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);
}

When the game is over this function draws your score based on your level. In this next function i am calling drawgamescore function, which is in dsip_end_score makro.

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;
}

Here is the main game function

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;
    }
}

Thanks.


I tried

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;
    }*/

Solution

  • I found a solution!

    Here is the code if anyone is interested.

    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;
    }
    

    If you want to know about the

    Has_X_millisecondsPassed();

    function you are welcome to see it in systime.c in the File list hyperlink in the question above. For the reference i'm using AtMega328pb microcontroller.