Corrige le lâcher qui ignorait un simple tap sans glissement
Build and deploy / deploy (push) Successful in 36s

Sur mobile, taper sans glisser ne déclenche pas forcément pointermove
avant pointerup, donc la position de visée n'était jamais mise à jour
avant le lâcher : la pièce tombait à l'ancienne position plutôt qu'à
l'endroit tapé. La position se resynchronise maintenant au contact
(pointerdown) et juste avant le lâcher (pointerup).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Valentin ROBIN
2026-08-24 01:04:58 +02:00
parent 05aa15cec0
commit b0bf54f20c
+16 -5
View File
@@ -173,7 +173,7 @@ export function MelonGame({ citizens, onFinish }: { citizens: MemberRow[]; onFin
setDropX(dropXRef.current); setDropX(dropXRef.current);
}, [spawnPiece, setDropX, tierRadii, dropMaxTier]); }, [spawnPiece, setDropX, tierRadii, dropMaxTier]);
const handlePointerMove = useCallback( const updateDropXFromEvent = useCallback(
(event: ReactPointerEvent) => { (event: ReactPointerEvent) => {
const rect = containerRef.current?.getBoundingClientRect(); const rect = containerRef.current?.getBoundingClientRect();
if (!rect) return; if (!rect) return;
@@ -182,9 +182,19 @@ export function MelonGame({ citizens, onFinish }: { citizens: MemberRow[]; onFin
[setDropX], [setDropX],
); );
function handlePointerUp() { // Sur un tap sans glissement (mobile notamment), pointermove ne se
handleDrop(); // déclenche pas forcément avant pointerup — sans repositionner ici aussi,
} // le lâcher se faisait à l'ancienne position (celle d'une interaction
// précédente), pas là où le doigt vient de taper. onPointerDown en plus
// pour que le trait de visée bouge dès le contact, pas seulement au
// relâchement.
const handlePointerUp = useCallback(
(event: ReactPointerEvent) => {
updateDropXFromEvent(event);
handleDrop();
},
[updateDropXFromEvent, handleDrop],
);
// Clavier (ordinateur) : flèches pour viser, Espace/Entrée pour lâcher — // Clavier (ordinateur) : flèches pour viser, Espace/Entrée pour lâcher —
// même logique que le support clavier ajouté au Vol d'Icare. // même logique que le support clavier ajouté au Vol d'Icare.
@@ -382,7 +392,8 @@ export function MelonGame({ citizens, onFinish }: { citizens: MemberRow[]; onFin
<div <div
ref={containerRef} ref={containerRef}
onPointerMove={handlePointerMove} onPointerDown={updateDropXFromEvent}
onPointerMove={updateDropXFromEvent}
onPointerUp={handlePointerUp} onPointerUp={handlePointerUp}
className="relative touch-none overflow-visible rounded-b-2xl border-x-4 border-b-4 border-gold/50 bg-ink-2/40 select-none" className="relative touch-none overflow-visible rounded-b-2xl border-x-4 border-b-4 border-gold/50 bg-ink-2/40 select-none"
style={{ width: CONTAINER_WIDTH, height: CONTAINER_HEIGHT }} style={{ width: CONTAINER_WIDTH, height: CONTAINER_HEIGHT }}