Browse Source

Add wasPressed and wasReleased

Maxzymus Dominick 4 years ago
parent
commit
182ba88cec
1 changed files with 146 additions and 117 deletions
  1. 146 117
      lovr-keyboard.lua

+ 146 - 117
lovr-keyboard.lua

@@ -6,7 +6,7 @@ local C = ffi.os == 'Windows' and ffi.load('glfw3') or ffi.C
 ffi.cdef [[
 ffi.cdef [[
   typedef struct GLFWwindow GLFWwindow;
   typedef struct GLFWwindow GLFWwindow;
   typedef void(*GLFWkeyfun)(GLFWwindow*, int, int, int, int);
   typedef void(*GLFWkeyfun)(GLFWwindow*, int, int, int, int);
-  typedef void (*GLFWcharfun)(GLFWwindow*, unsigned int);
+  typedef void(*GLFWcharfun)(GLFWwindow*, unsigned int);
 
 
   GLFWwindow* glfwGetCurrentContext(void);
   GLFWwindow* glfwGetCurrentContext(void);
   int glfwGetKey(GLFWwindow* window, int key);
   int glfwGetKey(GLFWwindow* window, int key);
@@ -17,120 +17,120 @@ ffi.cdef [[
 local window = C.glfwGetCurrentContext()
 local window = C.glfwGetCurrentContext()
 
 
 local keymap = {
 local keymap = {
-  ['space'] = 32,
-  ['\''] = 39,
-  [','] = 44,
-  ['-'] = 45,
-  ['.'] = 46,
-  ['/'] = 47,
-
-  ['0'] = 48,
-  ['1'] = 49,
-  ['2'] = 50,
-  ['3'] = 51,
-  ['4'] = 52,
-  ['5'] = 53,
-  ['6'] = 54,
-  ['7'] = 55,
-  ['8'] = 56,
-  ['9'] = 57,
-
-  [';'] = 59,
-  ['='] = 61,
-
-  ['a'] = 65,
-  ['b'] = 66,
-  ['c'] = 67,
-  ['d'] = 68,
-  ['e'] = 69,
-  ['f'] = 70,
-  ['g'] = 71,
-  ['h'] = 72,
-  ['i'] = 73,
-  ['j'] = 74,
-  ['k'] = 75,
-  ['l'] = 76,
-  ['m'] = 77,
-  ['n'] = 78,
-  ['o'] = 79,
-  ['p'] = 80,
-  ['q'] = 81,
-  ['r'] = 82,
-  ['s'] = 83,
-  ['t'] = 84,
-  ['u'] = 85,
-  ['v'] = 86,
-  ['w'] = 87,
-  ['x'] = 88,
-  ['y'] = 89,
-  ['z'] = 90,
-
-  ['['] = 91,
-  ['\\'] = 92,
-  [']'] = 93,
-  ['`'] = 96,
-
-  ['escape'] = 256,
-  ['return'] = 257,
-  ['enter'] = 257,
-  ['tab'] = 258,
-  ['backspace'] = 259,
-  ['insert'] = 260,
-  ['delete'] = 261,
-  ['right'] = 262,
-  ['left'] = 263,
-  ['down'] = 264,
-  ['up'] = 265,
-  ['pageup'] = 266,
-  ['pagedown'] = 267,
-  ['home'] = 268,
-  ['end'] = 269,
-  ['capslock'] = 280,
-  ['scrolllock'] = 281,
-  ['numlock'] = 282,
-  ['printscreen'] = 283,
-  ['pause'] = 284,
-
-  ['f1'] = 290,
-  ['f2'] = 291,
-  ['f3'] = 292,
-  ['f4'] = 293,
-  ['f5'] = 294,
-  ['f6'] = 295,
-  ['f7'] = 296,
-  ['f8'] = 297,
-  ['f9'] = 298,
-  ['f10'] = 299,
-  ['f11'] = 300,
-  ['f12'] = 301,
-
-  ['kp0'] = 320,
-  ['kp1'] = 321,
-  ['kp2'] = 322,
-  ['kp3'] = 323,
-  ['kp4'] = 324,
-  ['kp5'] = 325,
-  ['kp6'] = 326,
-  ['kp7'] = 327,
-  ['kp8'] = 328,
-  ['kp9'] = 329,
-  ['kp.'] = 330,
-  ['kp/'] = 331,
-  ['kp*'] = 332,
-  ['kp-'] = 333,
-  ['kp+'] = 334,
-  ['kpenter'] = 335,
-  ['kp='] = 336,
-
-  ['lshift'] = 340,
-  ['lctrl'] = 341,
-  ['lalt'] = 342,
-  ['lgui'] = 343,
-  ['rshift'] = 344,
-  ['rctrl'] = 345,
-  ['ralt'] = 346,
-  ['rgui'] = 347,
-  ['menu'] = 348
+  ['space'] = { 32, 0, 0 },
+  ['\''] = { 39, 0, 0 },
+  [','] = { 44, 0, 0 },
+  ['-'] = { 45, 0, 0 },
+  ['.'] = { 46, 0, 0 },
+  ['/'] = { 47, 0, 0 },
+
+  ['0'] = { 48, 0, 0 },
+  ['1'] = { 49, 0, 0 },
+  ['2'] = { 50, 0, 0 },
+  ['3'] = { 51, 0, 0 },
+  ['4'] = { 52, 0, 0 },
+  ['5'] = { 53, 0, 0 },
+  ['6'] = { 54, 0, 0 },
+  ['7'] = { 55, 0, 0 },
+  ['8'] = { 56, 0, 0 },
+  ['9'] = { 57, 0, 0 },
+
+  [';'] = { 59, 0, 0 },
+  ['='] = { 61, 0, 0 },
+
+  ['a'] = { 65, 0, 0 },
+  ['b'] = { 66, 0, 0 },
+  ['c'] = { 67, 0, 0 },
+  ['d'] = { 68, 0, 0 },
+  ['e'] = { 69, 0, 0 },
+  ['f'] = { 70, 0, 0 },
+  ['g'] = { 71, 0, 0 },
+  ['h'] = { 72, 0, 0 },
+  ['i'] = { 73, 0, 0 },
+  ['j'] = { 74, 0, 0 },
+  ['k'] = { 75, 0, 0 },
+  ['l'] = { 76, 0, 0 },
+  ['m'] = { 77, 0, 0 },
+  ['n'] = { 78, 0, 0 },
+  ['o'] = { 79, 0, 0 },
+  ['p'] = { 80, 0, 0 },
+  ['q'] = { 81, 0, 0 },
+  ['r'] = { 82, 0, 0 },
+  ['s'] = { 83, 0, 0 },
+  ['t'] = { 84, 0, 0 },
+  ['u'] = { 85, 0, 0 },
+  ['v'] = { 86, 0, 0 },
+  ['w'] = { 87, 0, 0 },
+  ['x'] = { 88, 0, 0 },
+  ['y'] = { 89, 0, 0 },
+  ['z'] = { 90, 0, 0 },
+
+  ['['] = { 91, 0, 0 },
+  ['\\'] = { 92, 0, 0 },
+  [']'] = { 93, 0, 0 },
+  ['`'] = { 96, 0, 0 },
+
+  ['escape'] = { 256, 0, 0 },
+  ['return'] = { 257, 0, 0 },
+  ['enter'] = { 257, 0, 0 },
+  ['tab'] = { 258, 0, 0 },
+  ['backspace'] = { 259, 0, 0 },
+  ['insert'] = { 260, 0, 0 },
+  ['delete'] = { 261, 0, 0 },
+  ['right'] = { 262, 0, 0 },
+  ['left'] = { 263, 0, 0 },
+  ['down'] = { 264, 0, 0 },
+  ['up'] = { 265, 0, 0 },
+  ['pageup'] = { 266, 0, 0 },
+  ['pagedown'] = { 267, 0, 0 },
+  ['home'] = { 268, 0, 0 },
+  ['end'] = { 269, 0, 0 },
+  ['capslock'] = { 280, 0, 0 },
+  ['scrolllock'] = { 281, 0, 0 },
+  ['numlock'] = { 282, 0, 0 },
+  ['printscreen'] = { 283, 0, 0 },
+  ['pause'] = { 284, 0, 0 },
+
+  ['f1'] = { 290, 0, 0 },
+  ['f2'] = { 291, 0, 0 },
+  ['f3'] = { 292, 0, 0 },
+  ['f4'] = { 293, 0, 0 },
+  ['f5'] = { 294, 0, 0 },
+  ['f6'] = { 295, 0, 0 },
+  ['f7'] = { 296, 0, 0 },
+  ['f8'] = { 297, 0, 0 },
+  ['f9'] = { 298, 0, 0 },
+  ['f10'] = { 299, 0, 0 },
+  ['f11'] = { 300, 0, 0 },
+  ['f12'] = { 301, 0, 0 },
+
+  ['kp0'] = { 320, 0, 0 },
+  ['kp1'] = { 321, 0, 0 },
+  ['kp2'] = { 322, 0, 0 },
+  ['kp3'] = { 323, 0, 0 },
+  ['kp4'] = { 324, 0, 0 },
+  ['kp5'] = { 325, 0, 0 },
+  ['kp6'] = { 326, 0, 0 },
+  ['kp7'] = { 327, 0, 0 },
+  ['kp8'] = { 328, 0, 0 },
+  ['kp9'] = { 329, 0, 0 },
+  ['kp.'] = { 330, 0, 0 },
+  ['kp/'] = { 331, 0, 0 },
+  ['kp*'] = { 332, 0, 0 },
+  ['kp-'] = { 333, 0, 0 },
+  ['kp+'] = { 334, 0, 0 },
+  ['kpenter'] = { 335, 0, 0 },
+  ['kp='] = { 336, 0, 0 },
+
+  ['lshift'] = { 340, 0, 0 },
+  ['lctrl'] = { 341, 0, 0 },
+  ['lalt'] = { 342, 0, 0 },
+  ['lgui'] = { 343, 0, 0 },
+  ['rshift'] = { 344, 0, 0 },
+  ['rctrl'] = { 345, 0, 0 },
+  ['ralt'] = { 346, 0, 0 },
+  ['rgui'] = { 347, 0, 0 },
+  ['menu'] = { 348, 0, 0 }
 }
 }
 
 
 local reverse = {}
 local reverse = {}
@@ -141,16 +141,45 @@ for k, v in pairs(reverse) do
   keymap[k] = v
   keymap[k] = v
 end
 end
 
 
-
 local keyboard = {}
 local keyboard = {}
 
 
 function keyboard.isDown(key, ...)
 function keyboard.isDown(key, ...)
   if not key then return false end
   if not key then return false end
-  local keycode = keymap[key]
+  local keycode = keymap[key][1]
   assert(keycode and type(keycode) == 'number', 'Unknown key: ' .. key)
   assert(keycode and type(keycode) == 'number', 'Unknown key: ' .. key)
   return C.glfwGetKey(window, keycode) == 1 or keyboard.isDown(...)
   return C.glfwGetKey(window, keycode) == 1 or keyboard.isDown(...)
 end
 end
 
 
+function keyboard.wasPressed(key, ...)
+  if not key then return false end
+  local keycode = keymap[key][1]
+  assert(keycode and type(keycode) == 'number', 'Unknown key: ' .. key)
+  local pressed = false
+  keymap[key][3] = C.glfwGetKey(window, keycode)
+  if keymap[key][2] == 0 and keymap[key][3] == 1 then
+    pressed = true 
+  else
+    pressed = false
+  end
+  keymap[key][2] = keymap[key][3]
+  return pressed
+end
+
+function keyboard.wasReleased(key, ...)
+  if not key then return false end
+  local keycode = keymap[key][1]
+  assert(keycode and type(keycode) == 'number', 'Unknown key: ' .. key)
+  local released = false
+  keymap[key][3] = C.glfwGetKey(window, keycode)
+  if keymap[key][2] == 1 and keymap[key][3] == 0 then
+    released = true 
+  else
+    released = false
+  end
+  keymap[key][2] = keymap[key][3]
+  return released
+end
+
 C.glfwSetKeyCallback(window, function(window, key, scancode, action, mods)
 C.glfwSetKeyCallback(window, function(window, key, scancode, action, mods)
   if action ~= 2 and keymap[key] then
   if action ~= 2 and keymap[key] then
     lovr.event.push(action > 0 and 'keypressed' or 'keyreleased', keymap[key])
     lovr.event.push(action > 0 and 'keypressed' or 'keyreleased', keymap[key])