![]() |
|
محاولة لصناعة لعبة - نسخة قابلة للطباعة +- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum) +-- قسم : متتديات باسكال Pascal (https://delphi4arab.net/forum/forumdisplay.php?fid=7) +--- قسم : Lazarus - Free Pascal - CrossKylix - Kylix - CrossVCL (https://delphi4arab.net/forum/forumdisplay.php?fid=34) +--- الموضوع : محاولة لصناعة لعبة (/showthread.php?tid=4735) |
محاولة لصناعة لعبة - makhlouf - 26-11-2012 بسم الله الرحمان الرحيم بداية موفقة اخي piratewar بالتوفيق إن شاء الله فانا اتابع ما تقوم به و تمنيت لو استعملت الدالفي و فتحتها ورشة للمساهمة و المشاركة الجماعية كل بما يعرف حتى نستفيد و نتعلم معكم يا اساتذتنا ولكن لابأس واصلوا و نحن نتابع و نشجع و نتمنى أن نرى المشروع يرى النور في أقرب وقت إن شاء الله وفقكم الله و سدد خطاكم آمين محاولة لصناعة لعبة - piratewar - 26-11-2012 بصراحة أستاذي العزيز قمت بتجربة النتائج المترتبة عند عدم استخدام parameter Aowner الخاص بالإجراء create و قادني ذلك إلى هذه الصورة التوضيحي ولكن يبقى السؤال هل يجب معرفة التخطيط السابق بالتفصيل عند محاولة برمجة الكائنات(وبالأخص المكونات) محاولة لصناعة لعبة - kachwahed - 26-11-2012 إقتباس :هل يجب معرفة التخطيط السابق بالتفصيلأبدا، لست مضطرا إلى معرفة كل تفصيل وهذا يحدث حتى مع شركات التطوير التي تشتري مكتبات كائنات وأحيانا لا تنظر إلى السورس كل ما يهم ما الذي عندك؟ وكيف تستخدمه؟ نواصل لتتضح الفكرة... الآن وقد لاحظنا أن الكائنات الفاعلة في اللعبة (لنسميها Actors) تتشارك في نفس الحركات ولكل منها حركاتها المميزة... ما رأيك بكتابة كائن TActor يشتق منه بقية الكائنات TShooter, TTarget... مثلا: PHP كود : TActor = class(TShape)PHP كود : TShooter= class(TActor)كود التهيئة Initiate سنجعله مضمن عند الإنشاء Create. أكمل بقية الكائنات وعدل على الكود ما تشاء، شريطة أن تجميع المناهج المشتركة (procedure/function) في الكائن TActor المرفق. محاولة لصناعة لعبة - kachwahed - 26-11-2012 إقتباس :ما أعلمه (تستخدم override في حالة استخدام رأس إجراء أو دالة أكثر من مرة بمعطيات مختلفة للحصول على نتائج مختلفة)أعتقد أنك تقصد overload override تغطي المنهج الموروث إقتباس :ماذا إن استخدمنا create بدون Aownerفي هذه الحالة لا يمكنك استدعاء المنهج الموروث وبالتالي لا يمكنك استخدام inherited يستحسن الحفاظ على نفس الإمضاء للتحكم في سلوك الكائنات بشكل أفضل. إقتباس :ولماذا override مع destroyهنا ينبغي أن نلغي عمل destroy الأصلية إذا أردنا القيام ببعض عمليات التنظيف Clean up قبل تدمير الكائن، لذلك يحسن توظيف override وهذا شائع وقد نعطه عمليات إضافية لاحقا عندما يكبر المشروع. محاولة لصناعة لعبة - piratewar - 27-11-2012 جزاكم الله خيرا ً على المعلومات الرائعة قمت بعمل المطلوب ولكن Tshoot لا يندرج تحت TActor حيث أن إجراءاته و حركاته مختلفة و لكن في المقابل كانت لدي ميزة جديدة و هو عدم تكرار إجراءات أكثر من مرة هناك شيء آخر هل إستخدمنا Encapsulation مع الإجراء Initiation ملاحظة لابد منها : بصراحة لم أستخدم البرمجة الكائنية من قبل اللهم إلا عند تطبيق الأمثلة الموجودة بالكتب أو التعامل مع المكونات التي أقوم بتحويلها من دلفي للازاراس(و لا تعتبر ممارسه أيضاً) و لكن أول مرة أتعرض لمشكلة برمجية و أحلها بطريقة كائنية التفكير بها متسلسل و ممتع جداً
محاولة لصناعة لعبة - piratewar - 27-11-2012 سؤال آخر : ماذا إن أردت استخدام بعضاً من خصائص Tshape , Timage هل يسمح باستخدام الوراثة المتعددة؟ وكيف يتم التصريح؟ محاولة لصناعة لعبة - piratewar - 27-11-2012 المرفق التالي به نفس التعديلات ولكن استخدمت Timage كancestor لم بستغرق التعديل دقيقتان
محاولة لصناعة لعبة - kachwahed - 27-11-2012 إقتباس :قمت بعمل المطلوب ولكن Tshoot لا يندرج تحت TActorسنأتي عليه... إقتباس :هناك شيء آخر هل إستخدمنا Encapsulation مع الإجراء Initiationالتغليف مطبق على الفئة كلها TActor تطبيقا لمبدأ الصلاحيات الدنيا Least privileges باختصار عندما تبرمج فئة Class تخيل أنك لست من سيستخدمها. إقتباس :بصراحة لم أستخدم البرمجة الكائنية من قبل اللهم إلا عند تطبيق الأمثلة الموجودة بالكتبرائع، رائع... إقتباس :هل يسمح باستخدام الوراثة المتعددة؟ وكيف يتم التصريح؟دلفي ليس مثل ++C لا يدعم الوراثة المتعددة (في نظر البعض هذا أفضل!) دلفي كبقية لغات البرمجة الأخرى ذات التوجه الكائني يمكنه محاكاة ذلك باستخدام Interface إقرأ عن: multiple inheritance delphi كود : http://stackoverflow.com/questions/1276173/how-to-implement-multiple-inheritance-in-delphiنعود إلى Tshoot لنحاول صناعة نوعين من الطلقات: TShoot رشاش، TBomb قنبلة كلاهما يمضي عقد/يتفق/يتعهد... على: - تصريح إجراء Procedure باسم Fire - تصريح تابع Function باسم Fired ترجع Boolean هنا يمكننا كتابة واجهة IFire مثلا: PHP كود : type- يمكن بناء صنف آخر (جد) لـ TShoot و TBomb هناك حلول أخرى الأمر واسع... كان بالإمكان بناء هيكل برمجي أكثر تطابقا مع حقيقة اللعبة لكنه أكثر تعقيدا إقتباس :ولكن استخدمت Timage كancestorانس أمر واجهة المستخدم ![]() المرفق. محاولة لصناعة لعبة - piratewar - 28-11-2012 أستاذي السلام عليكم وحمة الله جزاكم الله خيراً على هذه المنفعة لم يتم المطلوب كاملاً :confused: قمت فقط بتعديل الإجراءات الخاصة بكائنات الإطلاق و قمت ببناء كائن Tbullet هذا مع الكائن Tbomb الذي قمتم ببرمجته مع بعض التعديل . و عدلت على الكائن Tshoot ليصبح أباً لهما ![]() و بالنسبة للواجهات لم ألمسها (ربما لم أفهمها جيداً) حيث وجدت أنه تكرار بدون داع و هو تكرار التصريح عن دوال و إجراءات وإعادة التصريح عنها في الكائنات المشتركة (ما أفهمة من مبدأ تعدد الواجهات هو إجراءات و أحداث الهدف منها واحد ولكن الكائنات تقوم بتنفيذها بعمليات مختلفة و بمعاملات مختلفة) محاولة لصناعة لعبة - piratewar - 28-11-2012 سؤال آخر كيف سأستفيد بمبدأ تعدد الواجهات في حين أجد مبدأ الوراثة أسهل و أكثر تنظيماً |