سؤال

أقوم حاليًا بإنشاء لعبة بسيطة تعتمد على وحدة التحكم حيث يمكن للاعب الانتقال بين الغرف المختلفة ، والتقاط واستخدام العناصر ، وتناول الطعام. في الحالة الحالية للعبة ، يتعلق الأمر بذلك.

ما أحتاجه هو:

إنشاء فصل "حدث" جيد لعلتي. الطريقة التي أود أن تعمل بها هي أن كل عنصر وغرفة يجب أن تكون قادرة على الارتباط بحدث ما.

بما أنني جديد على هذا ، فإنني أقدر أي مواد قراءة تتعلق بهذا النوع من الإجراءات ، أو الاقتراحات المتعلقة كيف سيكون من الأفضل إعداد صفي (ES) مع الأخذ في الاعتبار النقاط أدناه, ، أو ببساطة كيفية مهاجمة هذا النوع من المشكلات (التي تواجه مشكلة في تحديد كيفية إعداد الفصول الدراسية).

أريد أن أكون قادرًا على إنشاء أنواع مختلفة من الأحداث ، على سبيل المثال:

  • إخراج بعض النص ، ثم اسأل اللاعب سؤالا. إذا أعطى اللاعب الإجابة الصحيحة ، فافعل شيئًا.

  • إخراج بعض النص ، ثم قم بإزالة عنصر من مخزون اللاعب ، ثم نقل اللاعب إلى غرفة أخرى.

ما أحاول تجنبه:

  • الهدف الكامل من اللعبة هو ممارسة تصميم الطبقة الجيدة ، لذا فإن الأشياء مثل التصميم والتماسك والاقتران تعتمد على المسؤولية. وبالتالي أريد أن تكون بسيطة وقابلة لإعادة الاستخدام ومستقلة قدر الإمكان.

  • الاضطرار إلى ترميز كل حدث شديد حتى يتصل عنصر أو غرفة ببساطة طريقة محددة في فئة الحدث.

ما أفكر فيه في الوقت الحالي:

إنشاء عدد قليل من الفئات الفرعية حتى أتمكن من إنشاء أحداث جديدة (وربطها) باستخدام: itemObject.setevent (حدث جديد (سؤال جديد ("introtext" ، "outrotext" ، "repustanswer"))) ؛

واسمحوا لي أن أعرف ما إذا كانت هناك حاجة إلى مزيد من المعلومات! شكرًا!

هل كانت مفيدة؟

المحلول

كتب Gems Gems Gems رائعة ... على الرغم من أنها باهظة الثمن.

ربما يمكنك العثور على مقالة أو اثنين على قائمة مقالات Gamedev, ، وربما هناك بعض الأشياء الجيدة المدفونة منتدياتهم

بالنسبة إلى فئة الأحداث ، فمن المؤكد أنك تريد فئة أساسية مع عدد من الفئات الفرعية (MoveEvent ، المخترع ، إلخ). وإذا كنت حقًا تريد تجنب ترميز الأشياء ، يجب عليك تحديد لعبتك في ملفات البيانات. الغرف والعناصر والأحداث ... بالإضافة إلى أي شيء آخر تقوم به لاحقًا. التنسيق الذي تستخدمه لتحديد الأشياء متروك لك تمامًا. أوصي بشيء يمنحك خبرة عملية لأن هذا تمرين تعليمي: محلل XML لم تستخدمه على سبيل المثال. ليس التنسيق الأكثر كفاءة لتحليله ، ولكن هذه لعبة وحدة تحكم ، بحيث ليست هذه مشكلة.

أحد الاقتراحات التي لديّ لحدث فئة فرعية ستكون تقعًا يمكن أن تربط أحداثًا أخرى معًا. لا تتغير الواجهة ، وتتيح لك القيام بأشياء مثل "إضافة هذا إلى مخزون اللاعب ، واخذ ذلك ، ونقلها هنا".

نصائح أخرى

شيء واحد أود أن أفكر فيه هو فصل تحليل نص الإدخال وتوليد نص الإخراج من نموذج المجال الأساسي. يبدو أن سؤالك يخلط بين الاثنين معًا بينما سأعتبر جزء النص من المشكلة كطبقة العرض التقديمي.

على سبيل المثال ، يمكن أن يتكون مجالك من الواجهات التالية:

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);

عند الحديث عن الأحداث نمط المراقب يتبادر إلى الذهن. يمكنك التفكير في لعبتك داخليًا من خلال العديد من آلات الدولة (يمكنك البحث عن هذا في ويكيبيديا ، أيضًا ، لا يمكنني إضافة الرابط الثاني بنفسي نظرًا لكونه جديدًا على ذلك). كل انتقال من مرحلة إلى أخرى هو حدث يمكن توصيله إلى Oberservers المسجل في هذا الحدث.

على سبيل المثال:

استخدم المفتاح على القفل: يثير إزالة المفتاح وفتح الباب ؛ من المؤكد أن "متتالية" إلى الحدث التالي دون تفاعل المستخدم الإضافي (فتح الباب): يحفز غرفة على مخرج إضافي وما إلى ذلك.

لقد قمت مؤخرًا بتطبيق شيء مشابه لما تصفه. لقد بدأت بإنشاء فئة eventManager التي تحتوي على طريقة "نشر" و "اشتراك". عند بدء تشغيل النظام ، يقوم بمسح جميع التجميعات المحملة (المكتبات) للفئات التي تنفذ واجهة 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);
}

... وتدعو طريقة السجلات على كل منها. (لا يوجد سوى مثيل واحد من eventManager يتم استخدامه في كل مكان ؛ أستخدم حقن التبعية لربطه بمثابة مثيل مفردة.)

سوف تقوم RecisterSubscriptions ببساطة باستدعاء طريقة الاشتراك لكل نوع من الحدث والمعالج الذي تهدف إلى التعامل مع الفئة المحددة. (أنا أستخدم .NET ، لذا فإن الأحداث والمعالجات أسهل قليلاً في العمل معها ، ولكن يمكنك فعل الشيء نفسه في Java باستخدام فئات فرعية مجهولة.)

قد يكون الحدث النموذجي يشبه الغرفة ، وستشمل الحجج المرتبطة بهذا الحدث معرف الغرفة وربما بعض الخصائص الأخرى حول الغرفة. ينشر محرك اللعبة هذا الحدث عندما يدخل المستخدم غرفة ، ويوفر وسيطات الحدث المناسبة لتلك الغرفة ، ثم تكون فئة EventManager مسؤولة عن استدعاء كل معالج اشترك في نوع الحدث هذا. قد يكون أحد المعالج لهذا الحدث هو "WalkEnterRoomWithmonsters" ، والذي يتحقق لمعرفة ما إذا كانت الغرفة تحتوي على وحوش ، وتنفيذ إجراء وفقًا لذلك.

هل هذا منطقي بشكل عام؟ هل لديك أي أسئلة حول هذا النهج؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top