bug(hotkey): fix wheel bug

This commit is contained in:
AkiChase 2024-04-14 21:29:28 +08:00
parent 9f1847cb16
commit adc66b0ba7

View File

@ -34,7 +34,7 @@ function clientxToCenterOffsetx(clientx: number, range: number, scale = 0.5) {
function clientyToCenterOffsety(clienty: number, range: number, scale = 0.5) { function clientyToCenterOffsety(clienty: number, range: number, scale = 0.5) {
return Math.max( return Math.max(
-range, -range,
Math.min(range, clientyToPosOffsety(clienty, screenSizeH * 0.57, scale)) Math.min(range, clientyToPosOffsety(clienty, screenSizeH * 0.55, scale))
); );
} }
@ -83,8 +83,8 @@ function calculateMacroPosList(
}); });
} }
// TODO 方向轮盘也放到loop内吧两个独立的循环不太好。但至少要将轮盘的循环间隔调低。 // TODO 偶尔不定时抽风切换一下程序就能恢复表现为setinterval中的回调函数未执行
// TODO 偶尔不定时抽风但等待一会就能恢复正常表现为setinterval中的回调函数没有执行 // TODO 技能界面实际上是有投影变换的,需要一定的算法,不能仅仅相对坐标 640,400
// add shortcuts for observation // add shortcuts for observation
function addObservationShortcuts( function addObservationShortcuts(
@ -384,43 +384,13 @@ function addSteeringWheelKeyboardShortcuts(
offset: number, offset: number,
pointerId: number pointerId: number
) { ) {
for (const k of ["left", "right", "up", "down"]) { let loopFlag = false;
if (key[k]) let curPosX = 0;
addShortcut( let curPosY = 0;
key[k],
async () => {
_keyDownFlag[k] = true;
await _wheelKeyLoop(pointerId, posX, posY, offset);
},
undefined,
async () => {
_keyDownFlag[k] = false;
}
);
}
}
let _keyDownFlag: stringKeyFlag = {
left: false,
right: false,
up: false,
down: false,
};
let _isWheelKeyLoopRunning = false;
// single loop for the steering wheel
async function _wheelKeyLoop(
pointerId: number,
// pos relative to the device
posX: number,
posY: number,
offset: number
) {
if (_isWheelKeyLoopRunning) return;
_isWheelKeyLoopRunning = true;
// calculate the end coordinates of the eight directions of the direction wheel // calculate the end coordinates of the eight directions of the direction wheel
let offsetHalf = Math.round(offset / 1.414); let offsetHalf = Math.round(offset / 1.414);
const calculatedPosList = [
const pos = [
{ x: posX - offset, y: posY }, // left { x: posX - offset, y: posY }, // left
{ x: posX + offset, y: posY }, // right { x: posX + offset, y: posY }, // right
{ x: posX, y: posY - offset }, // up { x: posX, y: posY - offset }, // up
@ -431,81 +401,112 @@ async function _wheelKeyLoop(
{ x: posX + offsetHalf, y: posY + offsetHalf }, // right down { x: posX + offsetHalf, y: posY + offsetHalf }, // right down
]; ];
// touch down on the center position // united loop callback for all directions
await touch({ const unitedloopCB = async () => {
action: TouchAction.Down, let newPosIndex;
pointerId: pointerId, if (downKeyMap.get(key.left)) {
screen: { newPosIndex = downKeyMap.get(key.up)
w: screenSizeW, ? 4
h: screenSizeH, : downKeyMap.get(key.down)
}, ? 6
pos: { : 0;
x: posX, } else if (downKeyMap.get(key.right)) {
y: posY, newPosIndex = downKeyMap.get(key.up)
}, ? 5
}); : downKeyMap.get(key.down)
? 7
// move to the direction : 1;
let curPos; } else if (downKeyMap.get(key.up)) {
let _lastKeyDownFlag: stringKeyFlag = { newPosIndex = 2;
left: true, } else if (downKeyMap.get(key.down)) {
right: true, newPosIndex = 3;
up: true,
down: true,
};
while (
_keyDownFlag.left ||
_keyDownFlag.right ||
_keyDownFlag.up ||
_keyDownFlag.down
) {
// if key down not changed
if (
_keyDownFlag.left === _lastKeyDownFlag.left &&
_keyDownFlag.right === _lastKeyDownFlag.right &&
_keyDownFlag.up === _lastKeyDownFlag.up &&
_keyDownFlag.down === _lastKeyDownFlag.down
) {
await sleep(50);
continue;
}
// record the last key down flag
_lastKeyDownFlag = { ..._keyDownFlag };
// key down changed
if (_keyDownFlag.left) {
curPos = _keyDownFlag.up ? pos[4] : _keyDownFlag.down ? pos[6] : pos[0];
} else if (_keyDownFlag.right) {
curPos = _keyDownFlag.up ? pos[5] : _keyDownFlag.down ? pos[7] : pos[1];
} else if (_keyDownFlag.up) {
curPos = pos[2];
} else if (_keyDownFlag.down) {
curPos = pos[3];
} else { } else {
curPos = { x: posX, y: posY }; // all keys released
await unitedUpCB();
return;
} }
// if newPos is the same as curPos, return
let newPos = calculatedPosList[newPosIndex];
if (newPos.x === curPosX && newPos.y === curPosY) return;
curPosX = newPos.x;
curPosY = newPos.y;
// move to the direction
await touch({ await touch({
action: TouchAction.Move, action: TouchAction.Move,
pointerId: pointerId, pointerId,
screen: { screen: {
w: screenSizeW, w: screenSizeW,
h: screenSizeH, h: screenSizeH,
}, },
pos: curPos, pos: newPos,
}); });
await sleep(100); };
const unitedUpCB = async () => {
if (
downKeyMap.get(key.left) === false &&
downKeyMap.get(key.right) === false &&
downKeyMap.get(key.up) === false &&
downKeyMap.get(key.down) === false
) {
// all wheel keys has been released
for (const k of ["left", "right", "up", "down"]) {
// only delete the valid key
loopDownKeyCBMap.delete(key[k]);
upKeyCBMap.delete(key[k]);
}
// touch up
await touch({
action: TouchAction.Up,
pointerId,
screen: {
w: screenSizeW,
h: screenSizeH,
},
pos: {
x: curPosX,
y: curPosY,
},
});
// recover the status
curPosX = 0;
curPosY = 0;
loopFlag = false;
}
};
for (const k of ["left", "right", "up", "down"]) {
addShortcut(
key[k],
async () => {
if (loopFlag) return;
loopFlag = true;
// add upCB
upKeyCBMap.set(key[k], unitedUpCB);
// touch down on the center position
await touch({
action: TouchAction.Down,
pointerId,
screen: {
w: screenSizeW,
h: screenSizeH,
},
pos: {
x: posX,
y: posY,
},
});
// add loopCB
loopDownKeyCBMap.set(key[k], unitedloopCB);
},
undefined,
undefined
);
} }
// touch up
await touch({
action: TouchAction.Up,
pointerId: pointerId,
screen: {
w: screenSizeW,
h: screenSizeH,
},
pos: curPos ? curPos : { x: posX, y: posY },
});
_isWheelKeyLoopRunning = false;
} }
interface wheelKey { interface wheelKey {
left: string; left: string;
right: string; right: string;
@ -513,7 +514,6 @@ interface wheelKey {
down: string; down: string;
[key: string]: string; [key: string]: string;
} }
type stringKeyFlag = Record<string, boolean>;
// add baisc click shortcuts // add baisc click shortcuts
function addClickShortcuts(key: string, pointerId: number) { function addClickShortcuts(key: string, pointerId: number) {
@ -579,20 +579,20 @@ function keydownHandler(event: KeyboardEvent) {
if (event.repeat) return; if (event.repeat) return;
event.preventDefault(); event.preventDefault();
if (downKeyMap.has(event.code)) { if (downKeyMap.has(event.code)) {
downKeyMap.set(event.code, true);
// execute the down callback (if there is) asyncily // execute the down callback (if there is) asyncily
let cb = downKeyCBMap.get(event.code); let cb = downKeyCBMap.get(event.code);
if (cb) cb(); if (cb) cb();
downKeyMap.set(event.code, true);
} }
} }
function keyupHandler(event: KeyboardEvent) { function keyupHandler(event: KeyboardEvent) {
event.preventDefault(); event.preventDefault();
if (downKeyMap.has(event.code)) { if (downKeyMap.has(event.code)) {
downKeyMap.set(event.code, false);
// execute the up callback (if there is) asyncily // execute the up callback (if there is) asyncily
let cb = upKeyCBMap.get(event.code); let cb = upKeyCBMap.get(event.code);
if (cb) cb(); if (cb) cb();
downKeyMap.set(event.code, false);
} }
} }
@ -602,10 +602,10 @@ function handleMouseDown(event: MouseEvent) {
event.preventDefault(); event.preventDefault();
let key = "M" + event.button.toString(); let key = "M" + event.button.toString();
if (downKeyMap.has(key)) { if (downKeyMap.has(key)) {
downKeyMap.set(key, true);
// execute the down callback asyncily // execute the down callback asyncily
let cb = downKeyCBMap.get(key); let cb = downKeyCBMap.get(key);
if (cb) cb(); if (cb) cb();
downKeyMap.set(key, true);
} }
} }
@ -615,10 +615,10 @@ function handleMouseUp(event: MouseEvent) {
event.preventDefault(); event.preventDefault();
let key = "M" + event.button.toString(); let key = "M" + event.button.toString();
if (downKeyMap.has(key)) { if (downKeyMap.has(key)) {
downKeyMap.set(key, false);
// execute the up callback asyncily // execute the up callback asyncily
let cb = upKeyCBMap.get(key); let cb = upKeyCBMap.get(key);
if (cb) cb(); if (cb) cb();
downKeyMap.set(key, false);
} }
} }
@ -802,6 +802,7 @@ export function listenToKeyEvent() {
cb(); cb();
}); });
}, 50); }, 50);
} }
export function unlistenToKeyEvent() { export function unlistenToKeyEvent() {