ゲームストーリーイベントプログラミング


28

c / c ++およびDirectXでゲームエンジンを開発しました。

マップ用のタイルエンジン、アニメーションプレーヤー/ NPCスプライト、NPCとの会話、メニュー、およびレベル変更がありますが、ゲームはなく、空っぽです。

私は周りを見回して流行語の答えを聞き続けていますが、ゲームにストーリーを実装する方法を知りたいです。

一部の人々は、ゲームで利用可能なすべてのアクション/状態を管理するフラグを保持する保存ファイルを言っていますが、これはばかげて聞こえます。

それは少し野心的ですが、私は古いポケモン/ファイナルファンタジーゲームのようなゲームを得ることを目指しています。

これらのゲームがどのように機能するか、または理論がどのように使用されるかを知っている人はいますか?

私はしばらく探していましたが、人々からのインプットを本当に感謝しています。

回答:


19

ゲームのストーリーは、おそらく有限状態オートマトン(または何らかの拡張FSA)の形式である必要があります。特定のイベントが発生すると、新しい状態に移行する必要があります。この方法では、現在の状態と、FSAで次に移動する場所を知るために必要な情報(位置、ヘルスなどのプレーヤーの詳細)のみを保存する必要があります。

たとえば、ポケモンのゲームを絶対に単純化しすぎると、ジムバッジがFSAのメインブランチを形成します。バッジがない状態0で開始し、ジムリーダーを倒すと、状態を移動して状態1、状態2などになります。ゲームエンティティを現在の状態に更新するには、取得するだけです。現在の状態を確認します。たとえば、3番目のジムの外にいるNPCは、現在の状態を確認し、3つのバッジを持つことに対応する状態にあることを確認し、それに応じて応答します(「Well done!」などで応答します)。

世界のすべての状態を保存する必要はありません。ストーリーの状態。エンティティ自体は、現在の状態に応じて反応する方法を知っています。


興味深いアプローチで、試してみるのが好きですが、ストーリーの進行に依存しないサイドクエストをどのように追跡しますか?

それは、あなたの物語がどれだけ複雑になるかに本当にかかっています。複数のFSA(サブストーリーごとに1つ)を持つのが最も簡単な場合もあれば、複雑な分岐が必要になる場合もあります。座ってストーリーをロードマップとして描く必要があります。すべてがどのように絡み合っているかを理解したら、現在の状態(または、複数の状態が同時に存在する可能性がある場合)を保存する方法について考えてください。NPCの位置(保存する必要がある場合)や特定のキャラクターの健康状態など、ストーリーに依存しないため、いくつかのものを個別に保存する必要があります。

あなたが話しているこのFSA、どこでこれの説明を見つけることができますか?
ケイス

ステートマシンのすべてをあちこちで学ぶことができますが、99.9%の時間はゲームについて語っていません。計算に関する入門書でそれらについて学ぶことができますが、実際にはそれほど詳細は必要ありません。特定のイベントが発生したときに状態になり、状態間を移動するという概念を理解する必要があります。@pwnyの応答は、実際には同じことを異なる方法で言っているだけです。ただし、FSAについて読むことは、ステートマシンの概念を学ぶのに最適な方法です。ステートマシンの概要については、Googleをご覧ください。
ジョセフマンスフィールド

7

ゲームが存在する可能性のある一連の状態を使用できます。NPCとあなたの世界はそれらの状態を認識し、それに応じて反応/表示します。一部のアクション/イベントによってアクティブ化されるトリガーのセットを定義することもできます。

たとえば、特定の対戦相手を倒すとトリガーAがアクティブになり、状態Sがワールドに追加され、状態Sでは、キャラクターが対戦相手の隠れ家から出ると感電します。または、外で雨が降っています。または、珍しいキャンディーを見つけます。ポイントを取得します。

ゲームにこれら2つのシンプルな追加を加えると、ゲームをより「生き生き」させることができます。

また、あなたの世界、キャラクター、ストーリーの豊かな背景を作成し、ゲームがその背景と一致していることを確認してください。最初にストーリーを計画します。

Gamedevも試してください


それは可能ですが、専門家の方が優れていると確信しています。あなたが何十万ものブール値と整数を必要とするからです(試しました)。大規模なゲームへの現実的なアプローチとは考えていません。リンクをありがとう

必ずしも、独立した5つの独立した状態を想像してください。5つのブール値に対して32の可能なブランチを取得します。それは合理的だと思います。また、特に一連のトリガーを使用して動作をスクリプト化できるため、トリガーシステムは多くのプロフェッショナルゲームで使用されます。
-pwny

2

sftrabbitが述べたように、これはステートマシンに最適なアプリケーションです。

基本的に、ツリー構造のようなものがあります。各リーフ/ノードには、現在の状態に関する情報と、次の状態に進むためのルールが含まれています。プロット/プレイフローをどの程度複雑にする必要があるかに応じて、各ノードには複数の出口が含まれる場合があります。

これによく似た、非常に緩い類推は、Choose Your Own Adventureブックです。各ページには、ストーリーの一部を説明するテキストと、プレーヤーが行える決定が含まれています。各決定は別のページにつながります。一部のページは、以前にアクセスしたページなどにリンクバックする場合があります。

ZorkLeather Goddesses of Phobosのような古いテキストベースのアドベンチャーゲーム、悪名高いSierra * Questゲーム(Roger Wilcoが主人公のSpace Quest が私のお気に入りの1つ)は、このタイプのシステムの非常にシンプルなバージョンを使用していました。マップ内の各部屋は州であり、出口は他の州または部屋にリンクされています。アイテムを取得すると、グローバル状態オブジェクトにフラグが設定されます。各部屋はこれらのフラグをチェックして、各部屋でどのキャラクターまたはアイテムが利用可能かを判断します。

そのため、状態はクラスまたは構造体として実装でき、それぞれに次のプロパティがあります。

資産リスト-背景グラフィックスや部屋/状態/レベルを表示するために必要な他のものへのポインターのリスト。

エントリー条件-レベルに入るためにすでに到達していなければならない実績

出口-可能な「次の」出口へのリンク。North、South、East、Westがこの例ですが、Door1、Teleportなどを含めることもできます。部屋を出ようとするとき、または出口/ドアが「開いている」と判断すると、ゲームは次の状態を確認できます入口条件が満たされているかどうかを確認し、出口が画面に表示される方法を変更するか、プレーヤーがその方向に移動できないようにします。

あなたが空想を得たいと思うならば、あなたは部屋がプレーヤーに示される方法、またはその部屋で利用できるアクションを変えるだろう異なるエントリー条件で州の異なるバージョンを含めることができました。

スタート画面、デス/ゲームオーバー画面などはすべて、システム内の状態であり、メニュー画面間を移動する方法と同様です。実際、このようなメニューシステムが適切に配置されている場合、これに使用できます。メニューをナビゲートする上/下矢印と「Enter」の代わりに、ゲームプレイエリア内で特定のイベントを探します。たとえば、テレポートパッドを踏んだり、画面の右側から歩いたりします。

管理者の観点から、ステートマシンを作成できる管理ツールを作成することでメリットが得られるかどうかを検討してください。ルームをマップに追加し、それらの間にリンクを作成し、背景画像などのアセットを割り当てます。これはおそらく最初の試みではやり過ぎです。管理ツールの構築に夢中になるのは簡単すぎて、実際にゲームを終了することはありません。覚えておいてください-あなたはミドルウェアではなく、ゲームを書いています。

お役に立てれば。


この例では、町をイメージしています。私はタイルのレイアウトだけでなく、グラフィックとサイズ、NPCのリストとそのような一般的なものを保持するファイルを持っています。ファイルを追加することで、新しいタウンカムをゲームに追加して、他の人が貢献できるようにするか、計画はそうでしたが、ファイルはややいっぱいで複雑になっています。私があなたを理解したら、私はこのファイルにその町で起こることができるイベントを進行状況を追跡するためのフラグとともに入れますか?
スケイス

@Skeithはい、それは合理的なアプローチのように聞こえます。
3Dave

0

VERGEと呼ばれるこのゲームエンジンを使用していました。それをいじって、イベントがどのように処理されるかを確認してください。オープンソースでもあるため、こちらで実装方法を確認できます。ここに簡単な説明があります。

各マップにはさまざまなレイヤーがあります。いくつかのグラフィックレイヤーがあります。閉塞層。そして、ゾーン層があります。ここで重要なのはゾーンレイヤーです。*

各タイルには、それが属するゾーンを示す番号があります。各ゾーンは、2つの基本的な方法のいずれかでアクティブにできます。ゾーンは、プレイヤーがゾーンに入るとアクティブになるか、隣接アクティベーションと呼ばれるものがあります。隣接アクティベーションとは、プレーヤーがゾーンのタイルの1つに隣接して立っており、アクティベーションキーとして指定されたキーを押すと、ゾーンがアクティベートされることを意味します。

ゾーンがアクティブになると、スクリプトから関数が呼び出されます。そのため、何らかのスクリプト言語を埋め込む必要があります。VERGEにはVergeCという独自の言語があり、luaも使用できます。私自身はPythonを使用することを好みます。

このハードルを乗り越えると、イベントスクリプトの作成に大きな力があります。プレイヤーの統計情報、ストーリーフラグなどのデータを保存して操作できる本格的なプログラミング言語があります。

*エンティティレイヤーもあります。エンティティは、モバイル隣接アクティブゾーンのように機能します。


これは、RPGゲームメーカーシリーズで使用されている一種のシステムのように聞こえます。しかし、そのタイルがあなたのストーリーのどこまで進んでいるかに基づいて、そのタイルに5つの異なるイベントがある場合はどうでしょうか?
ケイス

@Skeithそれはできません。各タイルには、1つのゾーンのみが関連付けられています。また、各ゾーンには、呼び出すスクリプト関数が1つしかありません。しかし、それは問題ではありません。ここには、本格的なプログラミング言語があります。ストーリーのどこまで進んでいるかに関する情報は、変数(または複数)に格納されます。したがって、スクリプトで変数をテストし、その値に基づいて適切なアクションを実行するだけで、何をするかを決定できます。
ベンジャミンリンドリー

@Skeith:タイルが属するゾーンを変更するオプションを追加できますが。
ベンジャミンリンドリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.