-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPlayerControl.lua
More file actions
143 lines (116 loc) · 3.79 KB
/
PlayerControl.lua
File metadata and controls
143 lines (116 loc) · 3.79 KB
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
PlayerControl = {}
PlayerControl.__index = PlayerControl
function PlayerControl.new(eventTable, joystick)
local self = setmetatable({}, PlayerControl)
if eventTable == nil then
-- keyboard DPad Axis Invert Axis
self.event = { left = {"left", "dpleft", "leftx", true},
right = {"right", "dpright", "leftx", false},
up = {"up", "dpup", "lefty", true},
down = {"down", "dpdown", "lefty", false},
jump = {"z", "a", nil, nil},
attack = {"q", "x", nil, nil},
defend = {"d", "b", nil, nil},
use = {"s", "a", nil, nil},
back = {"escape", "back", nil, nil},
start = {"return", "start", nil, nil}}
else
self.event = eventTable
end
self.joystick = joystick
self.eventValue = {}
self.eventTrigger = {}
return self
end
-- return the new actions triggered
function PlayerControl:update()
local actions = {}
-- test each event
for key, value in pairs(self.event) do
local value = self:testInput(key)
local oldValue = self.eventValue[key]
if oldValue == nil then
oldValue = false
end
if value ~= oldValue then
if value == true then
self.eventTrigger[key] = true
table.insert(actions, key)
else
self.eventTrigger[key] = false
end
else
-- no change
self.eventTrigger[key] = false
end
self.eventValue[key] = value
end
return actions
end
-- return the current status of an event
function PlayerControl:testInput(event)
local res = false
eventArray = self.event[event]
if eventArray[1] ~= nil then
res = res or love.keyboard.isDown(eventArray[1])
end
if self.joystick ~= nil then
if eventArray[2] ~= nil then
res = res or self.joystick:isGamepadDown(eventArray[2])
end
if eventArray[3] ~= nil then
if eventArray[4] then
res = res or (self.joystick:getGamepadAxis(eventArray[3]) < -0.5)
else
res = res or (self.joystick:getGamepadAxis(eventArray[3]) > 0.5)
end
end
end
return res
end
-- return true if the event has been triggered since last update
function PlayerControl:testTrigger(event)
local value = self.eventTrigger[event]
if value == nil then
return false
end
-- else
return value
end
-- initialize default PlayerControl
local joysticks = love.joystick.getJoysticks()
local player1Joystick = nil
local player2Joystick = nil
if #joysticks > 0 then
player1Joystick = joysticks[1]
end
-- keyboard DPad Axis Invert Axis
player1Event = { left = {"left", "dpleft", "leftx", true},
right = {"right", "dpright", "leftx", false},
up = {"up", "dpup", "lefty", true},
down = {"down", "dpdown", "lefty", false},
jump = {"q", "a", nil, nil},
attack = {"d", "x", nil, nil},
defend = {"z", "b", nil, nil},
use = {"s", "a", nil, nil},
back = {"escape", "back", nil, nil},
start = {"return", "start", nil, nil},
menu_valid = {"return", "a", nil, nil},
menu_back = {"escape", "b", nil, nil},
text_del = {"backspace", nil, nil, nil}}
if #joysticks > 1 then
player2Joystick = joysticks[2]
end
-- keyboard DPad Axis Invert Axis
player2Event = { left = {"j", "dpleft", "leftx", true},
right = {"l", "dpright", "leftx", false},
up = {"i", "dpup", "lefty", true},
down = {"k", "dpdown", "lefty", false},
jump = {"r", "a", nil, nil},
attack = {"t", "x", nil, nil},
defend = {"y", "b", nil, nil},
use = {"h", "a", nil, nil},
back = {"escape", "back", nil, nil},
start = {"return", "start", nil, nil}}
PlayerControl.player1Control = PlayerControl.new(player1Event, player1Joystick)
PlayerControl.player2Control = PlayerControl.new(player2Event, player2Joystick)