diff --git a/class/MockCellulo.lua b/class/MockCellulo.lua index 9d12d52..7481f1d 100644 --- a/class/MockCellulo.lua +++ b/class/MockCellulo.lua @@ -1,30 +1,53 @@ local assertArgs = include "assertArgs" local util = include "util" +local config = require "conf" local MockCellulo = lib "class" ("MockCellulo") MockCellulo:include(mixin "Angle") MockCellulo:include(mixin "Position") +local MOVEMENT_SPEED = 20 +local ROTATION_SPEED = 0.01 + function MockCellulo:initialize() - self:setPosition(0, 0, 0) + self:setPosition(config.CELLULO_PLANE.ox, config.CELLULO_PLANE.oy, 0) self:setAngle(0, 0, 1, 0) return self end function MockCellulo:update(dt) - + local dx = 0 + dx = dx - (lovr.keyboard.isDown("j") and 1 or 0) + dx = dx + (lovr.keyboard.isDown("l") and 1 or 0) + local dy = 0 + dy = dy - (lovr.keyboard.isDown("i") and 1 or 0) + dy = dy + (lovr.keyboard.isDown("k") and 1 or 0) + + dx = dx * MOVEMENT_SPEED + dy = dy * MOVEMENT_SPEED + + local x, y, _ = self:getPosition() + self:setPosition(x + dx, y + dy, 0) + + local da = 0 + da = da - (lovr.keyboard.isDown("u") and 1 or 0) + da = da + (lovr.keyboard.isDown("o") and 1 or 0) + da = da * ROTATION_SPEED + local a = self:getAngle() + self:setAngle(a + da) + end function MockCellulo:getX() return self.x end function MockCellulo:getY() return self.y end function MockCellulo:getTheta() return self.angle end function MockCellulo:getConnectionStatus() return 1 end function MockCellulo:setHapticBackdriveAssist(...) return end function MockCellulo:setGoalVelocity(...) return end function MockCellulo:setGoalPose(...) return end function MockCellulo:setGoalPosition(...) return end function MockCellulo:getKidnapped() return false end return MockCellulo \ No newline at end of file diff --git a/lib/lovr-keyboard.lua b/lib/lovr-keyboard.lua new file mode 100755 index 0000000..1b198d5 --- /dev/null +++ b/lib/lovr-keyboard.lua @@ -0,0 +1,151 @@ +local ffi = require 'ffi' +local C = ffi.os == 'Windows' and ffi.load('glfw3') or ffi.C + +ffi.cdef [[ + typedef struct GLFWwindow GLFWwindow; + typedef void(*GLFWkeyfun)(GLFWwindow*, int, int, int, int); + + GLFWwindow* glfwGetCurrentContext(void); + int glfwGetKey(GLFWwindow* window, int key); + GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun callback); +]] + +local window = C.glfwGetCurrentContext() + +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 +} + +for k, v in pairs(keymap) do + keymap[v] = k +end + +local keyboard = {} + +function keyboard.isDown(key, ...) + if not key then return false end + local keycode = keymap[key] + assert(keycode and type(keycode) == 'number', 'Unknown key: ' .. key) + return C.glfwGetKey(window, keycode) == 1 or keyboard.isDown(...) +end + +C.glfwSetKeyCallback(window, function(window, key, scancode, action, mods) + if action ~= 2 and keymap[key] then + lovr.event.push(action > 0 and 'keypressed' or 'keyreleased', keymap[key]) + end +end) + +return keyboard diff --git a/main.lua b/main.lua index efe8167..1055002 100644 --- a/main.lua +++ b/main.lua @@ -1,61 +1,63 @@ require "require" -- lib, include, class if not debug then debug = {} end debug.log = print -- +lovr.keyboard = lib "lovr-keyboard" + local pollr = lib "pollr" local phong = lib "phong" local stager = lib "stager" local global = require "global" local Cellulo = require "cellulo" local config = require "conf" local shader = phong() shader:send("lightPosition", { 0, 10, 10 }) function lovr.load() global:load() stager:push("scenes/game") -- initialize library if config.ENABLE_CELLULO then Cellulo.lib.initialize() else global.robot = (class "MockCellulo"):new() global.playerBoid:setCellulo(global.robot) end if not global.robot then -- redirect to menu if robot is missing stager:push("scenes/menu") end end local time = 0 function lovr.update(dt) time = time + dt while time > 1 do time = time - 1 lovr.slowUpdate(1) end pollr.update() stager:update(dt) global:update(dt) end function lovr.slowUpdate(...) stager:slowUpdate(...) end function lovr.draw() stager:draw() global:draw() end function pollr.buttonpressed(...) stager:buttonpressed(...) end function lovr.controlleradded(...) stager:controlleradded(...) end function lovr.controllerremoved(...) stager:controllerremoved(...) end \ No newline at end of file