Вопрос № 39682: Здравствуйте.
Пишу игру и возникла необходимость реализовать возможность поставить игру на паузу.
Паузу написал см. прил процедура Pause1.
Ну это очень неудобно...пользователь не видит стоит ли программа на паузе или нет. Я решил сделать ...
Вопрос № 39.682
Здравствуйте.
Пишу игру и возникла необходимость реализовать возможность поставить игру на паузу.
Паузу написал см. прил процедура Pause1.
Ну это очень неудобно...пользователь не видит стоит ли программа на паузе или нет. Я решил сделать чтоб выводилось Pause , a при повторном нажатии на P экран возвращался в первоначальное состояние...Вобщем написал Pause2 - теперь программа виснет.
Предполагаю что причина в неверном выделении памяти...но сам
найти ошибку не могу.
Подскажите где я набажил.
И ещё как заставить работать клавишу Pause...т.е. какой у нее скан код...а то я не могу найти в книжке. Сам же написав программку
получаю 0 0 - что заведомо неверно :(
Приложение:
Отправлен: 07.04.2006, 22:04
Вопрос задал: Denton (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Артём Шегеда
Здравствуйте, Denton!
Зачастую, достаточно сложные задачи выдумываются новичками :) Эта - одна из них. Почему виснет программа? - Не имею малейшего представления. Очень похоже, что ты напутал с координатами прямоугольника, скорее всего, подразумевалось
GetMaxX div 2 - 70, GetMaxY div 2 - 70, GetMaxX div 2 + 70, GetMaxY div 2 +70
Ну а с клавишей Pause будет намного сложнее... Средствами языка здесь ничего не сделаешь.
1. Перехватываем клавиатурное прерывание (int 9)
2. Заводим переменную PauseFlag, которую контролируем в основном цикле программы
3. В прерывании отслеживаем нажатие Pause (точнее, скан-кода, являющегося одним из серии для клавиши Pause - $45)
4. После завершения программы возвращаем обработчик прерывания на место.
Предупреждение: игры с векторами прерываний под чистым DOS чреваты перезагрузкой ;) Поэтому сохраняйся почаще (а лучше, поставь автосохранение). А вообще, ты резко стартанул и находишься на той черте, после которой или остаются с паскалем, или переходят на ассемблер :)
Приложение:
Ответ отправил: Артём Шегеда (статус: 5-ый класс)
Ответ отправлен: 07.04.2006, 23:38 Оценка за ответ: 5 Комментарий оценки: пасиб
Отвечает: EPDSota
Здравствуйте, Denton!
Ассемблер - мощный язык))... Скан-код можно получить так:
function ScanCod:byte;assembler;asm in al,60h;end;{возвращается скан-код последней клавиша, изменившая свой статус}
В итоге пауза будет выглядеть:
procedure pause;
begin
{это место как исправить - см. предыдущий ответ}
repeat until (ScanCod<>29)and(ScanCod<>29+$80) ;{задрежка идет пока последняя нажатая-отжатая клавиша - break}
...
end;
begin
while(ScanCod<>29)do;{просто ждем кнопки пауза}
writeln('paused');
pause;
writeln('end');
end.
--------- Открыть глаза навстречу солнцу
Ответ отправил: EPDSota (статус: Специалист)
Ответ отправлен: 08.04.2006, 10:09 Оценка за ответ: 5 Комментарий оценки: спасиба