diff --git a/js-src/components/overlay-controls.tsx b/js-src/components/overlay-controls.tsx index a5e2f6c..fc354d7 100644 --- a/js-src/components/overlay-controls.tsx +++ b/js-src/components/overlay-controls.tsx @@ -27,33 +27,6 @@ export default function OverlayControls({firstMenuElement, setHiddenMenu, webSoc } sendKeyDown(webSocket, true, key); } - function touchStart(e: React.TouchEvent, key: number) { - e.preventDefault(); - if (webSocket == null) { - console.log('There is not websocket'); - return; - } - for (let i = 0; i < e.changedTouches.length; i++) { - const touch = e.changedTouches[i]; - const idx = touch.identifier; - onGoingTouches[idx] = key; - sendKeyDown(webSocket, true, key); - } - } - function touchEnd(e: React.TouchEvent) { - e.preventDefault(); - if (webSocket == null) { - console.log('There is not websocket'); - return; - } - for (let i = 0; i < e.changedTouches.length; i++) { - const touch = e.changedTouches[i]; - const idx = touch.identifier; - const key = onGoingTouches[idx]; - delete onGoingTouches[idx]; - sendKeyDown(webSocket, false, key); - } - } function mouseUp(e: React.MouseEvent | React.TouchEvent, key: number) { e.preventDefault(); @@ -64,57 +37,188 @@ export default function OverlayControls({firstMenuElement, setHiddenMenu, webSoc sendKeyDown(webSocket, false, key); } + const controls: {[id: string]: {key: number, ref: React.RefObject, sym: string, classes: string, transformX?: number, transformY?: number}} = {}; + controls.a = { + ref: React.useRef(null), + key: 0, + sym: 'A', + classes: 'control-a control control-button', + } + controls.b = { + ref: React.useRef(null), + key: 1, + sym: 'B', + transformX: 50, + classes: 'control-b control control-button', + } + controls.up = { + ref: React.useRef(null), + key: 6, + sym: '^', + transformX: 100, + classes: 'control-up control control-pad-button', + } + controls.down = { + ref: React.useRef(null), + key: 7, + sym: 'v', + transformX: 100, + classes: 'control-down control control-pad-button', + } + controls.left = { + ref: React.useRef(null), + key: 8, + sym: '<', + classes: 'control-left control control-pad-button', + } + controls.right = { + ref: React.useRef(null), + key: 9, + sym: '>', + transformX: 200, + classes: 'control-right control control-pad-button', + } + function touchStartControls(e: React.TouchEvent) { + e.preventDefault(); + if (webSocket == null) { + console.log('There is not websocket'); + return; + } + for (let i = 0; i < e.changedTouches.length; i++) { + const touch = e.changedTouches[i]; + const x = touch.pageX; + const y = touch.pageY; + let key: number|null = null; + for (const control of Object.keys(controls)) { + const ref = controls[control].ref.current; + if (ref == null) { + console.log('No ref found'); + continue; + } + let top = ref.getBoundingClientRect().top + document.documentElement.scrollTop; + const currentControl = controls[control]; + const transformX = currentControl.transformX; + const transformY = currentControl.transformY; + let offsetLeft = ref.offsetLeft; + const offsetWidth = ref.offsetWidth; + let offsetTop = top; + const offsetHeight = ref.offsetHeight; + if (transformX != null) { + offsetLeft += offsetWidth * (transformX / 100); + } + if (transformY != null) { + offsetTop += offsetHeight * (transformY / 100); + } + console.log(x, y, offsetLeft, offsetTop, offsetWidth, offsetHeight); + if (x >= offsetLeft && x <= offsetLeft + offsetWidth && y >= offsetTop && y <= offsetTop + offsetHeight) { + key = controls[control].key; + console.log(key); + break; + } + + } + console.log(key); + if (key == null) { + continue; + } + const idx = touch.identifier; + onGoingTouches[idx] = key; + sendKeyDown(webSocket, true, key); + } + return false; + } + function touchMoveControls(e: React.TouchEvent) { + e.preventDefault(); + if (webSocket == null) { + console.log('There is not websocket'); + return; + } + for (let i = 0; i < e.changedTouches.length; i++) { + const touch = e.changedTouches[i]; + const x = touch.pageX; + const y = touch.pageY; + let key: number|null = null; + for (const control of Object.keys(controls)) { + const ref = controls[control].ref.current; + if (ref == null) { + console.log('No ref found'); + continue; + } + let top = ref.getBoundingClientRect().top + document.documentElement.scrollTop; + const currentControl = controls[control]; + const transformX = currentControl.transformX; + const transformY = currentControl.transformY; + let offsetLeft = ref.offsetLeft; + const offsetWidth = ref.offsetWidth; + let offsetTop = top; + const offsetHeight = ref.offsetHeight; + if (transformX != null) { + offsetLeft += offsetWidth * (transformX / 100); + } + if (transformY != null) { + offsetTop += offsetHeight * (transformY / 100); + } + if (x >= offsetLeft && x <= offsetLeft + offsetWidth && y >= offsetTop && y <= offsetTop + offsetHeight) { + key = controls[control].key; + console.log(key); + break; + } + + } + const idx = touch.identifier; + if (onGoingTouches[idx] != null) { + sendKeyDown(webSocket, false, onGoingTouches[idx]); + delete onGoingTouches[idx]; + } + if (key == null) { + continue; + } + onGoingTouches[idx] = key; + sendKeyDown(webSocket, true, key); + } + return false; + } + + + function touchEndControls(e: React.TouchEvent) { + e.preventDefault(); + if (webSocket == null) { + console.log('There is not websocket'); + return; + } + for (let i = 0; i < e.changedTouches.length; i++) { + const touch = e.changedTouches[i]; + const idx = touch.identifier; + if (onGoingTouches[idx] == null) { + return; + } + sendKeyDown(webSocket, false, onGoingTouches[idx]); + delete onGoingTouches[idx]; + } + return false; + } + document.onselectstart = () => false; return ( -
+
-
+
Go to menu. (House icon) - ) => mouseDown(e, 0)} - onMouseUp={(e: React.MouseEvent) => mouseUp(e, 0)} - onTouchStart={(e: React.TouchEvent) => touchStart(e, 0)} - onTouchEnd={(e: React.TouchEvent) => touchEnd(e)} - onClick={(e: React.MouseEvent) => e.preventDefault()} - className="control-a control control-button">A - ) => mouseDown(e, 1)} - onMouseUp={(e: React.MouseEvent) => mouseUp(e, 1)} - onTouchStart={(e: React.TouchEvent) => touchStart(e, 1)} - onTouchEnd={(e: React.TouchEvent) => touchEnd(e)} - onClick={(e: React.MouseEvent) => e.preventDefault()} - className="control-b control control-button">B - ) => mouseDown(e, 6)} - onMouseUp={(e: React.MouseEvent) => mouseUp(e, 6)} - onTouchStart={(e: React.TouchEvent) => touchStart(e, 6)} - onTouchEnd={(e: React.TouchEvent) => touchEnd(e)} - onClick={(e: React.MouseEvent) => e.preventDefault()} - className="control-up control control-pad-button">^ - ) => mouseDown(e, 7)} - onMouseUp={(e: React.MouseEvent) => mouseUp(e, 7)} - onTouchStart={(e: React.TouchEvent) => touchStart(e, 7)} - onTouchEnd={(e: React.TouchEvent) => touchEnd(e)} - onClick={(e: React.MouseEvent) => e.preventDefault()} - className="control-down control control-pad-button">v - ) => mouseDown(e, 8)} - onMouseUp={(e: React.MouseEvent) => mouseUp(e, 8)} - onTouchStart={(e: React.TouchEvent) => touchStart(e, 8)} - onTouchEnd={(e: React.TouchEvent) => touchEnd(e)} - onClick={(e: React.MouseEvent) => e.preventDefault()} - className="control-left control control-pad-button">< - ) => mouseDown(e, 9)} - onMouseUp={(e: React.MouseEvent) => mouseUp(e, 9)} - onTouchStart={(e: React.TouchEvent) => touchStart(e, 9)} - onTouchEnd={(e: React.TouchEvent) => touchEnd(e)} - onClick={(e: React.MouseEvent) => e.preventDefault()} - className="control-right control control-pad-button">> + { + Object.keys(controls).map((key) => + ) => mouseDown(e, controls[key].key)} + onMouseUp={(e: React.MouseEvent) => mouseUp(e, controls[key].key)}> + {controls[key].sym} + + ) + }
); diff --git a/js-src/packet.ts b/js-src/packet.ts index e86b780..33a324b 100644 --- a/js-src/packet.ts +++ b/js-src/packet.ts @@ -24,12 +24,10 @@ export function sendHello(websocket: WebSocket, rom_array: Uint8Array, savestate } export function sendKeyDown(websocket: WebSocket, isDown: boolean, key: number) { - console.log('Sending keyDown.'); - console.log(PACKET_ID_KEY_DOWN); + console.log('Sending keyDown.', isDown); const isDownArray = new Uint8Array(1); isDownArray[0] = isDown ? 1: 0; const rawData = concatU8Array(isDownArray, Endian.u32ToByteArrayBigEndian(key)); - console.log(rawData.length); sendPacket(websocket, PACKET_ID_KEY_DOWN, rawData); } diff --git a/public/index.html b/public/index.html index dd9e0cc..baa5e8d 100644 --- a/public/index.html +++ b/public/index.html @@ -2,7 +2,13 @@ - +