Added ability to configure joystick axis
This commit is contained in:
parent
b8198f1add
commit
ef6c6ea8c2
4 changed files with 117 additions and 16 deletions
|
@ -109,10 +109,8 @@ Plane = Class{
|
||||||
|
|
||||||
orientationAngle = 0,
|
orientationAngle = 0,
|
||||||
|
|
||||||
controlX = 0,
|
rotation = 0,
|
||||||
controlY = 0,
|
throttle = 0,
|
||||||
throttleX = 0,
|
|
||||||
throttleY = 0,
|
|
||||||
|
|
||||||
kbdShooting = false,
|
kbdShooting = false,
|
||||||
joyShooting = false,
|
joyShooting = false,
|
||||||
|
@ -309,7 +307,7 @@ Plane = Class{
|
||||||
if self.decelerating then
|
if self.decelerating then
|
||||||
self.motorPower = math.max(0.0, self.motorPower - dt * decel_speed)
|
self.motorPower = math.max(0.0, self.motorPower - dt * decel_speed)
|
||||||
end
|
end
|
||||||
self.motorPower = math.max(0.0, math.min(max_motorPower, self.motorPower + dt * self.throttleY * accel_speed))
|
self.motorPower = math.max(0.0, math.min(max_motorPower, self.motorPower + dt * self.throttle * accel_speed))
|
||||||
|
|
||||||
-- -- local base =
|
-- -- local base =
|
||||||
-- let base = V.base (V.vec_of_ang (~-(body#get_angle))) in
|
-- let base = V.base (V.vec_of_ang (~-(body#get_angle))) in
|
||||||
|
@ -429,7 +427,7 @@ Plane = Class{
|
||||||
elseif self.turningCw then
|
elseif self.turningCw then
|
||||||
dy = -1
|
dy = -1
|
||||||
else
|
else
|
||||||
dy = self.controlY
|
dy = self.rotation
|
||||||
end
|
end
|
||||||
if dy ~= 0 then
|
if dy ~= 0 then
|
||||||
dx, dy = VectorLight.mul(fwd_vel * turn_coeff, 0, dy)
|
dx, dy = VectorLight.mul(fwd_vel * turn_coeff, 0, dy)
|
||||||
|
@ -499,11 +497,10 @@ Plane = Class{
|
||||||
self.turningCcw = isTurning
|
self.turningCcw = isTurning
|
||||||
end;
|
end;
|
||||||
|
|
||||||
analog = function(self, controlY, throttleX, throttleY)
|
analog = function(self, rotation, throttle)
|
||||||
if self.health > 0 then
|
if self.health > 0 then
|
||||||
self.controlY = controlY
|
self.rotation = rotation
|
||||||
self.throttleX = throttleX
|
self.throttle = throttle
|
||||||
self.throttleY = -throttleY
|
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
|
@ -126,10 +126,21 @@ function level_state:update(dt)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
lastJoystickButtons[player] = buttons
|
lastJoystickButtons[player] = buttons
|
||||||
local x1, y1, x2, y2 = j:getAxes()
|
|
||||||
if y2 ~= nil then
|
local getAxis = function(info)
|
||||||
players[player]:joystick(y2 - x2, x1, y1)
|
local value = 0
|
||||||
|
if j:getAxisCount() >= info.axis then
|
||||||
|
value = j:getAxis(info.axis)
|
||||||
|
if info.flipped then
|
||||||
|
value = -value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return value
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local rotation = getAxis(AXISMAP[player].rotation[1]) + getAxis(AXISMAP[player].rotation[2])
|
||||||
|
local throttle = getAxis(AXISMAP[player].throttle[1]) + getAxis(AXISMAP[player].throttle[2])
|
||||||
|
players[player]:joystick(rotation, throttle)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ require 'level_state'
|
||||||
require 'settings'
|
require 'settings'
|
||||||
require 'entities/label'
|
require 'entities/label'
|
||||||
require 'entities/valuecontroller'
|
require 'entities/valuecontroller'
|
||||||
|
require 'entities/visrectangle'
|
||||||
require 'utils'
|
require 'utils'
|
||||||
|
|
||||||
menu_state = {}
|
menu_state = {}
|
||||||
|
@ -16,7 +17,7 @@ local menuTime = 0
|
||||||
|
|
||||||
local currentlyChosen = nil
|
local currentlyChosen = nil
|
||||||
|
|
||||||
local bindingName = {
|
local bindingInfo = {
|
||||||
ccw = "Turn CW",
|
ccw = "Turn CW",
|
||||||
cw = "Turn CCW",
|
cw = "Turn CCW",
|
||||||
shoot = "Shoot",
|
shoot = "Shoot",
|
||||||
|
@ -25,8 +26,15 @@ local bindingName = {
|
||||||
flip = "Flip"
|
flip = "Flip"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local joyBindingInfo = {
|
||||||
|
rotation = "Turn",
|
||||||
|
throttle = "Engine power"
|
||||||
|
}
|
||||||
|
|
||||||
local bindingOrder = { "ccw", "cw", "shoot", "accelerate", "decelerate", "flip" }
|
local bindingOrder = { "ccw", "cw", "shoot", "accelerate", "decelerate", "flip" }
|
||||||
|
|
||||||
|
local joyBindingOrder = { "rotation", "throttle" }
|
||||||
|
|
||||||
function menu_state:enter()
|
function menu_state:enter()
|
||||||
menu_state.entity_list = {}
|
menu_state.entity_list = {}
|
||||||
love.graphics.setBackgroundColor(0, 0, 0, 0)
|
love.graphics.setBackgroundColor(0, 0, 0, 0)
|
||||||
|
@ -37,7 +45,7 @@ function menu_state:enter()
|
||||||
Label(string.format("Player %d", player), midfont, { 255, 255, 255, 255 }, "left", 500, 0, x, y, menu_state)
|
Label(string.format("Player %d", player), midfont, { 255, 255, 255, 255 }, "left", 500, 0, x, y, menu_state)
|
||||||
y = y + 60
|
y = y + 60
|
||||||
for idx, key in ipairs(bindingOrder) do
|
for idx, key in ipairs(bindingOrder) do
|
||||||
Label(bindingName[key], font, { 255, 255, 255, 255 }, "left", 190, 25, x, y, menu_state)
|
Label(bindingInfo[key], font, { 255, 255, 255, 255 }, "left", 190, 25, x, y, menu_state)
|
||||||
for bindingIdx, binding in ipairs(KEYMAP[player][key]) do
|
for bindingIdx, binding in ipairs(KEYMAP[player][key]) do
|
||||||
local label = Label(binding, font, { 255, 255, 255, 255 }, "center", 100, 25, x + 200 + 100 * (bindingIdx - 1), y, menu_state)
|
local label = Label(binding, font, { 255, 255, 255, 255 }, "center", 100, 25, x + 200 + 100 * (bindingIdx - 1), y, menu_state)
|
||||||
label:onClick(function()
|
label:onClick(function()
|
||||||
|
@ -46,10 +54,78 @@ function menu_state:enter()
|
||||||
end
|
end
|
||||||
y = y + 30
|
y = y + 30
|
||||||
end
|
end
|
||||||
|
for idx, axis in ipairs(joyBindingOrder) do
|
||||||
|
local axisInfo = AXISMAP[player][axis]
|
||||||
|
Label(joyBindingInfo[axis], font, { 255, 255, 255, 255 }, "left", 190, 25, x, y, menu_state)
|
||||||
|
for bindingIdx, info in ipairs(axisInfo) do
|
||||||
|
local prefix
|
||||||
|
if info.flipped then
|
||||||
|
prefix = "-"
|
||||||
|
else
|
||||||
|
prefix = "+"
|
||||||
|
end
|
||||||
|
local visAxisBaseX = (100 + 30) / 2 + x + 200 + 100 * (bindingIdx - 1)
|
||||||
|
|
||||||
|
local signLabel = Label(prefix, font, { 255, 255, 255, 255 }, "center", 20, 25, x + 200 + 100 * (bindingIdx - 1), y, menu_state)
|
||||||
|
|
||||||
|
signLabel:onClick(function()
|
||||||
|
menu_state:switchSign(player, axis, bindingIdx, signLabel)
|
||||||
|
end)
|
||||||
|
|
||||||
|
local axisLabel = Label(info.axis, font, { 255, 255, 255, 255 }, "center", 70, 25, x + 30 + 200 + 100 * (bindingIdx - 1), y, menu_state)
|
||||||
|
|
||||||
|
axisLabel:onClick(function()
|
||||||
|
menu_state:switchAxis(player, axis, bindingIdx, axisLabel)
|
||||||
|
end)
|
||||||
|
|
||||||
|
local visAxis = VisRectangle({ 40, 40, 0, 128 }, 10, 10, nil, visAxisBaseX, y + 11, menu_state)
|
||||||
|
|
||||||
|
ValueController(function ()
|
||||||
|
local joysticks = love.joystick.getJoysticks()
|
||||||
|
local axisIdx = AXISMAP[player][axis][bindingIdx].axis
|
||||||
|
if #joysticks >= player then
|
||||||
|
local direction = joysticks[player]:getAxis(axisIdx)
|
||||||
|
visAxis.x = visAxisBaseX + 30 * direction
|
||||||
|
end
|
||||||
|
end, menu_state)
|
||||||
|
end
|
||||||
|
y = y + 30
|
||||||
|
end
|
||||||
x = x + 500
|
x = x + 500
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function menu_state:switchSign(player, axis, bindingIdx, signLabel)
|
||||||
|
AXISMAP[player][axis][bindingIdx].flipped = not AXISMAP[player][axis][bindingIdx].flipped
|
||||||
|
local prefix;
|
||||||
|
if AXISMAP[player][axis][bindingIdx].flipped then
|
||||||
|
prefix = "-"
|
||||||
|
else
|
||||||
|
prefix = "+"
|
||||||
|
end
|
||||||
|
signLabel.label = prefix
|
||||||
|
save_settings()
|
||||||
|
end
|
||||||
|
|
||||||
|
function menu_state:switchAxis(player, axis, bindingIdx, axisLabel)
|
||||||
|
local joysticks = love.joystick.getJoysticks()
|
||||||
|
|
||||||
|
if #joysticks >= player then
|
||||||
|
local joystick = joysticks[player]
|
||||||
|
local axisIdx = AXISMAP[player][axis][bindingIdx].axis
|
||||||
|
|
||||||
|
axisIdx = axisIdx + 1
|
||||||
|
|
||||||
|
if axisIdx > joystick:getAxisCount() then
|
||||||
|
axisIdx = 1
|
||||||
|
end
|
||||||
|
|
||||||
|
AXISMAP[player][axis][bindingIdx].axis = axisIdx
|
||||||
|
axisLabel.label = AXISMAP[player][axis][bindingIdx].axis
|
||||||
|
save_settings()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local blinkColor = function(t)
|
local blinkColor = function(t)
|
||||||
local seconds, subseconds = math.modf(menuTime)
|
local seconds, subseconds = math.modf(menuTime)
|
||||||
return 255 * ((math.sin(math.pow((math.log(subseconds + 1) / math.log(2)), 2) * math.pi * 2) * 0.5 + 0.5));
|
return 255 * ((math.sin(math.pow((math.log(subseconds + 1) / math.log(2)), 2) * math.pi * 2) * 0.5 + 0.5));
|
||||||
|
|
19
settings.lua
19
settings.lua
|
@ -31,13 +31,30 @@ KEYMAP = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AXISMAP = {
|
||||||
|
[1] = {
|
||||||
|
rotation = { { flipped = true, axis = 3 },
|
||||||
|
{ flipped = false, axis = 4 } },
|
||||||
|
throttle = { { flipped = false, axis = 1 },
|
||||||
|
{ flipped = false, axis = 2 } },
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
rotation = { { flipped = true, axis = 3 },
|
||||||
|
{ flipped = false, axis = 4 } },
|
||||||
|
throttle = { { flipped = false, axis = 1 },
|
||||||
|
{ flipped = false, axis = 2 } },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function save_settings()
|
function save_settings()
|
||||||
table.save({KEYMAP = KEYMAP}, "fysplane.cfg")
|
table.save({KEYMAP = KEYMAP, AXISMAP = AXISMAP}, "fysplane.cfg")
|
||||||
end
|
end
|
||||||
|
|
||||||
if love.filesystem.isFile("fysplane.cfg") then
|
if love.filesystem.isFile("fysplane.cfg") then
|
||||||
local m = table.load("fysplane.cfg")
|
local m = table.load("fysplane.cfg")
|
||||||
KEYMAP = m.KEYMAP
|
KEYMAP = m.KEYMAP
|
||||||
|
AXISMAP = m.AXISMAP
|
||||||
end
|
end
|
||||||
|
|
||||||
PLANE_HEALTH = 500
|
PLANE_HEALTH = 500
|
||||||
|
|
Loading…
Reference in a new issue