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) {
return Math.max(
-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
function addObservationShortcuts(
@ -384,43 +384,13 @@ function addSteeringWheelKeyboardShortcuts(
offset: number,
pointerId: number
) {
for (const k of ["left", "right", "up", "down"]) {
if (key[k])
addShortcut(
key[k],
async () => {
_keyDownFlag[k] = true;
await _wheelKeyLoop(pointerId, posX, posY, offset);
},
undefined,
async () => {
_keyDownFlag[k] = false;
}
);
}
}
let loopFlag = false;
let curPosX = 0;
let curPosY = 0;
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
let offsetHalf = Math.round(offset / 1.414);
const pos = [
const calculatedPosList = [
{ x: posX - offset, y: posY }, // left
{ x: posX + offset, y: posY }, // right
{ x: posX, y: posY - offset }, // up
@ -431,81 +401,112 @@ async function _wheelKeyLoop(
{ x: posX + offsetHalf, y: posY + offsetHalf }, // right down
];
// touch down on the center position
await touch({
action: TouchAction.Down,
pointerId: pointerId,
screen: {
w: screenSizeW,
h: screenSizeH,
},
pos: {
x: posX,
y: posY,
},
});
// move to the direction
let curPos;
let _lastKeyDownFlag: stringKeyFlag = {
left: true,
right: true,
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];
// united loop callback for all directions
const unitedloopCB = async () => {
let newPosIndex;
if (downKeyMap.get(key.left)) {
newPosIndex = downKeyMap.get(key.up)
? 4
: downKeyMap.get(key.down)
? 6
: 0;
} else if (downKeyMap.get(key.right)) {
newPosIndex = downKeyMap.get(key.up)
? 5
: downKeyMap.get(key.down)
? 7
: 1;
} else if (downKeyMap.get(key.up)) {
newPosIndex = 2;
} else if (downKeyMap.get(key.down)) {
newPosIndex = 3;
} 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({
action: TouchAction.Move,
pointerId: pointerId,
pointerId,
screen: {
w: screenSizeW,
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 {
left: string;
right: string;
@ -513,7 +514,6 @@ interface wheelKey {
down: string;
[key: string]: string;
}
type stringKeyFlag = Record<string, boolean>;
// add baisc click shortcuts
function addClickShortcuts(key: string, pointerId: number) {
@ -579,20 +579,20 @@ function keydownHandler(event: KeyboardEvent) {
if (event.repeat) return;
event.preventDefault();
if (downKeyMap.has(event.code)) {
downKeyMap.set(event.code, true);
// execute the down callback (if there is) asyncily
let cb = downKeyCBMap.get(event.code);
if (cb) cb();
downKeyMap.set(event.code, true);
}
}
function keyupHandler(event: KeyboardEvent) {
event.preventDefault();
if (downKeyMap.has(event.code)) {
downKeyMap.set(event.code, false);
// execute the up callback (if there is) asyncily
let cb = upKeyCBMap.get(event.code);
if (cb) cb();
downKeyMap.set(event.code, false);
}
}
@ -602,10 +602,10 @@ function handleMouseDown(event: MouseEvent) {
event.preventDefault();
let key = "M" + event.button.toString();
if (downKeyMap.has(key)) {
downKeyMap.set(key, true);
// execute the down callback asyncily
let cb = downKeyCBMap.get(key);
if (cb) cb();
downKeyMap.set(key, true);
}
}
@ -615,10 +615,10 @@ function handleMouseUp(event: MouseEvent) {
event.preventDefault();
let key = "M" + event.button.toString();
if (downKeyMap.has(key)) {
downKeyMap.set(key, false);
// execute the up callback asyncily
let cb = upKeyCBMap.get(key);
if (cb) cb();
downKeyMap.set(key, false);
}
}
@ -802,6 +802,7 @@ export function listenToKeyEvent() {
cb();
});
}, 50);
}
export function unlistenToKeyEvent() {