Member 13184617 Ответов: 1

Задержка побега с помощью кнопки в игре


Привет, у меня проблема с куском кода для игры. Я хотел бы знать, как нарушить временную задержку, если я нажму кнопку.

В конце игры ваш конечный счет записывается на жидкокристаллический дисплей в течение 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 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;
	}*/

1 Ответов

Рейтинг:
9

Member 10317286

Вы не даете достаточно подробностей, чтобы быть уверенным (платформа, ОС и т. д.), Но я подозреваю, что ваша проблема в том, что _delay_ms () блокируется. Это означает, что ваш код не запускается до тех пор, пока задержка не будет выполнена.

Две вещи, которые вы можете сделать-во-первых, написать свою собственную версию _delay_ms (), которая также проверяет нажатие клавиши и выходит рано, если это произойдет. Во-вторых, оберните его в свою собственную процедуру, которая делит общее время на более мелкие сегменты. В этом случае вы помещаете вызовы _delay_ms () в цикл, который также проверяет нажатие клавиши. Например:

WaitButExitOnKeypress(Milliseconds)
  NumIntervals=Milliseconds/MsPerInterval
  for NumIntervals
    _delay_ms(MsPerInterval) 
    If key pressed exit loop
  next interval
return to caller

Если вы установите MsPerInterval равным 100, то он будет проверять наличие нажатия клавиши 10 раз в секунду и выходить либо при нажатии клавиши, либо по истечении времени. Обратите внимание, что задержка может быть не совсем такой, как вы указали, но она будет достаточно близка, чтобы человек не заметил разницы, если вы не используете большое значение для интервала.


Member 13184617

Привет, спасибо за ваш ответ у меня есть более подробная информация в Stack overflow, если вам интересно, вот ссылка. http://stackoverflow.com/questions/43833016/escape-delay-with-a-button-in-a-game для платформы я использую AtmelStudio.
Я попробую ваше решение в ближайшее время.