allow 2 button to be pressed at the same time
parent
77b6ad47d0
commit
4a49ff848a
|
@ -31,6 +31,7 @@ export class InputsController {
|
|||
// buttonLock ensures only a single movement key is firing repeated inputs
|
||||
// (i.e. by holding down a button) at a time
|
||||
private buttonLock: Button;
|
||||
private buttonLock2: Button;
|
||||
private interactions: Map<Button, Map<string, boolean>> = new Map();
|
||||
private time: Time;
|
||||
private player: Map<String, GamepadMapping> = new Map();
|
||||
|
@ -87,7 +88,8 @@ export class InputsController {
|
|||
}
|
||||
|
||||
update(): void {
|
||||
for (const b of Utils.getEnumValues(Button)) {
|
||||
// reversed to let the cancel button have a kinda priority on the action button
|
||||
for (const b of Utils.getEnumValues(Button).reverse()) {
|
||||
if (!this.interactions.hasOwnProperty(b)) continue;
|
||||
if (this.repeatInputDurationJustPassed(b) && this.interactions[b].isPressed) {
|
||||
this.events.emit('input_down', {
|
||||
|
@ -243,35 +245,50 @@ export class InputsController {
|
|||
* firing a repeated input - this is to prevent multiple buttons from firing repeatedly.
|
||||
*/
|
||||
repeatInputDurationJustPassed(button: Button): boolean {
|
||||
if (this.buttonLock === null || this.buttonLock !== button) {
|
||||
return false;
|
||||
}
|
||||
if (!this.isButtonLocked(button)) return false;
|
||||
if (this.time.now - this.interactions[button].pressTime >= repeatInputDelayMillis) {
|
||||
this.buttonLock = null;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
setLastProcessedMovementTime(button: Button): void {
|
||||
if (!this.interactions.hasOwnProperty(button)) return;
|
||||
this.buttonLock = button;
|
||||
this.setButtonLock(button);
|
||||
this.interactions[button].pressTime = this.time.now;
|
||||
this.interactions[button].isPressed = true;
|
||||
}
|
||||
|
||||
delLastProcessedMovementTime(button: Button): void {
|
||||
if (!this.interactions.hasOwnProperty(button)) return;
|
||||
this.buttonLock = null;
|
||||
this.releaseButtonLock(button);
|
||||
this.interactions[button].pressTime = null;
|
||||
this.interactions[button].isPressed = false;
|
||||
}
|
||||
|
||||
deactivatePressedKey(): void {
|
||||
this.buttonLock = null;
|
||||
this.releaseButtonLock(this.buttonLock);
|
||||
this.releaseButtonLock(this.buttonLock2);
|
||||
for (const b of Utils.getEnumValues(Button)) {
|
||||
if (!this.interactions.hasOwnProperty(b)) return;
|
||||
this.interactions[b].pressTime = null;
|
||||
this.interactions[b].isPressed = false;
|
||||
}
|
||||
}
|
||||
|
||||
isButtonLocked(button: Button): boolean {
|
||||
return (this.buttonLock === button || this.buttonLock2 === button);
|
||||
}
|
||||
|
||||
setButtonLock(button: Button): void {
|
||||
if (this.buttonLock === button || this.buttonLock2 === button) return;
|
||||
if (this.buttonLock === button) this.buttonLock2 = button;
|
||||
else if (this.buttonLock2 === button) this.buttonLock = button;
|
||||
else if(!!this.buttonLock) this.buttonLock2 = button;
|
||||
else this.buttonLock = button;
|
||||
}
|
||||
|
||||
releaseButtonLock(button: Button): void {
|
||||
if (this.buttonLock === button) this.buttonLock = null;
|
||||
else if (this.buttonLock2 === button) this.buttonLock2 = null;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue