summaryrefslogtreecommitdiffhomepage
path: root/controller.lua
blob: b642bd957dc6844828cfcab9c3db9ebd6e534333 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
-- `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 = {}

-- 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)
	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

-- 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
			return set.joystick:isGamepadDown(set[action])
		end
	end
end

-- Callbacks from LÖVE2D
-- Create new sets when new joystick is added
function Controller.joystickadded(joystick)
	Controller.registerSet("dpleft", "dpright", "dpup", "dpdown", "a", "b", joystick)
end

-- Gamepad input callbacks
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