a library to track the current state of key presses in Love2D
this library has moved away from github and can be found here instead: https://git.ptrc.gay/SpaceCat-Chan/lovekeys
there is a simple example in tests/basic
to use the library all that is needed is to require it:
LoveKeys = require("Path_To_LoveKeys")
any keys that you expect to use should be registered in love.load
function love.load()
LoveKeys.RegisterKey("up")
LoveKeys.RegisterKey("space")
LoveKeys.RegisterKey("s")
LoveKeys.RegisterKey("Jump") --you don't need to use actual keys, to see more check out the aliasing section
end
then once you have done that, you can get information on the current state of the key in 3 ways:
LoveKeys.up.Pressed
-- or
LoveKeys["space"].Released
-- or
LoveKeys.Get("s").Held
in your love.update you should add LoveKeys.update to the end of it
function love.update(dt)
--[[
a bunch of code
]]
LoveKeys.update(dt)
end
when it comes to love.keypressed and love.keyreleased then this is how you should be doing it:
function love.keypressed(Key)
LoveKeys.keypressed(Key)
end
function love.keyreleased(Key)
LoveKeys.keyreleased(Key)
end
specifically you shouldn't have anything else in them, purely because key repeat can't be handled if you do that
if you still want to handle events you can instead define the functions LoveKeys.Event.keypressed and LoveKeys.Event.keyreleased
like this:
function LoveKeys.Event.keypressed(KeyName, Key)
print(KeyName.." was pressed, it's delay setting is at: "..Key.Repeat.Delay)
end
function LoveKeys.Event.keyreleased(KeyName, Key)
print(KeyName.." was released, it was pressed for "..Key.PressLength.." seconds")
end
defining love.keypressed and love.keyreleased can be annoying so there is a shortcut for that
if the global variable GLOBAL_SET_LOVE_KEYS
is set to true when LoveKeys is required, it will automatically define both love.keypressed and love.keyreleased to the same as seen above
using LoveKeys.SetRepeatInfo() it is possible to tell the library how you want a key to repeat
LoveKeys.SetRepeatInfo("space", 2, 1)
the above code will make it so that once the space key has been held for 2 seconds, it will act as if it was pressed again, then again one second later it will do it again and it will keep doing it every second until the space key is released
the first argument is the delay and the second is the repeat, they can be found in <KeyInfo>.Repeat.Delay
and <KeyInfo>.Repeat.Repeat
respectivly
when a key is repeating it is possible to tell that it is by checking <KeyInfo>.Repeating
Aliasing allows you to combine multiple keys into one name
it is especially useful if you want your users to be able to change keybinds
a basic example of how to create a keybind goes like this:
function love.load()
LoveKeys.Alias({"w", "up"}, "MoveUp")
end
with the above Alias, MoveUp will be pressed if w or up is pressed
both the first and second argument can be tables or strings interchangably
there is an optional third argument which specifies how the keys interact.
the allowed arguments are: or, and, nor, nand
, the default is or
or
means that if any of the input keys are pressed, the output keys are pressed
and
means that all the input keys must be pressed before the output gets pressed.
nor
and nand
are inverses of or
and and
respectively.
an example can be found in tests/alias/
f you change gamestate and need alot of new keybinds, it can get annoying to have to un-alias and re-alias everything
but with Alias namespacing it is possible to have multiple Alias setups at the same time, with only one of the active at any time
to activate a different namespace from the currently active one you can call LoveKeys.SetAliasNamespace
when defining Aliases they will by default be set for the currently active namespace, but this can be overridden using the fourth argument
function love.load()
LoveKeys.SetAliasNamespace("The_B_Namespace")
LoveKeys.Alias("a", "AAA", nil, "The_A_Namespace")
LoveKeys.Alias("b", "BBB",) -- will be defined for currently active namespace, which is: The_B_Namespace
end
the default active namespace is "default"
i will just dump the format of the table you get from LoveKeys.Get()
here
KeyInfo = {
Pressed = true/false,
Released = true/false,
Held = true/false,
PressLength = number,
Repeating = true/false,
Repeat = {
Repeat = number, --how long between each repeat
Delay = number --how long before it starts repeating, once this time is reached another keypress event happens
},
Alias = {
[namespace_name1] = {
To = Array_Of_Key_Names,
From = Array_Of_Key_Names,
Type = string --valid things are: or, and, nor, nand
}
[namespace_name2] = ...
[...] = ...
}
}
beware of accessing information in namespaces, they could be nil