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
+15 -4
View File
@@ -173,7 +173,7 @@ export function MelonGame({ citizens, onFinish }: { citizens: MemberRow[]; onFin
setDropX(dropXRef.current);
}, [spawnPiece, setDropX, tierRadii, dropMaxTier]);
const handlePointerMove = useCallback(
const updateDropXFromEvent = useCallback(
(event: ReactPointerEvent) => {
const rect = containerRef.current?.getBoundingClientRect();
if (!rect) return;
@@ -182,9 +182,19 @@ export function MelonGame({ citizens, onFinish }: { citizens: MemberRow[]; onFin
[setDropX],
);
function handlePointerUp() {
// Sur un tap sans glissement (mobile notamment), pointermove ne se
// 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 —
// 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
ref={containerRef}
onPointerMove={handlePointerMove}
onPointerDown={updateDropXFromEvent}
onPointerMove={updateDropXFromEvent}
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"
style={{ width: CONTAINER_WIDTH, height: CONTAINER_HEIGHT }}