Skip to content

Модуль keys

Вы можете перехватывать события клавиатуры с помощью модуля "keys".

Обычно, перехват клавиш имеет смысл использовать для организации текстового ввода.

Для задания того, какие именно клавиши необходимо отслеживать, определите функцию keys:filter(press, key). Эта функция должна возвращать true в том случае, если вы хотите отследить данное событие. Например:

lua
require "keys"

function keys:filter(press, key)
	return press -- ловим нажатия любых клавиш
end

В примере мы просто возвращаем параметр press, который равен true для события нажатия клавиши и false -- отжатия. В key передаётся символическое название клавиши (в виде строки).

Обычно, нам нужно выбрать какие именно клавиши мы хотим перехватывать:

lua
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 -- вызов меню).

Ниже приводится простой пример вывода на экран символических имён клавиш:

lua
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 -- для отжатой, например:

lua
require "timer"
require "keys"

game.timer = function(s) -- показываем состояние клавиши курсор вправо
	dprint("state of 'right' key: ", keys:state 'right')
	p("Состояние клавиши 'вправо':", keys:state 'right')
end

timer:set(30)