Модуль keys
Вы можете перехватывать события клавиатуры с помощью модуля "keys".
Обычно, перехват клавиш имеет смысл использовать для организации текстового ввода.
Для задания того, какие именно клавиши необходимо отслеживать, определите функцию keys:filter(press, key). Эта функция должна возвращать true в том случае, если вы хотите отследить данное событие. Например:
require "keys"
function keys:filter(press, key)
return press -- ловим нажатия любых клавиш
endВ примере мы просто возвращаем параметр press, который равен true для события нажатия клавиши и false -- отжатия. В key передаётся символическое название клавиши (в виде строки).
Обычно, нам нужно выбрать какие именно клавиши мы хотим перехватывать:
require "keys"
function keys:filter(press, key)
if key == '0' or key == '1' or key == 'z' then
return press -- ловим нажатия клавиш z, 1 и 0
end
endИтак, keys:filter позволяет выбрать нужные события клавиатуры. А сами события приходят в игру в виде вызова обработчика 'onkey' для текущей комнаты или (если он не задан в комнате) для объекта 'game'.
Обработчик onkey действует как обычный обработчик STEAD3. Он может вернуть false и тогда считается, что клавиша не была обработана игрой. Либо он может выполнить какое-нибудь действие.
Внимание: Если игра будет обрабатывать все события клавиш, то даже те комбинации, которые используются самим INSTEAD будут обрабатываться игрой, а не интерпретатором. Например, если игра будет перехватывать клавишу "escape" (и не возвращать false из обработчика), то клавиша "escape" перестанет обрабатываться интерпретатором INSTEAD (escape -- вызов меню).
Ниже приводится простой пример вывода на экран символических имён клавиш:
require "keys"
function keys:filter(press, key)
return press -- ловим все нажатия
end
game.onkey = function(s, press, key)
dprint("pressed: ", key)
p("Нажата: ", key)
return false -- давать обрабатывать клавиши интерпретатору INSTEAD
endЭтот пример можно использовать для того, чтобы выяснить символическое имя конкретной клавиши.
При написании аркадных игр бывает полезным не получать событие от клавиатуры, а опрашивать её (как правило, в таймере). Для этого вы можете использовать функцию keys:state(имя клавиши).
Эта функция возвращает true для нажатой клавиши и false -- для отжатой, например:
require "timer"
require "keys"
game.timer = function(s) -- показываем состояние клавиши курсор вправо
dprint("state of 'right' key: ", keys:state 'right')
p("Состояние клавиши 'вправо':", keys:state 'right')
end
timer:set(30)