Skip to content

xiejiangzhi/input

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Input

Simple and powerful input handler for LOVE2D.

Features

  • Support keyboard, mouse, joystick
  • Check key is down with delay and interval. And can get duration time.
  • Check pressed or released on current frame.
  • Check multiple keys down with delay and interval.
  • Check sequence keys down with interval limit.
  • Get pressed keys.
  • Get history of pressed keys.

Example

local Input = require 'input'

function love.load()
  Input.bind_callbacks()
end

function love.update(dt)
  local delay, interval = 0.5, 1
  local is_down, _, duration = Input.down('a', delay, interval)
  local is_down, val, duration = Input.down('leftx')
  local is_pressed, data, released_duration = Input.pressed('a')
  local is_released, data, pressed_duration = Input.released('leftx')
  local is_down = Input.multidown({ 'a', 'b' }, delay, interval)
  local min_interval, max_interval = 0, 0.3
  local is_down, data_of_last_key = Input.sequence({ 'a', 'b' }, min_interval, max_interval)

  local keys = iNput.get_down_keys()
  local keys_info = Input.get_history(2)
end

Better example please see here

API

Bind callbacks

Call it to setup input callbacks.

Input.bind_callbacks()

Check key is down

is_down, data, duration = Input.down(key, delay, interval)

delay and interval unit seconds

data is the axis value for axis key. nil for normal key duration is the duration time in second.

-- for normal key
local is_down, data, duration = Input.down('1')
if is_down then assert(data == nil) end

-- for mouse
local is_down, pos, duration = Input.down('mouse1')
if is_down then print(pos.x, pos.y) end

-- for gamepad axis
local is_down, axis_val, duration = Input.down('leftx')
if is_down then assert(type(data) == 'number') end

-- for wheel
local is_down, wheel_val, duration = Input.down('wheelx')
if is_down then assert(type(wheel_val) == 'number') end

Check multiple keys is down

is_down, data_of_last_key, duration = Input.multidown(keys, delay, interval)

delay and interval unit seconds

local is_down, mouse_pos, duration = Input.multidown({ 'fdown', 'mouse1' }, 1, 1)

Check a key is pressed on the current frame

is_pressed, data, released_time = Input.pressed(key)

data is the axis value for axis key. nil for normal key released_time will be nil for first call

Check a key is released on the current frame

is_released, data, released_time = Input.released(key)

data is the axis value for axis key. nil for normal key released_time will be nil for first call

Check keys is down in sequence

is_pressed, data_of_last_key = Input.sequence(keys, min_interval, max_interval)

  -- any interval
  Input.sequence({ 'a', 'b', 'c' })

  -- The interval between two presses must be less than 0.3s and greater than 0.1s
  Input.sequence({ 'a', 'b', 'c' }, 0.1, 0.3)

NOTE: Following keys is invalid for sequence, but you can change the set by Input.sequence_except_keys

-- Default value
Input.sequence_except_keys = {
  mousemove = true,
  wheelx = true, wheely = true,
  leftx = true, lefty = true,
  rightx = true, righty = true
}

-- Except sequence keys 'a', 's' 'd' and 'w'
for i, k in ipairs({ 'a', 's', 'd', 'w' }) do
  Input.sequence_except_keys[k] = true
end

Get a relative to time of the last action(pressed or released)

seconds = Input.duration(key, strict)

strict: Whether to calculate the exact time. Default value is false, duration relative to last frame.

Return nil if the key has never been down

Get the history of pressed keys. Max history items is 10.

items = Input.get_history(n)

items: Sort by pressing time from nearest to far. item.key: item.interval: relative to the time of previous key was pressed

Get all down keys

keys = Input.get_down_keys

Get key data

data = Input.get_data(key)

Manually input event

Call following callbacks, the arguments is the same as Love2D's callbacks

local Callbacks = {
  'keypressed', 'keyreleased',
  'mousepressed', 'mousereleased', 'mousemoved', 'wheelmoved',
  'gamepadpressed', 'gamepadreleased', 'gamepadaxis'
}

Example

Input.keypressed('a')
Input.keyreleased('a')

Axis threshold

Release axis key if axis value < threshold, but still can get the current axis value by Input.get_data

Input.axis_threshold = {
  leftx = 0.1, lefty = 0.1,
  rightx = 0.1, righty = 0.1,
  l2 = 0.1, r2 = 0.1,
}

Multiple gamepad

Set Input.multiple_gamepad = true, then all gamepad keys will has a suffix {key}:{index}

The first trigger gamepad will get index 1, others will be automatically incremented

Input.multiple_gamepad = true
Input.down('fdown:1') -- first gamepad
Input.down('fdown:2') -- seconds gamepad

NOTE: Now, multiple gamepad keys will push to one list, so Input.sequence cannot use specified gamepad index. Maybe it will be fixed later

Keys

keyborad Key Constant

Mouse

local MouseKeysMapping = {
  move = 'mousemove',
  wheelx = 'wheelx', wheely = 'wheely',
  [1] = 'mouse1', [2] = 'mouse2', [3] = 'mouse3',
  [4] = 'mouse4', [5] = 'mouse5', [6] = 'mouse6',
}
local WheelKeysMapping = {
  x = 'wheelx', y = 'wheely'
}

Gamepad

local GamepadKeysMapping = {
  a = 'fdown', y = 'fup', x = 'fleft', b = 'fright',
  back = 'back', guide = 'guide', start = 'start',
  leftstick = 'leftstick', rightstick = 'rightstick',
  leftshoulder = 'l1', rightshoulder = 'r1',
  dpup = 'dpup', dpdown = 'dpdown', dpleft = 'dpleft', dpright = 'dpright',

  -- axis
  leftx = 'leftx', lefty = 'lefty',
  rightx = 'rightx', righty = 'righty',
  triggerleft = 'l2', triggerright = 'r2'
}

About

Input for Love2D

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages