better controller support

This commit is contained in:
RandomityGuy 2023-07-15 20:02:26 +05:30
parent 9c7c8f318e
commit deceb8e0b7
6 changed files with 31 additions and 12 deletions

View file

@ -186,6 +186,10 @@ class CameraController extends Object {
return Util.clamp(delta, Math.PI / 10, Math.PI / 2) * 4; return Util.clamp(delta, Math.PI / 10, Math.PI / 2) * 4;
} }
function applyNonlinearScale(value:Float) {
return Math.pow(Math.abs(value), 3.2) * (value >= 0 ? 1 : -1);
}
public function startCenterCamera() { public function startCenterCamera() {
if (this.marble.velocity.lengthSq() >= 81) { if (this.marble.velocity.lengthSq() >= 81) {
var marbAxis = this.marble.getMarbleAxis(); var marbAxis = this.marble.getMarbleAxis();
@ -214,13 +218,15 @@ class CameraController extends Object {
var lerpt = 1 - Math.pow(0.5, dt / 0.016); // Math.min(1, 1 - Math.pow(0.6, dt / 0.032)); // hxd.Math.min(1, 1 - Math.pow(0.6, dt * 600)); var lerpt = 1 - Math.pow(0.5, dt / 0.016); // Math.min(1, 1 - Math.pow(0.6, dt / 0.032)); // hxd.Math.min(1, 1 - Math.pow(0.6, dt * 600));
var gamepadX = applyNonlinearScale(rescaleDeadZone(Gamepad.getAxis(Settings.gamepadSettings.cameraXAxis), 0.25));
var gamepadY = applyNonlinearScale(rescaleDeadZone(Gamepad.getAxis(Settings.gamepadSettings.cameraYAxis), 0.25));
var cameraPitchDelta = (Key.isDown(Settings.controlsSettings.camBackward) ? 1 : 0) var cameraPitchDelta = (Key.isDown(Settings.controlsSettings.camBackward) ? 1 : 0)
- (Key.isDown(Settings.controlsSettings.camForward) ? 1 : 0) - (Key.isDown(Settings.controlsSettings.camForward) ? 1 : 0)
+ Gamepad.getAxis(Settings.gamepadSettings.cameraYAxis); + gamepadY;
if (Settings.gamepadSettings.invertYAxis) if (Settings.gamepadSettings.invertYAxis)
cameraPitchDelta = -cameraPitchDelta; cameraPitchDelta = -cameraPitchDelta;
var cameraYawDelta = (Key.isDown(Settings.controlsSettings.camRight) ? 1 : 0) - (Key.isDown(Settings.controlsSettings.camLeft) ? 1 : 0) var cameraYawDelta = (Key.isDown(Settings.controlsSettings.camRight) ? 1 : 0) - (Key.isDown(Settings.controlsSettings.camLeft) ? 1 : 0) + gamepadX;
+ Gamepad.getAxis(Settings.gamepadSettings.cameraXAxis);
if (Settings.gamepadSettings.invertXAxis) if (Settings.gamepadSettings.invertXAxis)
cameraYawDelta = -cameraYawDelta; cameraYawDelta = -cameraYawDelta;
@ -252,7 +258,10 @@ class CameraController extends Object {
deltaX = deltaNew; deltaX = deltaNew;
// Center the pitch // Center the pitch
if (!Settings.controlsSettings.alwaysFreeLook && !Key.isDown(Settings.controlsSettings.freelook) && !(hasXInput || hasYInput)) { if (!Settings.controlsSettings.alwaysFreeLook
&& !Key.isDown(Settings.controlsSettings.freelook)
&& !(hasXInput || hasYInput)
&& deltaY == 0.0) {
var rescaledY = deltaY; var rescaledY = deltaY;
if (rescaledY <= 0.0) if (rescaledY <= 0.0)
rescaledY = 0.4 - rescaledY * -0.75; rescaledY = 0.4 - rescaledY * -0.75;

View file

@ -118,7 +118,7 @@ class GuiXboxButton extends GuiControl {
if (!disabled) { if (!disabled) {
if (acceleratorWasPressed if (acceleratorWasPressed
&& (accelerators.length != 0 && accelerators.map(x -> hxd.Key.isReleased(x)).contains(true)) && (accelerators.length != 0 && accelerators.map(x -> hxd.Key.isReleased(x)).contains(true))
|| Gamepad.isReleased(gamepadAccelerator)) { || Gamepad.isPressed(gamepadAccelerator)) {
if (this.pressedAction != null) { if (this.pressedAction != null) {
this.pressedAction(new GuiEvent(this)); this.pressedAction(new GuiEvent(this));
} }
@ -130,7 +130,7 @@ class GuiXboxButton extends GuiControl {
} }
if (acceleratorWasPressed) { if (acceleratorWasPressed) {
if ((accelerators.length != 0 && accelerators.map(x -> hxd.Key.isReleased(x)).contains(true)) if ((accelerators.length != 0 && accelerators.map(x -> hxd.Key.isReleased(x)).contains(true))
|| Gamepad.isReleased(gamepadAccelerator)) || Gamepad.isPressed(gamepadAccelerator))
acceleratorWasPressed = false; acceleratorWasPressed = false;
} }
super.update(dt, mouseState); super.update(dt, mouseState);

View file

@ -10,6 +10,7 @@ class GuiXboxList extends GuiControl {
var selected:Int = 0; var selected:Int = 0;
var buttons:Array<GuiXboxListButton> = []; var buttons:Array<GuiXboxListButton> = [];
var usedGamepad:Bool = false;
public var active:Bool = true; public var active:Bool = true;
@ -36,10 +37,14 @@ class GuiXboxList extends GuiControl {
if (!buttons[selected].selected) if (!buttons[selected].selected)
buttons[selected].selected = true; buttons[selected].selected = true;
var prevSelected = selected; var prevSelected = selected;
if (Key.isPressed(Key.DOWN) || Gamepad.isPressed(["dpadDown"])) if (Key.isPressed(Key.DOWN) || Gamepad.isPressed(["dpadDown"]) || (Gamepad.getAxis('analogY') > 0.75 && !usedGamepad))
selected++; selected++;
if (Key.isPressed(Key.UP) || Gamepad.isPressed(["dpadUp"])) if (Key.isPressed(Key.UP) || Gamepad.isPressed(["dpadUp"]) || (Gamepad.getAxis('analogY') < -0.75 && !usedGamepad))
selected--; selected--;
if (Math.abs(Gamepad.getAxis('analogY')) > 0.75)
usedGamepad = true;
else
usedGamepad = false;
if (selected < 0) if (selected < 0)
selected = buttons.length - 1; selected = buttons.length - 1;
if (selected >= buttons.length) if (selected >= buttons.length)

View file

@ -24,6 +24,7 @@ class GuiXboxOptionsList extends GuiControl {
var onChangeFunc:Int->Bool = null; var onChangeFunc:Int->Bool = null;
var _prevMousePos:Vector; var _prevMousePos:Vector;
var usedGamepad:Bool = false;
public var selected:Bool = false; public var selected:Bool = false;
@ -211,7 +212,7 @@ class GuiXboxOptionsList extends GuiControl {
rightButton.anim.filter.enable = false; rightButton.anim.filter.enable = false;
} }
if (selected || alwaysActive) { if (selected || alwaysActive) {
if (Key.isPressed(Key.LEFT) || Gamepad.isPressed(['dpadLeft'])) { if (Key.isPressed(Key.LEFT) || Gamepad.isPressed(['dpadLeft']) || (Gamepad.getAxis('analogX') < -0.75 && !usedGamepad)) {
var newOption = currentOption - 1; var newOption = currentOption - 1;
if (newOption < 0) if (newOption < 0)
newOption = options.length - 1; newOption = options.length - 1;
@ -224,7 +225,7 @@ class GuiXboxOptionsList extends GuiControl {
optionText.text.text = options[currentOption]; optionText.text.text = options[currentOption];
} }
} }
if (Key.isPressed(Key.RIGHT) || Gamepad.isPressed(['dpadRight'])) { if (Key.isPressed(Key.RIGHT) || Gamepad.isPressed(['dpadRight']) || (Gamepad.getAxis('analogX') > 0.75 && !usedGamepad)) {
var newOption = currentOption + 1; var newOption = currentOption + 1;
if (newOption >= options.length) if (newOption >= options.length)
newOption = 0; newOption = 0;
@ -237,6 +238,10 @@ class GuiXboxOptionsList extends GuiControl {
optionText.text.text = options[currentOption]; optionText.text.text = options[currentOption];
} }
} }
if (Math.abs(Gamepad.getAxis('analogX')) > 0.75)
usedGamepad = true;
else
usedGamepad = false;
} }
super.update(dt, mouseState); super.update(dt, mouseState);
} }

View file

@ -153,7 +153,7 @@ class LevelSelectGui extends GuiImage {
recordButton.position = new Vector(560, 0); recordButton.position = new Vector(560, 0);
recordButton.vertSizing = Bottom; recordButton.vertSizing = Bottom;
recordButton.horizSizing = Right; recordButton.horizSizing = Right;
backButton.gamepadAccelerator = ["X"]; recordButton.gamepadAccelerator = ["X"];
recordButton.pressedAction = (e) -> { recordButton.pressedAction = (e) -> {
MarbleGame.instance.toRecord = true; MarbleGame.instance.toRecord = true;
MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("The next mission you play will be recorded.")); MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("The next mission you play will be recorded."));

View file

@ -51,7 +51,7 @@ class MessageBoxYesNoDlg extends GuiImage {
cancelButton.extent = new Vector(120, 94); cancelButton.extent = new Vector(120, 94);
cancelButton.vertSizing = Top; cancelButton.vertSizing = Top;
cancelButton.accelerators = [hxd.Key.ESCAPE, hxd.Key.BACKSPACE]; cancelButton.accelerators = [hxd.Key.ESCAPE, hxd.Key.BACKSPACE];
cancelButton.gamepadAccelerator = ["A"]; cancelButton.gamepadAccelerator = ["B"];
cancelButton.pressedAction = (sender) -> { cancelButton.pressedAction = (sender) -> {
MarbleGame.canvas.popDialog(this); MarbleGame.canvas.popDialog(this);
noFunc(); noFunc();