LoginSignup
0
0

More than 1 year has passed since last update.

Reactでテトリスをつくる⑤_キーボード入力イベントをつける

Last updated at Posted at 2021-06-06

キーボード入力イベントをつける

const keydown = (e) => {
        switch(e.which){
            //Enter
            case 13:
                minoT.rotate()
                setDisp(minoT.val2(X, Y))
                break;
            //Right
            case 39:
                if(checkCrush(base, minoT.val2(X+1, Y))) {
                    break
                }
                setX(X+1)
                setDisp(minoT.val2(X+1, Y))
                break;
            //Left
            case 37:
                if(checkCrush(base, minoT.val2(X-1, Y))) {
                    break
                }
                setX(X-1)
                setDisp(minoT.val2(X-1, Y))
                break
            //Down
            case 40:
                if(checkCrush(base, minoT.val2(X-1, Y))) {
                    break
                }
                setY(Y+1)
                break
            default:
                break;
        }

右、左、下の動きを付けた。

一定時間ごとに描画を更新する処理は、こつがいる。
useEffectでやるにしても、タイミングをしっかりつかまないとレンダー過剰になりがちである。
色々考えた結果、周期的レンダー用に関数をつくった。

  • 以下のロジックは、ブロックを下に1マス進めつつ、次のレンダーを1秒後に指定している。
  • これが、setTimeoutにブロックを進める処理を入れるとうまくいかない。
    • なぜならば、最後に一秒後に1マス多く進むバグがでやすい。timeoutをキャンセルなどをやりはじめると複雑になりがち
    const [effect, setEffect]=useState(false)
    useEffect(()=>{
        setDisp(minoT.val2(X, Y))
        setY(Y+1)
        timeout = setTimeout(()=>{
            setEffect(!effect)
        },1000)

    },[effect])

キャプチャ12.PNG

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0