feat: implement falling letters spawning from top

- Letters spawn at random horizontal positions every 1 second
- Letters fall at 100px/second from top to bottom
- Random A-Z letters rendered in white monospace font
- Fix game loop to start properly when startGame called
- Remove letters that exit bottom of screen
This commit is contained in:
2025-11-03 22:01:40 +00:00
parent dce96b8453
commit 0dc4ecde72
4 changed files with 85 additions and 19 deletions
+13 -7
View File
@@ -1,4 +1,4 @@
import { useState, useEffect } from "react";
import { useState, useEffect, useCallback } from "react";
import type { GameManager, GameOptions, KeyLogEntry } from "../types";
import { useBoard } from "../useBoard";
import { useCursor } from "../useCursor";
@@ -13,18 +13,24 @@ export function useGame(
const boardManager = useBoard();
const cursorManager = useCursor();
const gameStatusManager = useGameStatus();
const scoreManager = useScore(gameStatusManager);
// Wrap renderBoard to include player position
const renderBoardWrapped = () => {
boardManager.renderBoard(cursorManager.position());
};
const renderBoardWrapped = useCallback((letters: any = []) => {
boardManager.renderBoard(cursorManager.position(), letters);
}, [boardManager, cursorManager]);
// Game loop tick handler
const handleGameLoopTick = useCallback((_deltaTime: number, letters: any) => {
renderBoardWrapped(letters);
}, [renderBoardWrapped]);
const gameStatusManager = useGameStatus(handleGameLoopTick);
const scoreManager = useScore(gameStatusManager);
// Initial render on mount
useEffect(() => {
renderBoardWrapped();
}, []);
}, [renderBoardWrapped]);
const gameManager: GameManager = {
containerRef: boardManager.containerRef,