スマレジエンジニアyushiのブログ

スマレジエンジニアのブログ

【テトリス #7】タイマーでブロックを落とす

テトリスを作っています。

テトリス カテゴリーの記事一覧 - スマレジエンジニアyushiのブログ

技術スタックは下記の通りです。

  • TypeScript
  • React
  • SCSS
  • Create React App

今回はタイマーでブロックを落とすようにします。

方針

前回まではキー操作でブロックを落としていました。

今回で、自動でブロックが落ちてくるようにします。

タイマーの基本機能

JavaScriptのタイマー機能をラップします。

IDの管理を省略し、intervalTime毎にcallbackを呼び出すようにします。

let timerId: NodeJS.Timer | null;
const intervalTime = 1000;

export const start = (callback: () => void) => {
  timerId = setInterval(callback, intervalTime);
};

export const stop = () => {
  if (timerId === null) {
    return;
  }

  clearInterval(timerId);
};

ページ表示時にタイマーを起動する

React hookにて、ページ表示時にタイマーを起動するようにします。

import { useEffect, useRef } from 'react';
import * as timer from '../features/timer';

const useTimer = (callback: () => void) => {
  const refNextStep = useRef(callback);
  useEffect(() => {
    refNextStep.current = callback;
  }, [callback]);
  useEffect(() => {
    const tick = () => refNextStep.current();
    timer.start(tick);

    return () => timer.stop();
  }, []);
};

export default useTimer;

画面のコンポーネントにて初期化します。

(Board.tsx)

  useTimer(nextStep);

Pull Request

https://github.com/nek0meshi/tetris/pull/15

あとがき

テトリスっぽい見栄えになってきました。