Jump to content

Keyboard and Mouse Events

Averice

3,306 views

I think I posted this module on the forums in order to help someone a few weeks ago, but I thought It'd get more use if I created a blog post so it doesn't get diluted down in the forums.

 

I've written this event module to make it easy to add keyboard and mouse button binds and it's come in handy to me for quite a few little scripts.

 

Once again excuse the poor spacing as copy and paste here seems to remove my tabs.

 

event.lua

-- Event module written by Averice

event = {}
event.inputBinds = {}
event.mouseBinds = {}

function event.CheckInput()
local succ, err;
for key,tab in pairs(event.inputBinds) do
if( App.window:KeyHit(key) ) then
for k, v in pairs(tab) do
if( not v.Held ) then
succ, err = pcall(v.Func, unpack(v.Args));
if not succ then
print("Event Error[Key]["..k.."]: "..err);
end
end
end
end
if( App.window:KeyDown(key) ) then
for k, v in pairs(tab) do
if( v.Held ) then
succ, err = pcall(v.Func, unpack(v.Args));
if not succ then
print("Event Error[Key]["..k.."]: "..err);
end
end
end
end
end
for but, tab in pairs(event.mouseBinds) do
if( App.window:MouseDown(but) ) then
for k, v in pairs(tab) do
succ, err = pcall(v.Func, unpack(v.Args));
if not succ then
print("Event Error[Mouse]["..k.."]: "..err);
end
end
end
end
end

function event.AddInputBind(key, name, held, func, ...)
local newInput = {
Func = func,
Args = {...},
Held = held or false
}
event.inputBinds[key] = event.inputBinds[key] or {};
event.inputBinds[key][name] = newInput;
end

function event.AddMouseBind(but, name, func, ...)
local newInput = {
Func = func,
Args = {...}
}
event.mouseBinds[but] = event.mouseBinds[but] or {}
event.mouseBinds[but][name] = newInput;
end

function event.RemoveInputBind(key, name)
if( event.inputBinds[key] and event.inputBinds[key][name] ) then
event.inputBinds[key][name] = nil;
end
end

function event.RemoveMouseBind(but, name)
if( event.mouseBinds[but] and event.mouseBinds[but][name] ) then
event.mouseBinds[but][name] = nil;
end
end

 

It's usage is really straight forward, you import the script, and in your App.loop you'll put

event.CheckInput();

This will check for your binds and run them if needed so you don't have to fill your App.loop with key binds.

 

To add a keyboard bind "event.AddInputBind(key, name, held, function, args);

local function printStuff(...)
print("Hello", ...);
end

event.AddInputBind(Key.A, "RandomName", false, printStuff, "How", "are", "you") -- varargs once again.
--when the A key is pushed it should output, "Hello How are you";
-- if 'held' is true it will keep printing while it's held.

--To remove it we use it's name and key.
event.RemoveInputBind(Key.A, "RandomName");

-- Mouse bind functions are the same, just use event.AddMouseBind and event.RemoveMouseBind
-- mouse bind functions are considered always held. Add a check to your function if you only
-- want it done per click.

 

A quick snippet that I use in my splash screen with my StateManager module to cancel the splash if escape is pushed.

event.AddInputBind(Key.Escape, "__SHARDSPLASH", false, function() StateManager:Pop() end);



5 Comments


Recommended Comments

This should be very useful thank you!

 

One question that isn't apparent to me just looking at the code and examples. If one wanted to for example show a HUD item only when a key was held. Would that use a combination of both true/false versions of held with AddInputBind, with the 'release' trigger using false? Or is that outside the scope of what can be accomplished with this as-is?

 

TYVM!

 

EDIT: HUD items may not have been the best choice of example as now that I think about it, if they are drawn while the key is held, then they won't be drawn when the key is not held. But there are other cases not involving rendering where certain states could be desired to be triggered on/off based on held/released.

Share this comment


Link to comment

I can add an onrelease mechanic to this tomorrow as I'm on my phone right now and typing code is difficult on this. It's not too hard just an extra variable for the loop on each key.

Share this comment


Link to comment

Thank you for this elegant lib.

 

A remark: there is no MouseHit event binding. I mean, it's easy to write it using what you've written so far. Do you consider adding it?

 

I'm asking this because I would like to use an "official" version :) in case you update it.

Share this comment


Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...