سؤال

أنا متأكد من أن هناك حل نمط التصميم لمشكلتي، لكنني لا يبدو لي أن أقرر ما هو نهج عملي. أنا أعرف ما أريد، أنا أواجه مشكلة في جعل الاتصالات ... سأشرح:

أنا أعمل في لعبة. لدي gameobjects. لدي gamebehaviors. يتم تعريف خصائص GRAYOBJECS الخاصة بي في ملف XML يحتوي على كل التفاصيل.

<type name="Object">
    <unit name="follower" behavior="followMouse" >
        ...other unit info here...
    </unit>
</type>

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

ليس لدي الكثير من الخبرة في أنماط التصميم ... ويبدو أن عدد منهم يبدو أنهم يمينون تقريبا ولكن لا شيء من الأمثلة التي قرأتها يبدو أنها تنقر عليها.

أنا أعمل مع AS3، لكن لا تتردد في جعل الأمر أكثر عام.

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

المحلول

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

لذلك قد يحتوي كائن اللعبة على طريقة INTFROMXML (XML)، أو ربما لديه طريقة مصنع ثابت يأخذ XML كوسيطة. يؤدي هذا XML ويبحث عن السلوكيات ثم ينشئ السلوك المناسب. إنشاء السلوك يمكن القيام به مع مصنع آخر.

ثم تضيف السلوك إلى قائمة سلوكيات كائنات اللعبة. قد تكون السلوكيات كائنات تنحدر من فئة مشتركة، أو قد تقوم جميعها بتنفيذ واجهة Ibehavior.

يمكن أن تقوم السلوكيات بذل قصارى جهدها إما عن طريق الاتصال بكائن اللعبة، أو عن طريق إضافة مستمعي الأحداث.

نصائح أخرى

أعتقد أنني أفهم نهجك.

يأتي هذا كثيرا في الألعاب لأن لديك عدد لا حصر له من التأثيرات والحالة والسلوكيات وما إلى ذلك.

ما أراه في مشكلتك هو أنك تتعامل مع أشياء وظيفية مثل "هل هذا يتبع هذا الماوس"، "هل هذا يستجيب لأوامر لوحة المفاتيح"، إلخ ...

في هذه الحالة، ما يمكنك القيام به هو إنشاء فئات وظيفية مثل "MouseFollower" أو "KeyboardRespondePonde" الذي يقبل بشكل عام GameObject كوسيطة منشئتهم.

يمكن بعد ذلك تطبيق هذه الكائنات معالجات الأحداث مباشرة إلى GAMEOBJECT مثل AdSlisteners.

يمكنك تخزين جميع الكائنات الوظيفية الخاصة بك في صفيف داخل GameObject في حال تحتاج إلى إزالتها.

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

for each IFunctionalObject in GameObject.FunctionalObjects
IFunctionalObject.disable()

أعتقد أن هذا النهج سيكون مقبولا إذا كان لديك مجموعة متنوعة ضخمة حقا من كائنات اللعبة، وأفترض أن آر بي جي سيكون مثالا جيدا حيث تقوم بإدارة أعداد هائلة من العفاريت ذات الوظائف المختلفة.

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