ホームページ ウェブフロントエンド jsチュートリアル React と Firebase を使用したリアルタイム マルチプレイヤー ゲームの構築: Gladiator Taunt Wars

React と Firebase を使用したリアルタイム マルチプレイヤー ゲームの構築: Gladiator Taunt Wars

Nov 14, 2024 am 11:27 AM

Building a Real-Time Multiplayer Game with React and Firebase: Gladiator Taunt Wars

はじめに

この詳細なガイドでは、Gladiator Taunt Wars の詳細な例を使用して、Firebase と React を使用してリアルタイム マルチプレイヤー ゲームを構築する手順を説明します。このゲーム モードでは、プレイヤーは戦略的な挑発決闘に参加し、交代で挑発を選択してそれに応答し、相手のヘルス ポイント (HP) を減らします。この記事では、Firebase のセットアップ、マッチメイキング、ゲーム状態管理、アニメーション、リアルタイム更新、ELO ベースのリーダーボード統合など、そのようなゲームの構築に関するあらゆる側面について説明します。最後には、応答性が高く魅力的なリアルタイム マルチプレイヤー エクスペリエンスを実装する方法をしっかりと理解できるようになります。

Firebase のセットアップとプロジェクトの初期化
Firebase のセットアップ
リアルタイムのデータ処理とプレーヤー検証のために、Firestore と認証を使用して Firebase を初期化します。これらは、試合データ、プレーヤー情報、リアルタイムのリーダーボード更新を保存および管理するためのバックボーンを提供します。 Firestore ルールを設定して試合データへのアクセスを制限し、認証されたプレーヤーのみが関連情報の表示と更新を許可できるようにしてください。

React プロジェクトの構造
React プロジェクトを、マッチメイキング システム、ゲーム ボード、リーダーボード、チャットなどの各ゲーム要素を表す再利用可能なコンポーネントに編成します。コンポーネントを階層的に構造化して、明確で保守可能なアーキテクチャを実現します。

ゲームの主要コンポーネント

  1. メインメニューとマッチメイキング MainMenu コンポーネントはプレーヤーにオプションを提示し、プレーヤーがマッチメイキングに参加したり、統計を表示したり、リーダーボードにアクセスしたりできるようにします。マッチメイキング コンポーネントは、Firestore トランザクションを利用して一貫性を保ち、リアルタイムでプレーヤーのペアリングを容易にします。

マッチメイキングのロジック
startSearching 関数は、プレーヤーを Firestore のキューに追加することにより、マッチメイキング プロセスを開始します。対戦相手が見つかった場合は、新しい対戦ドキュメントが作成され、両方のプレイヤーの ID が保存され、ゲーム パラメータが初期化されます。

const startSearching = async () => {
  const user = auth.currentUser;
  if (user && db) {
    try {
      const matchmakingRef = collection(db, 'tauntWars_matchmaking');
      const userDocRef = doc(matchmakingRef, user.uid);
      await runTransaction(db, async (transaction) => {
        const userDoc = await transaction.get(userDocRef);
        if (!userDoc.exists()) {
          transaction.set(userDocRef, { userId: user.uid, status: 'waiting', timestamp: serverTimestamp() });
        } else {
          transaction.update(userDocRef, { status: 'waiting', timestamp: serverTimestamp() });
        }

        const q = query(matchmakingRef, where('status', '==', 'waiting'));
        const waitingPlayers = await getDocs(q);
        if (waitingPlayers.size > 1) {
          // Pairing logic
        }
      });
    } catch (error) {
      setIsSearching(false);
    }
  }
};
ログイン後にコピー
ログイン後にコピー

この関数は Firestore トランザクションを使用して、マッチメイキング システムを混乱させる可能性のあるプレーヤーの二重マッチングが発生しないようにします。 Firebase の serverTimestamp 関数は、複数のタイムゾーンにわたって一貫したタイムスタンプを確保するために役立ちます。

  1. GameBoard コンポーネント上のリアルタイムのゲーム状態 ゲーム状態の変化を聞く GameBoard コンポーネントは、tauntWars_matches コレクション内の変更をリッスンします。プレイヤーが挑発を選択するか応答すると、その変更はただちに Firestore に反映され、両方のプレイヤーに対して再レンダリングがトリガーされます。
const startSearching = async () => {
  const user = auth.currentUser;
  if (user && db) {
    try {
      const matchmakingRef = collection(db, 'tauntWars_matchmaking');
      const userDocRef = doc(matchmakingRef, user.uid);
      await runTransaction(db, async (transaction) => {
        const userDoc = await transaction.get(userDocRef);
        if (!userDoc.exists()) {
          transaction.set(userDocRef, { userId: user.uid, status: 'waiting', timestamp: serverTimestamp() });
        } else {
          transaction.update(userDocRef, { status: 'waiting', timestamp: serverTimestamp() });
        }

        const q = query(matchmakingRef, where('status', '==', 'waiting'));
        const waitingPlayers = await getDocs(q);
        if (waitingPlayers.size > 1) {
          // Pairing logic
        }
      });
    } catch (error) {
      setIsSearching(false);
    }
  }
};
ログイン後にコピー
ログイン後にコピー

ゲームフェーズの処理
プレイヤーは交互にターンを行い、それぞれが挑発または応答を選択します。 currentTurn 属性は、ゲームがどのアクション フェーズにあるかを示します。各アクションは Firestore で更新され、両方のクライアント間のリアルタイム同期がトリガーされます。たとえば、挑発を選択したプレイヤーは currentTurn を「応答」に切り替え、対戦相手に応答を選択するよう警告します。

  1. プレイヤーのアクションと挑発の選択 アクション選択コンポーネント このコンポーネントは、利用可能な挑発を表示し、選択プロセスを処理します。プレイヤーは挑発または応答を選択します。これらは Firestore に保存され、次のフェーズをトリガーします。
useEffect(() => {
  const matchRef = doc(db, 'tauntWars_matches', matchId);
  const unsubscribe = onSnapshot(matchRef, (docSnapshot) => {
    if (docSnapshot.exists()) {
      setMatchData(docSnapshot.data());
      if (docSnapshot.data().currentTurn === 'response') {
        setResponses(getAvailableResponses(docSnapshot.data().selectedTaunt));
      }
    }
  });
  return () => unsubscribe();
}, [matchId]);
ログイン後にコピー

タイマー コンポーネントは、各ターンの持続時間を制限します。このタイムアウト機能は安定したゲーム フローを維持し、時間内に行動しなかったプレイヤーにペナルティを与え、HP を減らします。

const handleTauntSelection = async (taunt) => {
  const otherPlayer = currentPlayer === matchData.player1 ? matchData.player2 : matchData.player1;
  await updateDoc(doc(db, 'tauntWars_matches', matchId), {
    currentTurn: 'response',
    turn: otherPlayer,
    selectedTaunt: taunt.id,
  });
};
ログイン後にコピー
  1. Konva による健康と攻撃のアニメーション CanvasComponent: ヘルスの変化と攻撃をアニメーション化するために、react-konva を使用します。体力バーは挑発に基づいて受けたダメージまたは与えられたダメージを視覚的に表し、エンゲージメントを強化します。
const Timer = ({ isPlayerTurn, onTimeUp }) => {
  const [timeLeft, setTimeLeft] = useState(30);
  useEffect(() => {
    if (isPlayerTurn) {
      const interval = setInterval(() => {
        setTimeLeft(prev => {
          if (prev <= 1) {
            clearInterval(interval);
            onTimeUp();
            return 0;
          }
          return prev - 1;
        });
      }, 1000);
      return () => clearInterval(interval);
    }
  }, [isPlayerTurn, onTimeUp]);
};
ログイン後にコピー

このように攻撃をシミュレートすることで、各挑発や反応の威力と結果を視覚的に示し、より没入型のエクスペリエンスを作り出します。

  1. ChatBox を使用したリアルタイム チャット ChatBox コンポーネントは、挑発メッセージと応答メッセージを表示するリアルタイム チャットです。このチャット インターフェイスはプレーヤーにフィードバックとコンテキストを提供し、インタラクティブなエクスペリエンスを作成します。
const animateAttack = useCallback((attacker, defender) => {
  const targetX = attacker === 'player1' ? player1Pos.x + 50 : player2Pos.x - 50;
  const attackerRef = attacker === 'player1' ? player1Ref : player2Ref;
  attackerRef.current.to({
    x: targetX,
    duration: 0.2,
    onFinish: () => attackerRef.current.to({ x: player1Pos.x, duration: 0.2 })
  });
});
ログイン後にコピー

各メッセージはユーザーの ID に基づいて条件付きでレンダリングされ、送信メッセージと受信メッセージを個別のスタイルで区別します。

  1. ELO ランキング付きのリーダーボード EloLeaderboard コンポーネントは、ELO レーティングに基づいてプレーヤーを並べ替えます。試合ごとに Firestore のプレーヤーの評価が更新され、リアルタイムで取得されて表示されます。
const ChatBox = ({ matchId }) => {
  const [messages, setMessages] = useState([]);
  useEffect(() => {
    const chatRef = collection(db, 'tauntWars_matches', matchId, 'chat');
    const unsubscribe = onSnapshot(chatRef, (snapshot) => {
      setMessages(snapshot.docs.map((doc) => doc.data()));
    });
    return () => unsubscribe();
  }, [matchId]);
};
ログイン後にコピー

リーダーボードは ELO に基づいてプレイヤーをランク付けし、競争のモチベーションを提供し、プレイヤーが自分の進捗状況を追跡する方法を提供します。

技術的な課題とベストプラクティス
Firestore トランザクションとの整合性
トランザクションを使用すると、特にマッチメイキングやスコアの更新中に、Firestore への同時読み取り/書き込みによってデータの整合性が維持されます。

リアルタイム リスナーの最適化
メモリ リークを防ぐために、unsubscribe() を使用してリスナーのクリーンアップを採用します。また、クエリを制限すると、Firestore の読み取り数が減り、コストとパフォーマンスが最適化されます。

キャンバスを使用したレスポンシブ デザイン
CanvasComponent はビューポートに基づいてサイズを調整し、デバイス間でゲームの応答性を高めます。 React-konva ライブラリを使用すると、インタラクティブな要素の堅牢なレンダリングが可能になり、アニメーションを通じてプレーヤーに視覚的なフィードバックを提供できます。

エッジケースの処理
プレイヤーがゲーム中に接続を切断するシナリオを考えてみましょう。このために、マッチ データが更新され、放棄されたマッチ インスタンスが閉じられるようにするクリーンアップ関数を実装します。

まとめ
Firebase と React を使用すると、リアルタイムのユーザー アクションに適応する、ペースの速いマルチプレイヤー エクスペリエンスを作成できます。 Gladiator Taunt Wars の例では、リアルタイムの更新、安全なトランザクション、動的なアニメーションを統合して、魅力的で視覚的に魅力的なゲームを作成する方法を示しています。

結論

Gladiators Battle 用の Gladiator Taunt Wars の構築は、React、Firebase、没入型のゲーム メカニクスを組み合わせて Web ベースのゲームでローマのアリーナ戦闘の激しさを表現する、やりがいのある旅でした。 Firebase のリアルタイム Firestore データベース、安全な認証、堅牢なホスティング機能を活用することで、プレーヤーが戦略的な戦いで対決できる、シームレスでコミュニティ主導のエクスペリエンスを作成することができました。継続的なデプロイのために GitHub Actions を統合することで開発も合理化され、ゲームプレイとユーザー インタラクションの強化に集中できるようになりました。

Gladiator Taunt Wars の拡張を続ける中で、AI 主導の対戦相手や強化された試合戦略などの新機能の可能性に興奮しています。これにより、ゲームプレイ エクスペリエンスが深まり、それぞれの戦闘がさらに没入感のあるものになります。歴史的な戦略と現代のテクノロジーの組み合わせにより、プレイヤーは剣闘士の世界に参加するためのダイナミックな方法を提供します。

このシリーズの今後の記事では、リアルタイム データ フローの最適化、複雑なゲーム状態の管理、プレイヤー エンゲージメントを強化するための AI の活用など、Firebase を使用したインタラクティブなウェブ アプリケーションの作成に関する技術的な詳細について詳しく説明します。フロントエンド サービスとバックエンド サービスを橋渡しして応答性の高いリアルタイム マルチプレーヤー環境を作成するためのベスト プラクティスを検討します。

独自のインタラクティブ ゲームを開発している場合でも、Gladiators Battle の背後にある技術に興味がある場合でも、このシリーズは Firebase を使用した最新の Web アプリケーションの構築に関する貴重な洞察を提供します。私たちは古代の歴史と最先端のテクノロジーを融合し続け、今日のデジタル世界で剣闘士の戦いの興奮を再考します。

?さらに発見:

剣闘士の戦いを探索する: https://gladiatorsbattle.com でローマの世界に飛び込み、戦略と戦闘を体験してください
GitHub をチェックしてください: https://github.com/HanGPIErr/Gladiators-Battle-Documentation でコードベースと貢献をご覧ください。
LinkedIn でつながる: 私のプロジェクトの最新情報については、LinkedIn をフォローしてください https://www.linkedin.com/in/pierre-romain-lopez/
また、私の X アカウント: https://x.com/GladiatorsBT

以上がReact と Firebase を使用したリアルタイム マルチプレイヤー ゲームの構築: Gladiator Taunt Warsの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Python vs. JavaScript:学習曲線と使いやすさ Python vs. JavaScript:学習曲線と使いやすさ Apr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

JavaScriptとWeb:コア機能とユースケース JavaScriptとWeb:コア機能とユースケース Apr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScript in Action:実際の例とプロジェクト JavaScript in Action:実際の例とプロジェクト Apr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptエンジンの理解:実装の詳細 JavaScriptエンジンの理解:実装の詳細 Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:コミュニティ、ライブラリ、リソース Python vs. JavaScript:コミュニティ、ライブラリ、リソース Apr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

Python vs. JavaScript:開発環境とツール Python vs. JavaScript:開発環境とツール Apr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScript通訳者とコンパイラにおけるC/Cの役割 JavaScript通訳者とコンパイラにおけるC/Cの役割 Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

Python vs. JavaScript:ユースケースとアプリケーションと比較されます Python vs. JavaScript:ユースケースとアプリケーションと比較されます Apr 21, 2025 am 12:01 AM

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

See all articles