الشبكة العربية لمطوري الألعاب

محترف  انس مشاركة 1

السلام عليكم.

تواجهني صعوبات لفهم مبدا البرمجة الغرضية، و اريد ان اسال عن كيفية تواصل الاصناف المجودة في مشروع السدم ؟
ما اقصده،هي هذه الجملة من طرف الاستاذ وسام :


في 10/شعبان/1431 03:03 م، غمغم وسام البهنسي باستغراب قائلاً:

كلا. فالصنف Sudum يمثل اللعبة ككل، وليس فقط جزء لعب المرحلة. الصنف الخاص بتمثيل لعب المرحلة اسمه GameLevel وهو الصنف الصحيح لاحتواء مجسم الأنبوب. لأن الأنبوب جزء من المرحلة فقط، وليس سائر أجزاء اللعبة كفلم المقدمة والقائمة الرئيسية.

لم افهم كيفية عمل الاصناف المختلفة اذ لم اقم باستدعائها في صنف Sudum بشكل مباشر او غير مباشر.هل يمكن توضيح هذه النقطة من فضلكم ؟

خبير مدير وسام البهنسي مشاركة 2

وعليكم السلام يا أنس،
 
بداية، هذا مخطط UML توضيحي ومبسط تظهر به العلاقات العامة بين الأصناف في اللعبة:




الخطوط التي تنتهي بشكل معين مصمت تعني أن الصنف العلوي لديه عضو واحد من النوع المحدد بالطرف الآخر من الخط. مثلاً، الصنف GameLevel لديه عضوين، واحد من الصنف Camera والآخر من الصنف Model.
 
الخطوط التي تنتهي بسهم مفرغ تعني الوراثة. الأصناف GameState_VideoPlayback و GameState_Play كلها ترث من الصنف IGameState.
 
كما تلاحظ من المخطط أعلاه. الصنف Sudum (الذي يمثل اللعبة ككل) بعيد كل البعد عن صنف المرحلة GameLevel، فهو لا يملك أدنى فكرة عنه. كل ما يفعله هو استخدام الصنف StateFlow المسؤول عن التحكم بتدفق خطوات اللعبة.
 
السؤال، كيف يتحكم هذا الصنف بالتدفق عبر خطوات اللعبة؟ اقرأ أولاً المشاركتين الأولتين في هذا الموضوع:
 
http://www.agdn-online.com/communities.aspx?view=posts&threadid=787&page=2
 
في بداية اللعبة يقوم StateFlow بإنشاء نسخة من صنف افتتاحية اللعبة، وهو فيديو المقدمة (GameState_VideoPlayback). ويستمر بنداء الإجراء Update على هذا الصنف في كل لقطة. عند كل نداء، يفحص StateFlow القيمة المرجعة. حيث أن هذه القيمة تخبر StateFlow إن كان الوقت قد حان للانتقال إلى خطوة أخرى أم ليس بعد. إن كان الانتقال مطلوباً، فإن الصنف GameState_VideoPlayback عليه أن يحدد إلى أية خطوة يريد الانتقال.
عندها يستلم StateFlow توع الخطوة التالية، وينشئها ويستبدلها محل الخطوة السابقة، ويتابع العمل...
 
الآن منطقياً يمكننا توقع أن معلومات المرحلة (نموذج الأنبوب واللاعب .. الخ) لا يهمنا تواجدها سوى عندما نكون في خطوة اللعب. أما في خطوة فلم المقدمة أو القائمة الرئيسية، فما الداعي لها؟
 
وهكذا تجد أن الصنف GameLevel (الذي يمثل المرحلة بكل محتوياتها) لا توجد منه نسخة سوى في صنف حالة اللعب GameState_Play. فعندما ندخل في حالة اللعب، نبدأ بتحميل المرحلة والمجسمات ونشغلها كما يجب.
 
أرجو أن تكون الفكرة قد توضحت الآن ☺

وسام البهنسي
مبرمج في إنفيديا وإنفريمز