Ага...
Вроде что то проясняется.
Дело в том, что при перезарядке воспроизводится два звука.
Первый - при нажатии кнопки (извлекаем магазин).
Второй - когда заканчивается время перезарядки (вставляем новый магазин).
switch(reload_key_event)
{
case no_key_pressing: break;
case key_pressing:
{
if (reload_state==nothing_to_do)
{
if ((clips > 0)&&(curr_sound.simples_in_queue==0))//åñëè îáîéìû íå êîí÷èëñü è íå âîñïðîèçâîäèòüñÿ çâóê âûñòðåëà
{
reload_countdown = eeprom_read_byte(&eeprom_reload_duration)*8;
reload_state=waiting_countdown; playback_sound(clip_out_sound); reload_key_event=no_key_pressing;
//playclipinsound();
}
}
}
....
switch (reload_state)
{
case nothing_to_do:
{
}
break;
case waiting_countdown:
{
}
break;
case reload_now:
{
clips--;//óìåíüøàåì íà 1 êîëè÷åñòâî ïàòðîíîâ
bullets = eeprom_read_byte(&eeprom_bullets_in_clip);
display_clips_update();
display_bullets_update();
BULLETS_OUT_LED_OFF;
if(!((curr_sound.role==hit_sound)&&(curr_sound.simples_in_queue>0)))
playback_sound(clip_in_sound); // playclipoutsound();
reload_state = nothing_to_do;
reload_key_event=no_key_pressing;
}
break;
}
Пока ожидается окончание времени перезаряда, статус перезарядки такой
Код:
reload_state=waiting_countdown;
в прерывании обратный счетчик уменьшается на 1 (каждую сотую секунды - примерно)
когда досчитываем до нуля, статус меняется
if(reload_countdown > 0) //обратный отсчет длительности перезарядки не окончен
{
reload_countdown--;
}
else //пора закончить перезаряд
{
if(reload_state==waiting_countdown)
reload_state=reload_now;}
И тут, пока счетчик не достиг нуля, вмешивается команда "новая игра" и переписывает статус
case 0x05://íà÷àòü íîâóþ èãðó íåìåäëåííî
{
if (simples_in_queue>1) //åñëè çâóê âûñòðëà âîñïðîèçâîäèòñÿ
{
simples_in_queue=1;//çàêðîåì eeprom
while (eeprom_is_open);//äîæäåìñÿ, ïîêà eerom çàêðîåòñÿ
}
if (curr_sound.simples_in_queue>1) //если звук уже воспроизводится
{
curr_sound.simples_in_queue=1;//закроем eeprom
while (eeprom_is_open);//дождемся, пока eerom закроется
}
init_var(); //èíèöèàëèçèðóåì ïåðåìåííûå
joystick_event=no_pressing; //î÷èùàåì ñîáûòèÿ äæîéñòèêà
keyboard_event=no_key_pressing;//î÷èùàåì ñîáûòèÿ òðèããåðà
reload_key_event=no_key_pressing;//î÷èùàåì ñîáûòèÿ ïåðåçàðÿäêè rx_event = NOT_EVENT; //î÷èùàåì ñîáûòèÿ ÈÊ ïðèåìíèêà
display_status();//îáíîâëÿåì èíôîðìàöèþ íà äèñïëåå
display_life(life);//îòîáðàçèì óðîâåíü æèçíè íà äèîäàõ
safe_counter=30*8;//неуязвимость 3 с
WOUND_LED_ON;
playstartsound();
//êîä îáðàáîòêè äîïîëíèòåëüíîé êîìàíäû
WOUND_LED_OFF;
break;
Ломая нам всю логику!
Предлагаю, пока процесс перезаряда не окончен, игнорировать команду пульта.
Код:
case 0x05://íà÷àòü íîâóþ èãðó íåìåäëåííî
{
if (reload_state==waiting_countdown) break;
Или просто закоммитить в обработчике "новая игра" строку
Код:
reload_key_event=no_key_pressing;
сделать так
Код:
//reload_key_event=no_key_pressing;
Надо проверять.