質問

現在、プレイヤーが異なる部屋を移動したり、アイテムを拾ったり使用したり、食べ物を食べたりできるシンプルなコンソールベースのゲームを作成しています。ゲームの現在の状態では、それについてです。

私が助けを必要とするのは:

私のゲームのための良い「イベント」クラスを作成します。私がそれを働かせたい方法は、すべてのアイテムと部屋がイベントに関連付けることができるべきであるということです。

私はこれに慣れていないので、この種の手順に関連する読書資料、または 以下のポイントを考慮して、クラス(ES)を設定するのが最善の方法, 、または単に この種の問題を攻撃する方法(クラスのセットアップ方法を決定するのに苦労しています).

たとえば、さまざまな種類のイベントを作成できるようになりたいです。

  • いくつかのテキストを出力してから、プレイヤーに質問をします。プレイヤーが正しい答えを与えた場合、何かをしてください。

  • いくつかのテキストを出力してから、プレーヤーの在庫からアイテムを削除してから、プレーヤーを別の部屋に移動します。

私が避けようとしていること:

  • ゲームの全体的なポイントは、優れたクラスデザインを練習することです。そのため、責任主導のデザイン、結束、結合などが重要な側面です。したがって、私はそれが可能な限りシンプルで、再利用可能で、独立していることを望んでいます。

  • イベントや部屋がイベントクラスの特定の方法を単に呼び出すように、すべてのイベントをハードコードする必要があります。

私が今考えていること:

項目object.setevent(new Question( "intortotext"、 "autrotext"、 "refortanswer"))を使用して、新しいイベントを作成する(および関連付けます)いくつかのサブクラスを作成する(およびそれらを関連付ける)。

詳細が必要かどうか教えてください!ありがとう!

役に立ちましたか?

解決

ゲームプログラミングGEMSの本は素晴らしいです...少し高価です。

おそらく、関連する記事を1つまたは2つ見つけることができます Gamedevの記事リスト, 、そしておそらくいくつかの良いものがあります 彼らのフォーラム

イベントクラスについては、ほぼ確実に、いくつかのサブクラス(MoveEvent、InventoryEventなど)を備えた基本クラスが必要です。そしてもしあなたが 本当 ハードコードのものを避けたい場合は、データファイルでゲームを定義する必要があります。部屋、アイテム、イベント...さらに、後でタックするものは何でも。物事を定義するために使用する形式は、完全にあなた次第です。これは学習演習であるため、実際の経験を提供するものをお勧めします。たとえば、使用していないXMLパーサーです。解析する最も効率的な形式ではありませんが、これはコンソールゲームであるため、そのような問題ではありません。

イベントサブクラスについて私が持っている提案の1つは、他のイベントを一緒にチェーンできるものです。インターフェイスは変更されず、「これをプレーヤーのインベントリに追加し、それを取り除き、ここに移動する」などのことを行うことができます。

他のヒント

私が考慮することの1つは、入力テキストの解析と出力テキストの生成を基礎となるドメインモデルから分離することです。あなたの質問は2つを混ぜ合わせているように見えますが、問題のテキスト部分をプレゼンテーションレイヤーと見なします。

たとえば、ドメインは次のインターフェイスで構成できます。

public enum Action { HIT, TALK_TO, EAT, USE };

public interface GameEntity {
  /**
   * Performs the specified action on this GameEntity, passing in zero or
   * more other GameEntity instances as parameters.
   */
  void applyAction(Action action, GameEntity... params);    
}

public interface Item extends GameEntity { }
public interface Person extends GameEntity { }

さらに、入力文字列を処理し、ドメインレイヤーに結果の呼び出しを行うか、デフォルトの応答を返すTextParserクラスを定義することができます。「私は理解できません」。たとえば、「ドアでキーを使用する」入力フレーズは、メソッドコールになります。

key.applyAction(Action.USE, door);

イベントについて話すとき オブザーバーパターン 頭に浮かぶ。あなたのゲームはいくつかの州のマシンによって内部的に提示されることを考えることができます(ウィキペディアでもこれを調べることができます。2回目のリンクを追加することはできません)。ある段階から別の段階への各移行は、そのイベントの登録されたOberServersに伝えることができるイベントです。

例:

ロックでキーを使用:キーの削除とドアの開口部をトリガーします。 additonalユーザーインタラクションなしで次のイベントに暗黙の「カスケード」(ドアの開く):追加の出口などがあるトリガールームなど。

私は最近、あなたが説明しているものに似たものを実装しました。 「公開」と「サブスクライブ」メソッドを持つイベントマネージャークラスを作成することから始めました。システムが起動すると、IEVENTLISTENERインターフェイスを実装するクラスのすべてのロードされたアセンブリ(ライブラリ)をスキャンします。

/// <summary>
/// A class that intends to listen for specific events to be published by an
/// event manager.
/// <see cref="EventManager"/>
/// </summary>
public interface IEventListener
{
    /// <summary>
    /// Subscribes to the event types that this listener wishes to listen for.
    /// </summary>
    /// <param name="eventManager"></param>
    void RegisterSubscriptions(EventManager eventManager);
}

...そして、それぞれのレジスタサブスクリプションメソッドを呼び出します。 (どこでも使用されるイベントマネージャーのインスタンスは1つだけです。依存関係注入を使用して、シングルトンインスタンスとして結合しています。)

RegisterSubscriptionsは、特定のクラスが処理することを意図している各イベントタイプとハンドラーのサブスクライブメソッドを呼び出すだけです。 (私は.NETを使用しているので、イベントやハンドラーは操作しやすいですが、匿名のサブクラスを使用してJavaで同じことをすることができます。)

典型的なイベントはRoomEnteredのようなものである可能性があり、このイベントに関連する議論には、部屋IDと部屋に関する他のいくつかのプロパティが含まれます。ゲームエンジンは、ユーザーが部屋に入ったときにこのイベントを公開し、その部屋の適切なイベントの議論を提供し、イベントマネージャークラスは、そのイベントタイプを購読している各ハンドラーを呼び出す責任があります。このイベントのハンドラーの1つは、「HandleEnterroomWithmonsters」である可能性があります。これは、部屋にモンスターがあるかどうかを確認し、それに応じてアクションを実行します。

これは全体的に理にかなっていますか?このアプローチについて質問はありますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top