2011-09-07 12 views
15

私は数日前にElder Scrolls IV:Oblivionをプレイし始めましたが、私は助けないかもしれませんが、クエストシステムがプログラムによってどのように処理されるのか不思議です。ゲーム(忘却など)はどのようにモデル化されていますか?

具体的には、数多くのクエストやサブクエストがゲームに多数存在し、そのすべてがゲームの環境にさまざまな形で反映されています。特定の時間/特定の人々(それらがまだ生きていると仮定して)、関連するクエストアイテム(そのうちのいくつかは特定のNPCおよびクエストの状態に関連付けられている)、異なるNPCとの様々なダイアログ(変更可能な複雑なツリー他のNPCとのダイアログで&クエストの一般的な状態)。

さらに、アクティブ/非アクティブのクエストをいつでも交換することができます。したがって、あなたの周りの環境に根本的に影響を与える複雑な動的行動は、完全に交換可能になることによってさらに一歩前進します。

これは論理的な悪夢のように思えます。私は、プログラムのように深く豊かなものをどのように定義することができているのか苦労しています。

この種のシステムにはどのようなことが(広く)説明できますか?

+6

かなり直接的な方法は、公式の世界エディタでゲームを開くことで、彼らがこのデータをどのようにモデル化するかを見てくださいエディタはゲームに含まれています。 –

答えて

1

私はここで推測しています。この種のプログラミングはしていませんが、演奏中に彼らがどのように演奏しているかについてたくさん考えました。RuneScape

おそらく、あなたのアカウントに関連するフラグと変数がたくさんあります。あなたがクエストを進めると、その値が変わります。最初に、キャラクターXは生きているとマークされ、場所Yにマークされます。後で、彼はロケーションZのようにマークされます。そして、彼女は死んでいます。だから、場所Yに入ると、変数をチェックしてそこにいるかどうかを確認し、そのオブジェクトをそこに置きます。一方、クエストを開始していない別のプレイヤーは、同じエリアにいる可能性があります。

+0

Oblivion Scriptingエンジンを見れば、実際にどのように多くのことをするのですか?多くのクエスト対応のものでさえ、彼らが設定したフラグです。私は新しいSkyrimエンジンでこれが当てはまらないと聞きました。そしてそれはより高度な動的技術を使用しています。 –

1

私はゲームデザイナーだんが、私はここで仕事にあってもよいものを見ることができます...

Object Oriented Programmingは多くのオブジェクトの中にきちんとデータとロジックをカプセル化することにより、複雑さとダイナミズムのこの種のことができます。これらのオブジェクトは、オブジェクト間のメッセージングを使用してタスクを互いに委譲して、「口頭で」対話できます。メッセージの送信者は、受信者がメッセージをどのように解釈するのかを知る必要はなく、受信者まですべての動作方法を残しておく必要があります。現実の世界のように、代表団は物事をよりスムーズに動かすことができます。

たとえば、ニューヨーク市のDel Postoからキノコのリゾットを注文する場合は、キッチンに戻ってシェフに直接お話して注文しますか?エプロンをかけて自分でリゾットを準備しますか?あなたは最も近いキノコの農場に運転し、自分のキノコを選んでいますか?いいえ、あなたはしません。これらのタスクを単にウェイター、シェフのチーム、プロデューサーに委譲します。キノコのリゾットを手に入れるには、あなたが望むことをウェイターに伝えるだけです。残りは、委任の連鎖を通じて自動的に行われます。これと同じ種類の委任がゲーム内に存在する可能性があります。

ここで、オブジェクトに戻ります。いくつかのオブジェクトは、親オブジェクトからデータとロジックを継承します。このように、多くのデータ/ロジックを共通に持つことができます。私たちはこれらの兄弟を呼びましょう。ゲームクエストの例では、各クエストは、自身の「クエストオブジェクト」であり、ベースラインデータとロジックは親「クエストの親」から継承されています。クエストの兄弟は、特定のクエストに関係する余分なデータ/ロジックにタックを張って、互いに区別することができます。

ゲーム内のアクション(ゲームのメニューでの選択など)によっては、ゲームオブジェクトがアクティブなクエストオブジェクトを兄弟の1つに置き換えることができます。多くの場合は、これは本当に簡単なコマンドで行うことができます(擬似コードでは、任意の特定のプログラミング言語の後にモデル化されていない):

gameObject.activeQuest -> getCurrentObject(); 
//returns the object containing all of the data/logic of the current active quest: 
Gibbons_GoldenArtifacts 
//Let's say the quest description is "Scour the Catacombs of Gibbon for a 
mysterious treasure" 

gameObject.activeQuest -> setCurrentObject(Gibbon_DefeatGhost) 
//sets the activeQuest object (note that QUEST OBJECT contains baseline data/logic) 
//assuming, say, Gibbon_DefeatGhost is an object like so: 

Gibbon_DefeatGhost={QUEST OBJECT}; 
Gibbon_DefeatGhost.extend(
    description="Defeat Gibbon's ghost to retrieve his golden artifacts"; 
    objective="Defeat Gibbon's ghost"; 
    questNPC="Gibbon's ghost"; 
    questLocation="Gibbon's Inner Sanctum" 
    questTriggers[1]="When PLAYER enters Gibbon's Inner Sanction: Release Gibbon's ghost"; 
    questTriggers[2]="When Gibbon is slain: Drop Gibbon's golden artifacts" 
) 

をその時点からゲームオブジェクト自体は、おそらくアクティブなクエストと相互作用し、上オブジェクトは常に同じですが、アクティブなクエストオブジェクトは、クエストオブジェクトの兄弟の方法とは異なる方法でこれらのやりとりを認識し、異なるゲーム体験をもたらします。これに対する答えを見つけるために

私は完全にこの1上のピエロをfudgingないよ希望は...

+0

参考までに、このサイトのOOPに関する多くの情報があります。 –

関連する問題