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

خبير  أحمد عزالدين مشاركة 61

السلام عليكم

عذرا فقد نسيت
لقد ارفقت الان مرحلة قمت بتصميمها وتصديرها لنوع ملفات اللعبة lvl
وجعلت اسم ملف المرحلة بحيث تكون هي المرحلة التي يتم تحميلها عند اختيار new adventure
من شاشة اللعب الرئيسية

يمكنكم استخدام هذه المرحلة لتجريب الخواص التي تكلمنا عنها الجديدة متضمنة الشعلة
فقط قم بفك الملف المضغوط في المجلد Data\Levels
لتتمكن اللعبة من قراءة المرحلة بشكل سليم

أحمد عزالدين
طالب دراسات عليا
جامعة كالجري

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

بتاريخ 17/شوال/1429 04:40 م، قطب ahmed ezz حاجبيه بشدة وهو يقول:

ها قد عدنا مرة اخري مع اول محاولة لتنفيذ المطلوب وبحمد الله تم تنفيذ المطلوب 😄 واضافة زر جديد هو CTRL مسئول عن وضع اي عنصر يحمله اللاعب
سواء قرر اللاعب تركه في حالة الثبات او المشي فقط بينما لا يمكنه تركه في حالة القفز او الصعود او السقوط

الميزة تعمل مبدئياً بشكل ممتاز. لكن لي بضعة تعليقات:
 
* الالتزام بطريقة تسمية المتغيرات المستخدمة في كافة أنحاء المشروع.

* تهيئة المتغيرات تتم في الـ initializer list في الـ constructor، بدلاً من جسم الـ constructor نفسه... مثلاً:
 


class Explorer
{
private:
   int m_iMemberOne;
   float m_fMemberTwo;
 
   Explorer()
   {
      m_iMemberOne = 0;
      m_fMemberTwo = 0.0f;
   }
};
 
يجب أن يكون الكود:
 

class Explorer
{
private:
   int m_iMemberOne;
   float m_fMemberTwo;
 
   Explorer() :
     m_iMemberOne(0),
     m_fMemberTwo(0.0f)
   {
   }
};
 
 
* هناك تسريب في الذاكرة من جراء عدم حذف نسخة الـ Collectable التي يحملها اللاعب عندما يترك ما يحمل. انظر في الملف Explorer.cpp السطر 320:
 

chamber.GetCollectables().push_back(pCol);     
//delete m_pColHeld;
m_pColHeld = NULL;
 
السبب في ذلك أن النسخة المحتواة في m_pColHeld لا يتم تحرير ذاكرتها (لا أدري لمَ قمت بفصل السطر السابق، والذي كان سيعالج المشكلة).
هذه النقطة تقودني للنقطة التالية:
 
* لِمَ تقوم بإنشاء نسخة Collectable جديدة عندما تريد وضع ما يحمل اللاعب على الأرض؟ ببساطة يمكنك فقط إعادة النسخة التي يحملها اللاعب إلى قائمة الـ Collectables في الحجرة، وكل شيء سيعمل كما يجب ☺  .  مثلاً:


chamber.GetCollectables().push_back(m_pColHeld);
m_pColHeld = NULL; // It is now managed by the chamber
 
 
* أخيراً، عندما يضع اللاعب الحمل باستخدام زر Ctrl+Down، فإنه يضع الجسم على الأرض، لكنه يبقى يحمله بنفس الوقت! 😖
 



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

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

خبير  أحمد عزالدين مشاركة 63

السلام عليكم

لقد اعدت تسمية المتغيرات وطريقة تهيئتها كما ذكرت استاذ وسام
وشكرا علي الملاحظة 😒

أما في 19 اكتوبر 2008 04:18 م، فقد تنهد وسام البهنسي بارتياح وهو يرد:

هناك تسريب في الذاكرة من جراء عدم حذف نسخة الـ Collectable التي يحملها اللاعب عندما يترك ما يحمل. انظر في الملف Explorer.cpp السطر 320
بصراحة لم يحدث معي هذا التسريب مما جعلني اقوم بالغاء السطر الذي ذكرته
لكنني الان قمت باعادته علي ايه حال

لكن هناك مشكلة اصلا قابلتني لم استطع حلها وهي ما جعلتني اقوم بانشاء نسخة جديدة من ال collectable والمشكلة هي
انني ببساطة اريد ان يترك اللاعب ما يحمله بحيث يتم اسقاط الحمل في مكان اللاعب الحالي
ولان المتغير m_pColHeld لا يوفر طريقة تغيير مكان الحمل المخزن فيه وهذا يسبب مشكلة انه عند اسقاط الحمل يتم ارجاعه مرة اخري الي مكانه الاصلي
في المرحلة ولا يتم اسقاطه في مكان اللاعب
عموما اذا كانت هناك طريقة لتغيير مكان الحمل الذي يراد اسقاطه - برجاء اخباري 😳

في 19 اكتوبر 2008 04:18 م، غمغم وسام البهنسي باستغراب قائلاً:

أخيراً، عندما يضع اللاعب الحمل باستخدام زر Ctrl+Down، فإنه يضع الجسم على الأرض، لكنه يبقى يحمله بنفس الوقت!  
لقد تم اصلاح المشكلة وذلك بتحديث شكل الجرافيك الخاص باللاعب وبارجاع قيمة ال frame player الي الصفر

انظر المرفقات للتوضيح وللحصول علي اخر تعديل
في انتظار الجديد في اقرب وقت 😄

أحمد عزالدين
طالب دراسات عليا
جامعة كالجري

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

في 23/شوال/1429 04:35 ص، غمغم ahmed ezz باستغراب قائلاً:

عموما اذا كانت هناك طريقة لتغيير مكان الحمل الذي يراد اسقاطه - برجاء اخباري 😳

ببساطة، يمكنك إضافة إجراء جديد إلى كلاس Collectable، يقوم بتغيير الـ X والـ Y للشيء. المعلومات محفوظة ضمن المتغير m_Data في الكلاس.
 


بتاريخ 23/شوال/1429 04:35 ص، قطب ahmed ezz حاجبيه بشدة وهو يقول:

لقد تم اصلاح المشكلة وذلك بتحديث شكل الجرافيك الخاص باللاعب وبارجاع قيمة ال frame player الي الصفر

ممتاز! 
 
الآن الخطوات التالية في العمل غاية في البساطة:
 
* عندما يكون اللاعب حاملاً لمشعل في يده، ويمر بجانب مشعل على الجدار، فإن المشعل على الجدار يشتعل.
* تطبيق التأثير الجرافيكي للمشاعل بشكل نهائي. بنفس الشروط التي ناقشناها في الموضوع المخصص للمشاعل إياها...
 
أعتقد أننا بعد هذه التغييرات ستظهر لنا نهاية المشروع...
 
في نفس الوقت، أريد أن أسأل... لو كان هناك أحد آخر يود المساعدة (باستثناء أحمد عز) فليخبرنا لأننا حتماً نحتاج بعض المساعدة في مهام أخرى في الـ ++C (بسيطة جداً هي الأخرى) ☺
 
ما قولكم؟

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

محترف مشرف عبد اللطيف حاجي علي مشاركة 65

لدي بعض الملاحظات التي قد لا تهم أحداً غيري.
- يوجد كود من الشكل:

if (m_pColHeld)
     delete m_pColHeld;
وهو ما لا داعي له. لأنك تستطيع أن تقوم بعملية delete لمتغير قيمته NULL ولا يحدث أي خطأ. طبعاً قد يكون من الأفضل عمل assert على المتغير إذا لا يتوقع أن تكون قيمته NULL
 
- يوجد كود من الشكل:

char artName[] = "Axe";
pCol = m_pColHeld->Create(col, artName, NULL, NULL);
وهو ما لم أفهمه. فإذا كان الإجراء يستقبل متغيراً من نوع char* فهذا خطأ في تصميمه ويجب أن يستقبل متغيراً من نوع const char* أو الأفضل const &std::string. أما إذا كانت الحالة الثانية هي القائمة فليس هناك داعي لحجز متغير على الـ stack فقط لتدمره بعد النداء. أي يجب أن يكون الكود من الشكل:

const char *artName = "Axe";
pCol = m_pColHeld->Create(col, artName, NULL, NULL);
// OR
pCol = m_pColHeld->Create(col, "Axe", NULL, NULL);
 
- يوجد إجراءات تأخذ مؤشرات ولا تفحص ما إذا كانت صحيحة (مثل EnterPyramid). فإما أن تفحص أو (الأفضل) أن تستقبل references بدلاً من pointers إذا لم يكن للإجراء معنى إذا كان المؤشر غير صحيحٍ.
 
هذه الملاحظات من نظرة سريعة على explorer.cpp. أتمنى أن أجد الوقت لأتطلع على بقية الكود

عبد اللطيف حاجي علي
مبرمج
In|Framez

خبير  أحمد عزالدين مشاركة 66

السلام عليكم

وفي 23 اكتوبر 2008 04:14 م، أعرب وسام البهنسي عن رأيه بالموقف كالآتي:

ببساطة، يمكنك إضافة إجراء جديد إلى كلاس Collectable، يقوم بتغيير الـ X والـ Y للشيء. المعلومات محفوظة ضمن المتغير m_Data في الكلاس.
حسنا استاذ وسام سأقوم بالتعديل مع انني تحفظت عن ذلك من البداية لانني لم ارد ان اقوم بالتعديل في الكلاس لانني وجدت ان حضرتك صممتها
من البداية ReadOnly فقلت ربما هذا لهدف ما
عموما سأقوم بالتعديل وابسط الكود

شكرا استاذ عبد اللطيف علي ملاحظاتك المفيدة بحق
واتمني ان تستمر معنا بقدر الامكان فتشرفنا بوجودك ونستفيد من خبرتك

سأكمل كما طلبت استاذ وسام قريبا فكن علي انتظار 😄

أحمد عزالدين
طالب دراسات عليا
جامعة كالجري

خبير  أحمد عزالدين مشاركة 67

السلام عليكم
اعتذر عن تأخر المتابعة في المشروع الفترة السابقة نظرا لظروف الدراسة
تم بحمد الله انهاء التعديل المطلوب حسب فهمي للموضوع وانا في انتظار تعليقاتكم وملاحظاتكم
تم ارفاق اخر تعديل للكود.
 
لقد قمت بتطبيق استراتيجية تأثير الضوء والتي تم مناقشتها والاتفاق عليها في مقالة مؤثر المشعل
 
ملاحظة اذا تم تشغيل اللعبة في مرحلة لاتحتوي علي اي مشاعل فان الحجرة ستكون مضاءة بالكامل
اذا اردتم التجربة علي مراحل اللعبة الحالية والتي لا تحتوي علي مشاعل بدون اعادة تصميمها بمصمم المراحل
فيمكنكم الغاء السطرين الاتيين مؤقتا وهم في الملف Pyramids.cpp في السطر رقم 315 ورقم 419
وبالتحديد في بداية الدالة Pyramid::Draw ونهايتها.
 
الان هناك ملاحظة اخري وهي ان باب الخروج من الهرم والانتقال للهرم التالي يبقي مخفيا في اي حجرة تك تطبيق مؤثر المشعل فيها حتي لو تم تجميع كافة الجواهر.
اذا كان هذا الامر يضايق في البحث عن الباب والمفتاح فيمكننا تعديل الكود مرة اخري ليتم الغاء تطبيق مؤثر ضوء المشعل في حالة تم فتح الباب وتجميع الجواهر.
لقد ارفقت مرحلة للتجريب
في انتظار المزيد قريبا

أحمد عزالدين
طالب دراسات عليا
جامعة كالجري

خبير  أحمد عبد الغني مشاركة 68

لقد جربت الكود مع التعديلات. وبرأيي هناك عدة انتقادات (وأرجو عدم الزعل 😎 )
 
1- المشاعل لا تنير ما حولها على الإطلاق (وجدت الكود مفصول)
 
2- حتى بعد تفعيل الكود الخاص بها فإن دائرة الإضاءة صغيرة ومكانها خاطئ (إزاحة زائدة للأسفل)
 
3- أعتقد أن الاستراتيجية واضحة بالنسبة لأية عناصر يجب أن تظهر حتى دون وجود إنارة (كل العناصر غير أحجار الهرم) لذلك يجب أن تظهر الأبواب مع مفاتيحها
 
4- لاحظت أن كود التحقق من وجود مشاعل في الهرم يتم تنفيذه بشكل متكرر عند رسم كل لقطة من اللعبة وهذا عمل زائد يكفي إنجازه مرة واحدة فقط عند بداية اللعب (أقترح وضع هذا التحقق في إجراء Start من الهرم وحفظ النتيجة في متغير bool)
 
5- في الحديث عن المتغيرات فالكود الجديد لا يتبع مواصفات الكود الأصلي (وهذا أمر نبهنا عليه وسام عدة مرات) فمثلاً:


DWORD tA_Texture;
DWORD tOP_SeA1;
 
أراها غامضة جداً وغريبة ولا تعكس أيضا المحتوى بشكل واضح. لو اتبعنا نظام كود اللعبة لأصبحت:


DWORD dwColorArg1;
DWORD dwColorOp;
 
 
هذه بعض ملاحظاتي على الكود الآن. وأسف إن تسببت بأي إزعاج  😳
 
بالمناسبة . إن كنت لا تمانع أخ أحمد أو وسام، فأنا أود المشاركة بشكل إيجابي أيضاً بكتابة وتعديل الكود. ما رأيكم؟ 😒

اللهم انصر أهلنا في فلسطين وآجرنا أن نكون عوناً لهم

خبير  أحمد عزالدين مشاركة 69

السلام عليكم
 
مرحبا بك اخي الكريم وشكرا علي ملاحظاتك وبالتأكيد انا ارحب بك ويمكنك ان تساعدنا في الكود والتعديل علي قدر استطاعتك 😄
وجزاك الله خيرا
 
اعتذر ان كان هناك بعض الاخطاء مني في نسخة الكود الاخيرة ولكن ليس عندي نت طوال الاسبوع لانشغالي جدا بامور الدراسة 🙁

وفي 04 نوفمبر 2008 04:10 م، أعرب أحمد عبد الغني عن رأيه بالموقف كالآتي:

- المشاعل لا تنير ما حولها على الإطلاق (وجدت الكود مفصول)
 
لقد جربت الكود قبل رفعه وهو يعمل بنجاح والكود غير مفصول لكني وضعت comment لمن يريد الغاؤه اذا اراد تجربته علي اي مرحلة لا تحتوي علي مشاعل لانه لتجربة المؤثر مع المشاعل لابد من تصميم مرحلة داخل محرر المراحل ثم وضعها بالاسم المناسب داخل المجلد Data\\Levels علي ما اتذكر

في 04 نوفمبر 2008 04:10 م، قال أحمد عبد الغني بهدوء وتؤدة:

3- أعتقد أن الاستراتيجية واضحة بالنسبة لأية عناصر يجب أن تظهر حتى دون وجود إنارة (كل العناصر غير أحجار الهرم) لذلك يجب أن تظهر الأبواب مع مفاتيحها 
حسنا كنت فقط انتظر التأكيد لانني كنت مشغول جدا واردت تقسيم العمل ومحاولة انهاء ولو جزء من المطلوب وان شاء الله قريبا جدا سأضع المطلوب
وان اردت ان تساعد اخي احمد فتفضل وجزاك الله خيرا

في 04 نوفمبر 2008 04:10 م، عقد أحمد عبد الغني حاجبيه بتفكير وقال:

- في الحديث عن المتغيرات فالكود الجديد لا يتبع مواصفات الكود الأصلي (وهذا أمر نبهنا عليه وسام عدة مرات) فمثلاً:


DWORD tA_Texture;
DWORD tOP_SeA1;
 
أراها غامضة جداً وغريبة ولا تعكس أيضا المحتوى بشكل واضح.
هذه المتغيرات قديمة ولا تستخدم في اللعبة وموجودة من فترة طويلة ولانها تستخدم فقط في حفظ ال state الخاصة بال device قبل تطبيق المؤثر
بالرسم علي ال render target

مرة اخري شكرا جزيلا علي الملاحظات وانا اسعيد جدا لانني وجدت من يساعدني مرة اخري في اكمال العمل وننتظر منك المزيد في الفترة القادمة 😒

أحمد عزالدين
طالب دراسات عليا
جامعة كالجري

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

في 07/ذو القعدة/1429 03:31 ص، عقد ahmed ezz حاجبيه بتفكير وقال:

لقد جربت الكود قبل رفعه وهو يعمل بنجاح والكود غير مفصول لكني وضعت comment لمن يريد الغاؤه اذا اراد تجربته علي اي مرحلة لا تحتوي علي مشاعل لانه لتجربة المؤثر مع المشاعل لابد من تصميم مرحلة داخل محرر المراحل ثم وضعها بالاسم المناسب داخل المجلد Data\\Levels علي ما اتذكر

فعلاً الكود مفصول. ولا أعني بذلك السطرين اللذان قمت بذكرهما، وإنما الأسطر بين 985 و 1004 والمسؤولة عن رسم الدوائر حول المشاعل. وعند تشغيلها فإن الناتج غير صحيح. وهذا من الكود المرفق في مشاركتك الأخيرة... 😖

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