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. --- controller.lua | 203 ----------------------------------------------------- main.lua | 2 +- not/Controller.lua | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 202 insertions(+), 204 deletions(-) delete mode 100644 controller.lua create mode 100644 not/Controller.lua diff --git a/controller.lua b/controller.lua deleted file mode 100644 index f035162..0000000 --- a/controller.lua +++ /dev/null @@ -1,203 +0,0 @@ --- `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`. --- For information on additional functions, look below. - --- Namespace -Controller = {} -Controller.sets = {} -Controller.axes = {} -Controller.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 diff --git a/main.lua b/main.lua index 7e1232e..b905de6 100644 --- a/main.lua +++ b/main.lua @@ -27,7 +27,7 @@ end require "not.World" require "camera" require "not.Menu" -require "controller" +require "not.Controller" require "not.Settings" -- Temporary debug 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