Reactの関数コンポーネントを使ってテトリスを作っているのですが、
キー入力時の useEffect
と、インターバル設定時の useEffect
がバッティングしてしまいます。
以下がコードです(一部)。
js
1// スタートボタンを押したときに落下描画する 2useEffect(() => { 3 if (started) { 4 const id = setInterval(() => { 5 let tmp = fallen 6 tmp.pop() 7 tmp.unshift([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) 8 setFallen(tmp) 9 let draw_board = addMatrix(board, tmp) 10 drawMatrix(draw_board) 11 }, 1000); 12 13 return () => clearInterval(id); 14 } 15}, [started, board, fallen]); 16 17// キーボードイベントハンドラー 18useEffect(() => { 19 function handlekeydownEvent(event) { 20 const { key, keyCode } = event; 21 console.log(key, keyCode) 22 if (keyCode === 39) { // Right 23 let tmp = shiftRight(fallen) 24 setFallen(tmp) 25 let draw_board = addMatrix(board, tmp) 26 drawMatrix(draw_board) 27 } else if (keyCode === 37) { // Left 28 let tmp = shiftLeft(fallen) 29 setFallen(tmp) 30 let draw_board = addMatrix(board, tmp) 31 drawMatrix(draw_board) 32 } 33 } 34 35 document.addEventListener('keydown', handlekeydownEvent) 36 return () => { 37 document.removeEventListener('keydown', handlekeydownEvent) 38 } 39}, [board, fallen])
変数群
board
落ち切った動かないブロックの配列
fallen
現在落ちているブロックの配列
これらを足し合わせて描画しています。
インターバルで落ちるときや、移動したときには fallen
を変更して、足し合わせるようにしています。
見て頂ければわかるのですが、移動してしまうと、fallen
が変更されてしまい、インターバルがリセットされ、また1秒待つことになります。
これを、移動したとしてもインターバルを維持したままにしたいのですが、どうすればいいかわかりません。
お分かりの方がいらっしゃいましたら、ご教授いただければ幸いです。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/07 07:39