diff --git a/src/app/corne/melon-game.tsx b/src/app/corne/melon-game.tsx index da729fc..959113c 100644 --- a/src/app/corne/melon-game.tsx +++ b/src/app/corne/melon-game.tsx @@ -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() { - handleDrop(); - } + // 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