Newer
Older
PixelPaintWar / apps / client / src / scenes / GameScene.tsx
import { useEffect, useRef } from "react";
import { VirtualJoystick } from "../input/VirtualJoystick";
import { GameManager } from "../managers/GameManager";

interface GameSceneProps {
  myId: string | null;
}

/**
 * メインゲーム画面コンポーネント
 * UIの描画と GameManager への入力伝達のみを担当する
 */
export function GameScene({ myId }: GameSceneProps) {
  const pixiContainerRef = useRef<HTMLDivElement>(null);
  const gameManagerRef = useRef<GameManager | null>(null);

  useEffect(() => {
    if (!pixiContainerRef.current || !myId) return;

    // GameManager のインスタンス化と初期化
    const manager = new GameManager(pixiContainerRef.current, myId);
    manager.init();
    
    // 参照を保持(ジョイスティック入力を渡すため)
    gameManagerRef.current = manager;

    // コンポーネント破棄時のクリーンアップ
    return () => {
      manager.destroy();
      gameManagerRef.current = null;
    };
  }, [myId]);

  return (
    <div style={{ width: "100vw", height: "100vh", overflow: "hidden", position: "relative", backgroundColor: "#000" }}>
      {/* PixiJS Canvas 配置領域 */}
      <div ref={pixiContainerRef} style={{ position: "absolute", top: 0, left: 0, zIndex: 1 }} />
      
      {/* UI 配置領域 */}
      <div style={{ position: "absolute", zIndex: 2, width: "100%", height: "100%" }}>
        <VirtualJoystick 
          onMove={(x, y) => { 
            // ジョイスティックの入力を毎フレーム Manager に渡す
            gameManagerRef.current?.setJoystickInput(x, y); 
          }} 
        />
      </div>
    </div>
  );
}