ポイントアンドクリックスタイルのアドベンチャーゲームのコマンドシステムを実装するにはどうすればよいですか?


11

私はポイントアンドクリックのアドベンチャーゲームを作成しています。現在、コマンドシステムを実装する最良の方法を見つけようとしています。

モンキーアイランドまたはマニアックマンションスタイルのインターフェースで、動詞のパレットと、シーン内およびインベントリ内のオブジェクトを想定します。これらをクリックすると、実行する文を作成します。

たとえば、look atツリーをクリックしてから「ツリーを見る」を取得するか、リンゴをクリックしてgiveから「女の子」をクリックして「リンゴを女の子に贈る」を取得できます。

文には次の3つの形式があります。

  • verb、たとえば「保存」
  • verb noun、たとえば「りんごを拾う」、「タコを見る」
  • verb noun noun、例えば「狂犬病の犬に漬物を与える」、「漬物瓶でバールを使用する」

さまざまな状況で、実行するアクションをさまざまなオブジェクトで定義する必要があります。

たとえば、give動詞の場合、デフォルトのアクションが定義されていて、キャラクターに「私はそれにつかまりたい」などと言わせる場合や、狂犬病の犬が、与えようとするものを食べるアクションを定義する場合があります。 。

インターフェースがManiac Mansionのように機能する場合は、文を作成し、それを実行するように指示します(Maniac Mansionでは、文をクリックするか、最後にクリックしたものをもう一度クリックします)。

モンキーアイランドのように機能する場合は、文が完了するとすぐに文が実行されるため、動詞useが1つの名詞を使用することもあれば、2つの場合があることもあります。

それで、これを処理するシステムをどのように実装しますか?


1
動詞には3つのタイプがあるようです。1つのタイプはゼロの名詞、もう1つは2つのタイプなどです。これらは同じクラスのオブジェクトではありません。あなたは「漬物瓶でタコを見る」ことができないのでlook、単一名詞の動詞などです
tenpn

回答:


10

選択順序を逆にすると、使いやすくなります。したがって、ユーザーが名詞をクリックすると、ゲームはその名詞に対して実行できる動詞のセットを表示します。動詞にオブジェクトが必要な場合(「___に与える」など)、ゲームはユーザーがオブジェクトを選択するのを待ってからアクションを実行します。

何かのようなもの:

  1. ユーザーがチーズバーガーをクリックします。
  2. ゲームはメニューを示します:「拾って、食べて、見て、___にあげて」。
  3. ユーザーが「___に与える」を選択します。
  4. ゲームは「誰に譲るか?」と言います。ユーザーが別の名詞(またはキャンセルボタン)をクリックするのを待ちます。
  5. ユーザーがサルをクリックします。
  6. ゲームはサルにチーズバーガーを与えます。

実装に関しては、ゲームの各オブジェクトには次のデータが必要です。

  1. 適用できる動詞のセット。
  2. 動詞の場合は、オブジェクトのセットを適用できるオブジェクトを取ることができます。
  3. 動詞または動詞とオブジェクトのペアごとに、ユーザーがそれを実行したときに実行する動作。

文法は実際にはネストされていないため、インタプリタパターンほど複雑なものは必要ありません。


+1、物事のモデリング側と物事のインターフェース側の両方。はい、これは私がそうする方法であるので、主に私は同意しいますが、私はこの答えが好きです。
drhayes

もし私たちが同意すれば、明らかに私たちは両方が正しいはずです。;)
10

つまり、効果的に、実行する動作は常に最初の名詞によって定義されるべきだと思いますか?
SpoonMeiser 2010

1
はい、複数の名詞が動作を共有すると思います(そのため、 "pick up"は異なるオブジェクトを取得するために同じコードを使用します)が、適用できる動詞のセットを決定するのは名詞までであることが理にかなっていますそれに。名詞のセットが非常に大きく(ゲーム内のすべてのもの)、動詞のセットが小さい(おそらく少数の操作)とすると、ユーザーは最初に名詞を選択する方が合理的だと思います。早く。また、実用的には、ユーザーが何かをクリックするのではなく、何かをクリックすることで、対話を開始できます。
10

これは、フルスロットルでどのように行われたかです。
Jari Komppa、2011年

2

私は単純な解決策を提示します。もちろん拡張可能です。

(動詞、object1、object2)の単純なリストで解決できると思います。

  • プレーヤーがオブジェクト(動詞)をクリックして[使用]をクリックしてオブジェクト[バルーン]をクリックし、プレーヤーがオブジェクト[ポンプ]をクリックしてトリプレット(「使用」、「バルーン」、「ポンプ」)が存在する場合、「ポンプでバルーンを使用」
  • 「use helium」のように、object2がNULLになる場合があります(use、helium、NULL)。
  • 最初にオブジェクト動詞をクリックするようプレーヤーに要求する
  • プレイヤーが何にも一致しないものをクリックすると、「これはできません、これはナンセンスです」と言う
  • もちろん、クリックするたびにシーケンスが正しいかどうかを確認する必要があります。

デフォルトの処理方法:

  • 最初のクリックが動詞オブジェクトでない場合は、可能なデフォルトのアクションを検索します。
  • デフォルトを保存する1つの方法は、4つ組(動詞、object1、object2、is-default)を作成することです。
  • それらを格納する他の方法は、デフォルトのトリプレットのリストを持つことです
  • ...

いくつかの例:

  • (使用、バルーン、ポンプ)
  • (与える、ジョン、ジャガイモ)
  • (散歩、ピラニア、NULL)
  • (使用、在庫品、ポンプ)
  • (open、door-to-roof、NULL)、デフォルト....デフォルトアクションの例

拡張できます:

  • トリガーするイベントを追加します(プレイヤーに何かを与えると、プレイヤーは「私は強力な海賊なので、それはできません」と言い、カットシーンを開始し、世界で何かを変更します...)
  • いくつかの前提条件を追加します。気球がケージの中にある場合があるので、「気球がケージにない場合」を表現する必要があります。私はこれにイベント計算またはプロローグでアプローチするか、関数ポインタでそれを行うかもしれないと思います...
  • コマンドラインの文は「穴を見る」ではなく、「穴を見る」に書き換えられる場合があります。これには変数のみが必要です:)

1

ここには2つの問題があります。プレーヤーの入力を構文ツリーに解釈してから、そのツリーを実行します。

最初の段階では、各動詞ボタンで、いくつかの動詞インターフェイスから派生した具体的な動詞インスタンスを作成します。そのインスタンスには、検証のためにさらに名詞または動詞が渡されます。有効な場合は、名詞を内部構文ツリーに付加します。そうでない場合は、適切なエラーで拒否します。

ボタンを押すたびに、動詞ツリーが有効な状態であるかどうかを確認できます(モンキーアイランドスタイルの入力の場合)。

2番目のステージに入ると、具体的な動詞が独自のツリーを解析し、ゲームの状態を更新します。

より複雑なソリューションでは、動詞の外部でツリーを解析する必要があります。各ツリー要素は、一緒に望ましい結果を生み出した小さなアクションを担当します。このアプローチにより、小さな構成要素からより緊急の文章を作成できるようになります。

解析段階の詳細については、Interpreterパターンを確認してください。


1
プレイヤーの入力を解釈することは問題ではないと思います。確かに、ここで必要なテキストアドベンチャーへの入力を解析するほど洗練されたものはありません。実際、問題は、実行する実際のアクションを定義するオブジェクトに対して最大限の柔軟性を実現するために、オブジェクトの階層と相互作用をどのように設計するかということになります。
SpoonMeiser 2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.