GDG Logo

Game Dev with React Workshop

useGameLoop Hook

The `useGameLoop` hook is a custom React hook that manages a smooth game loop by executing logic at a specified frame rate. Below, we break down its implementation.

1. Import Statements

import { useEffect, useRef } from 'react';

Imports the `useEffect` and `useRef` hooks from React. `useEffect` manages the lifecycle of the game loop, and `useRef` provides mutable references for storing state between renders.

2. Function Declaration

const useGameLoop = (callback, fps = 60) => { ... };

The `useGameLoop` hook is a custom React hook that executes a callback function at a specified frame rate (default is 60 frames per second).

3. useRef Setup


        const requestRef = useRef();
        const previousTimeRef = useRef();
        const interval = 1000 / fps;
      

- `requestRef`: Stores the animation frame request ID to control the loop. - `previousTimeRef`: Tracks the previous timestamp to calculate the delta time between frames. - `interval`: Determines the time interval between frames based on the desired FPS.

4. Animation Function


        const animate = time => {
          if (previousTimeRef.current !== undefined) {
            const deltaTime = time - previousTimeRef.current;
            if (deltaTime >= interval) {
              callback(deltaTime);
              previousTimeRef.current = time;
            }
          } else {
            previousTimeRef.current = time;
          }
          requestRef.current = requestAnimationFrame(animate);
        };
      

The `animate` function is called on every animation frame: - Calculates `deltaTime`, the time since the last frame. - If `deltaTime` exceeds the interval, it executes the `callback` and updates the `previousTimeRef`. - Requests the next frame to keep the loop running.

5. useEffect Setup


        useEffect(() => {
          requestRef.current = requestAnimationFrame(animate);
          return () => cancelAnimationFrame(requestRef.current);
        }, []);
      

- `useEffect` starts the animation loop by calling `requestAnimationFrame`. - Cleans up by canceling the animation frame request when the component unmounts, ensuring no memory leaks.

6. Export Statement

export default useGameLoop;

Exports the `useGameLoop` hook so it can be used in other components to manage game logic.