Corrige le lâcher qui ignorait un simple tap sans glissement
Build and deploy / deploy (push) Successful in 36s
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:
@@ -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
|
||||||
|
// 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();
|
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 }}
|
||||||
|
|||||||
Reference in New Issue
Block a user