Программирование с нуля - это совсем просто! 109) Программирование спрайтовых игр: Ввод с клавиатуры и от
Школа программирования
109) Программирование спрайтовых игр: Ввод с клавиатуры и отображение фона
Последний выпуск по спрайтовым играм - был в выпуске N 106.
Ввод с клавиатуры
В BlitzBasic существует пять команд анализа состояния нажатых и отпущенных клавиш. С одной мы уже знакомы - это
KeyHit (сканкод-клавиши)
которая возвращает число нажатий на указанную клавишу с момента последнего вызова данной функции или 0, если клавиша с тех пор не нажималась. Коды всех клавиш приведены в документации к системе. Из них нам будут наиболее интересны код клавиш Escape (1), пробела (57), функциональных клавиш F1-F10 (59-68), и четырех стрелочек (на нецифровой области) - 203- влево, 205 - вправо, 200 - вверх, 208 - вниз.
Текущее состояние конкретной клавиши показывает функция KeyDown(сканкод), возвращающая 1, если клавиша в момент вызова функции нажата, и 0 в противном случае.
Если мы не знаем, какую конкретно клавишу может нажать пользователь, надо обратиться к функции GetKey(), которая вернет ASCII-код нажатой клавиши.
Важно! ASCII-код не совпадает со скан-кодом!
В ряде случаев удобно дождаться нажатия клавиши, не выполняя в программе никаких действий. Функция WaitKey() ожидает нажатия и возвращает ASCII-код соответствующей нажатой клавиши.
Если пользователь активно взаимодействует с клавиатурой, то программа может не успеть обработать все нажатия, которые накапливаются в системном буфере. Когда же до них дойдет очередь, ситуация в игре может измениться. Поэтому иногда бывает полезным очистить очередь необработанных клавиш. Для этого достаточно выполнить команду
FlushKeys
без параметров.
Отображение больших фоновых изображений
Практически во всех спрайтовых играх персонаж действует на игровых пространствах, которые значительно превосходят видимую на экране часть. В таких случаях фоновое изображение скроллируется в нужном направлении - либо автоматически, либо при подведении мышки к границам окна.
Рассмотрим пример перемещения спрайтового персонажа по большому игровому пространству. Это пространство (карта) должно быть подготовлена заранее. Допустим, разрешение программы составит 640*480 точек, а карта будет иметь размеры 1024*768 пикселов. На ее фоне мы желаем отображать анимированный спрайт из ранее описанного примера.
Только в начало потребуется, прежде всего, добавить команду загрузки нашей карты:
Идентификатор спрайта карты хранится в переменной map.
Где выводить данный большой спрайт? Нам понадобятся две новые переменные mapx и mapy, которые будут хранить координаты верхнего левого угла карты:
mapx = 0
mapy = 0
А само отображение карты будет происходить в главном цикле, перед выводом анимированного спрайта (чтобы не загораживать его):
while not KeyHit(1)
Cls
if MilliSecs() > FirstTime + 100 then
FirstTime = Millisecs()
N = (N + 1) mod 5
end if
Text 400,100,N
DrawImage map, mapx,mapy
DrawImage aspr, 400, 200, N
Flip
Wend
Теперь достаточно изменять значения этих переменных mapx/mapy, чтобы создать ощущение движения нашего спрайта по фону. Для этого будем отслеживать нажатия на клавиши-стрелки, и при необходимости изменять значения переменных с координатами карты:
while not KeyHit(1)
Cls
if MilliSecs() > FirstTime + 100 then
FirstTime = Millisecs()
N = (N + 1) mod 5
end if
; if KeyDown(208) then
mapy = mapy-1 end if
if KeyDown(205) then
mapx = mapx-1 end if
Text 400,100,N
DrawImage map, mapx,mapy
DrawImage aspr, 400, 200, N
Flip
Wend
Теперь нажатие на стрелку-вправо или стрелку-вниз приведет к движению спрайта по фону, при этом спрайт-персонаж будет виден в прозрачном режиме. Кроме того, на обе клавиши можно нажимать одновременно, что позволит создать движение по диагонали.
Задание.
Доработайте данную программу для движения во всех направлениях.
Введите ограничения на перемещение так, чтобы экран всегда был полностью занят областью карты (сейчас персонаж может уходить за края карты, а сама она при этом уезжает из видимой части).