在游戏中使用按钮逃脱延迟

Escape delay with a button in a game

我的一段游戏代码有问题。我想知道,如果我按下按钮,如何打破时间延迟。

List of files

最后,游戏会在 LCD 上显示您的最终得分 10 秒。并返回等待开始。我想保持原样 - 我唯一想包括的是,如果我在这 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);
}

游戏结束后,此功能会根据您的等级得出分数。在下一个函数中,我调用了 drawgamescore 函数,它位于 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;
}

这是主要的游戏功能

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

我找到了解决办法!

如果有人感兴趣,这是代码。

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 微控制器。