Управление по требованию
Практическая работа № 37 «Управление в режиме ожидания»
Практическая работа № 38 «Управление по требованию»
Что происходило в предыдущей программе, если пользователь не нажимал никакую клавишу? Всегда ли такой вариант подходит для программирования игр?
Во многих случаях нужен другой режим: события развиваются независимо от того, нажал игрок какую-либо клавишу или нет. Он вмешивается тогда, когда считает нужным. Это управление по требованию. Для того чтобы использовать такое управление, надо определить момент, когда пользователь нажимает клавишу, и реагировать на это нажатие.
Основной цикл программы можно записать так:
нц пока да
| если нажата клавиша, изменить направление движения
| нарисовать шарик
| ждать 20 мс
| стереть шарик
| переместить шарик
кц
В предыдущем пункте этого параграфа найдите, как можно определить, что пользователь нажал какую-то клавишу.
Мы напишем программу, в которой шарик постоянно движется, изменяя свое направление при нажатии клавиш-стрелок. Если нажать на пробел (обозначение этой клавиши — КЛ_ПРОБЕЛ), шарик останавливается. Часть программы, где при нажатии клавиш изменяется направление движения, выглядит так:
если сигнал клав то
с:=код клав
| изменить направление движения
все
Что произойдёт, если команда сигнал клав вернёт значение нет (никакая клавиша не нажата)?
Как изменяются координаты шарика при движении в каждом из четырёх направлений?
Поскольку величины, на которые изменяются координаты, тоже изменяются, мы введём новые переменные:
dx — изменение х-координаты за один шаг;
dy — изменение у-координаты за один шаг.
Каждая переменная (независимо от другой) может быть положительной, отрицательной или равной нулю. Следующие строчки задают перемещение шарика:
х:=x+dx
у:=y+dy
Куда именно передвинется шарик, зависит от значений dx и dy. Поэтому для изменения направления движения при нажатии клавиши достаточно изменить dx и dy:
если c=KЛ_BЛEBO то dx:=-5; dy:=0 все
если с=КЛ_ВПРАВО то dx:=5; dy:=0 все
если с=КЛ_ВВЕРХ то dx:=0; dy:=-5 все
если с=КЛ_ВНИЗ то dx:=0; dy:=5 все
если с=КЛ_ПРОБЕЛ то dx:=0; dy:=0 все
В последней строке мы останавливаем шарик при нажатии клавиши пробела. Эти команды нужно поставить в основной цикл вместо комментария «изменить направление движения». Полную программу вы можете собрать самостоятельно.
Следующая страница Выводы. Интеллект-карта