From 33b3a93138a9eee40727e9f56373b434ceab1cef Mon Sep 17 00:00:00 2001 From: Aki Date: Thu, 6 Apr 2017 20:03:17 +0200 Subject: Controller moved to /not/ and cleaned-up a bit. --- not/Controller.lua | 201 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 not/Controller.lua (limited to 'not/Controller.lua') diff --git a/not/Controller.lua b/not/Controller.lua new file mode 100644 index 0000000..8a2a863 --- /dev/null +++ b/not/Controller.lua @@ -0,0 +1,201 @@ +--- `Controller` +-- Module to manage player input. +-- It uses `love.keypressed`, `love.keyreleased`, `love.gamepadreleased`, `love.gamepadpressed`, `love.joystickadded`, so be sure not to use them by yourself. +-- Rather than that use functions provided by this module: `Controller.controlpressed` and `Controller.controlreleased`. +Controller = { + sets = {}, + axes = {}, + deadzone = .3 +} + +-- Declared to avoid calling nil. Be sure to define yours after this line is performed. +function Controller.controlpressed(set, action, key) end +function Controller.controlreleased(set, action, key) end + +-- Create new controls set. +function Controller.registerSet(left, right, up, down, attack, jump, joystick) + if not Controller.isJoystickUnique(joystick) then return end + local set = {} + set.left = left or "left" + set.right = right or "right" + set.up = up or "up" + set.down = down or "down" + set.attack = attack or "return" + set.jump = jump or "rshift" + set.joystick = joystick + table.insert(Controller.sets, set) + print(set, left, right, up, down, attack, jump, joystick) + return set +end + +-- Reset table of controls sets. +function Controller.reset() + local t = {} + Controller.sets = t +end + +-- Get table of controls sets. +function Controller.getSets() + return Controller.sets +end + +-- Checks if given joystick is unique in current set of Controller sets +function Controller.isJoystickUnique(joystick) + if joystick ~= nil then + for _,set in pairs(Controller.sets) do + if set.joystick == joystick then return false end + end + end + return true +end + +-- Tests all sets if they have control assigned to given key and joystick. +function Controller.testSets(key, joystick) + for i,set in pairs(Controller.sets) do + local action = Controller.testControl(set, key, joystick) + if action ~= nil then + return set, action + end + end + return nil, nil +end + +-- Tests given set if it has controll assigned to given key and joystick. +function Controller.testControl(set, key, joystick) + -- First test if it is joystick and if it is correct one + if joystick == set.joystick then + if key == set.left then + return "left" + elseif key == set.right then + return "right" + elseif key == set.up then + return "up" + elseif key == set.down then + return "down" + elseif key == set.attack then + return "attack" + elseif key == set.jump then + return "jump" + end + end +end + +-- Checks if given action of given set is down +function Controller.isDown(set, action) + if set ~= nil then + if set.joystick == nil then + return love.keyboard.isDown(set[action]) + else + if not Controller.isAxis(set[action]) then + return set.joystick:isGamepadDown(set[action]) + else + return Controller.getAxisState(set.joystick, set[action]) + end + end + end +end + +-- Return key name from given axis and value +function Controller.createAxisName(axis, value) + local key = "axis:"..axis + if value == 0 then + key = key.."0" + elseif value > 0 then + key = key.."+" + else + key = key.."-" + end + return key +end + +-- Checks if given key is an axis +function Controller.isAxis(key) + if string.find(key, "axis:") then + return true + else + return false + end +end + +-- Checks state of key assigned to axis of given joystick +function Controller.getAxisState(joystick, key) + if Controller.axes[joystick] then + local state = Controller.axes[joystick][key] + if state ~= nil then + return state + else + return false + end + end +end + +-- Sets state of key assigned to axis of given joystick +function Controller.setAxisState(joystick, key, state) + if Controller.axes[joystick] == nil then + Controller.axes[joystick] = {} + end + Controller.axes[joystick][key] = state +end + +-- Simulate pressing key on an axis +function Controller.axisPress(joystick, axis, value) + local key = Controller.createAxisName(axis, value) + local set, action = Controller.testSets(key, joystick) + local state = Controller.getAxisState(joystick, key) + if not state then + print(joystick, set, action, key) + Controller.setAxisState(joystick, key, true) + Controller.controlpressed(set, action, key) + end +end + +-- Simulate releasing key on an axis +function Controller.axisRelease(joystick, axis, value) + local key = Controller.createAxisName(axis, value) + local set, action = Controller.testSets(key, joystick) + local state = Controller.getAxisState(joystick, key) + if state then + Controller.setAxisState(joystick, key,false) + Controller.controlreleased(set, action, key) + end +end + +-- Callbacks from LÖVE2D +-- Load gamepad mappings from db file and init module +function Controller.load() + love.joystick.loadGamepadMappings("gamecontrollerdb.txt") +end + +-- Gamepad input callbacks +function Controller.gamepadaxis(joystick, axis, value) + if value ~= 0 then + if math.abs(value) > Controller.deadzone then + Controller.axisPress(joystick, axis, value) + else + Controller.axisRelease(joystick, axis, value) + end + else + Controller.axisRelease(joystick, axis, 1) + Controller.axisRelease(joystick, axis, -1) + end +end +function Controller.gamepadpressed(joystick, key) + local set, action = Controller.testSets(key, joystick) + print(joystick, set, action, key) + Controller.controlpressed(set, action, key) +end +function Controller.gamepadreleased(joystick, key) + local set, action = Controller.testSets(key, joystick) + Controller.controlreleased(set, action, key) +end + +-- Keyboard input callbacks +function Controller.keypressed(key) + local set, action = Controller.testSets(key, nil) + print(nil, set, action, key) + Controller.controlpressed(set, action, key) +end +function Controller.keyreleased(key) + local set, action = Controller.testSets(key, nil) + Controller.controlreleased(set, action, key) +end \ No newline at end of file -- cgit v1.1