تجربة لغة البرمجة D - محاكي جهاز CHIP8/SUPERCHIP 20. يونيو 2011 سلوان الهلالي تطوير (2) لغة البرمجة D هي لغة متعددة الاغراض وحديثة المزايا بإمكانات متقدمة. تستند نحوياً على لغة ++C/C مع اخ [المزيد]
يوم المصادر المفتوحة للتعليم 2011 21. مايو 2011 سلوان الهلالي تطوير, المجتمع (0) وهو مؤتمر يعد الاول من نوعه في المنطقة هدفه تقديم البرامج الحرة ذات المصادر المفتوحة (Free Open Source Software) كأداة تعليمية فعّالة للطلبة من جميع التخصصات، تم اقامته في يوم 16 مايو/آيار 2011 في جامعة مصر للعلوم والتكنولوجيا. بدأت الفكرة في التكوّن منذ سنة تقريباً، كنت اسمع (ولا زلت) اينما توجهت عن صراع طلبة التخصصات المرتبطة بالكومبيوتر مع البرمجة (علوم الحاسب/تقنية المعلومات/هندسة الكومبيوتر) وحالة الضياع البرمجي التي ينبغي عليهم التعايش معها لكي "ننجح فقط". بل اني قابلت اكثر من طالب كره البرمجة من اساسها رغم انها من المفترض ان تكون جوهر تخصصه. والنتيجة؟ مهندس كومبيوتر لا يعرف كيف يستخدم الكومبيوتر، أو عالم حاسبات لا يستطيع تطوير ابسط البرامج بأي لغة برمجة! اذا طرحنا السؤال التالي: ما الذي يدفع الطلبة لكره البرمجة؟ يمكن ان يكون الجواب احياناً ببساطة ان من تٌسند اليه مهمة تدريس البرمجة لا يتقن البرمجة هو نفسه! وهذه مشكلة من الصعب حلها، لكن إن استطعنا تشجيع الطلبة اليوم على استكشاف مجالهم بشكل اعمق واكثر حرية، سوف نضمن ان يكون من يقوموا بتدريس البرمجة غداً افضل من اليوم.. المشكلة الرئيسية هي عدم وجود اي تداخل بين مجتمع البرمجة العملية العالمي من جهة، وما يتعلمه الطالب من جهة اخرى من حلول مغلقة المصدر، ذات بنية وتقنيات عفى عنها الزمن، محدودة، ومكلفة له وللمؤسسة التعليمية. والأسوأ من ذلك أن بعض الحلول التي يتم تدريسها مصممة لكي تبعد الطالب عن الأسس وتخلق اعتمادية تضمن ان لا يفهم الطالب اي حلول اخرى بسهولة. لن اتحدث هنا عن المؤسسات التعليمية التي لا زالت تقدّم باسكال وفورتران بطريقة الـ Flow Chart لطلابها، وضع هؤلاء ميؤوس منه... ولكن ساتحدث عن المؤسسات التي تعتبر اكثر تطوراً.. لنأخذ مثالاً ركزت عليه في المؤتمر، لاحظت ان المترجم المستخدم لتعليم لغة ++C هو ++Borland C الذي يبدو ان هنالك اتفاقية لا نعلم عنها قد تندرج تحت بند نظرية المؤامرة بين معظم الجامعات التي دخلتها على استخدامه، منذ التسعينات وحتى اليوم! لكي نفهم لماذا ++Borland C سيء، لنقارنه بالمترجم الاكثر استخداماً في عالم الكومبيوتر اليوم، GCC (والذي هو حر مفتوح المصدر ومجّاني تماماً للطالب والجامعة والمحترف): Borland C++ GCC ليس هنالك دعم على الاطلاق مدعوم بالكامل وفي تطوّر مستمر مجتمع متواضع يضم عدد ضئيل من المحترفين مجتمع هائل يضم عدد كبير من المحترفين والمؤسسات يدعم عدد قليل من المزايا المتقدمة المحددة بالمعايير القياسية دعم تام لجميع المزايا المحددة بالمعايير القياسية ليس هنالك دعم لمزايا سي++ الجديدة دعم كامل معايير C++0x! مغلق المصدر وتجاري وقد توقفت بورلاند عن بيعه منذ زمن! مفتوح المصدر ومجاني لكافة الاستخدامات لماذا تتمسك الجامعات ببورلاند؟ مساهمتي في المؤتمر كانت عرضاً بعنوان: Open Source for Education حاولت من خلاله تغطية النقاط التالية قدر الامكان مع اعطاء امثلة عملية اينما استطعت: قيمة البرمجيات مفتوحة المصدر للتعليم لا وجود لرخص الاستخدام التجارية المحدودة! لا نحصل فقط على البرمجيات ولكن ايضاً الشفرة المصدرية الكاملة مع رخصة تتيح حرية التعديل والتطوير على البرمجيات بأي شكل أو طريقة نختارها برمجيات لا تكلف شيئاً على الاطلاق (مجانية!) ويمكنها العمل على اضعف انواع العتاد اقرب للآلة من ما يتيح فهماً عملياً اعمق للطلبة، ويعطي القدرة على العمل على أي حلول تجارية اخرى في نفس المجال بسهولة الفائدة الكبيرة للمكتبات مفتوحة المصدر في تطوير البرامج باختلافها (امثلة Qt، Ogre3D, و zlib) كيف يبدو مجتمع المصادر المفتوحة ومن يقوم بتطوير كل هذه الحلول؟ مقارنة مفصّلة واستعراض لكيفية الاستفادة من مترجم GCC قيمة لغة البرمجة بايثون كأداة للتعليم الاستفادة من نظام تشغيل لينوكس للتعليم وشارك خالد احمد بمساهمته بعنوان: Open Source for Work والتي ركّز من خلالها على كيفية الاعتماد على المصادر المفتوحة في العمل، واعطى مثالاً مفصلاً عن كيفية انشاء موقع خدمات متكامل باستخدام Wordpress وحلول برمجة الويب مفتوحة المصدر. في حين قدم حسام بيبرز عرضاً مفصلاً وممتعاً حول نظام تشغيل لينوكس: Introducing Linux for IT قدّم خلاله معلومات جديرة بالاهتمام حول كيفية عمل نظام التشغيل من الداخل ومقارنة معمقة بين لينوكس ووندوز. شاركني في التنظيم وتقديم ورعاية المؤتمر اعضاء من المجتمع الرائع للينوكس والمصادر المفتوحة في مصر، اود ان اشكر كل من: الاستاذ فياض احمد من قسم تكنولوجيا المعلومات في جامعة مصر على مشاركته في التخطيط والتنظيم ومساعدته الثمينة، حيث تولى التعامل مع الجامعة ��حجز قاعات المؤتمر والكثير من المهام الاخرى راعيا المؤتمر، شركتي: Spirula Systems و Linatrix Systems المتخصصتين بالحلول مفتوحة المصدر، وأخص بالشكر كل من أحمد مكاوي وعلي عبدو مجتمع Ubuntu-eg ومساهمتهم الفعّالة في المؤتمر بجميع عناصره إسلام وزيري من مجتمع Ubuntu-eg الذي تولى مهمة تصميم ملصقات المؤتمر باحجامها وكذلك بطاقات التعريف الصديق العزيز معاذ مختار الذي ساعد المؤتمر بشكل كبير وساهم في اعداد العرض الذي قمت بتقديمه الاستاذة مروة معتوق من قسم الهندسة الطبية في جامعة مصر التي عرضت مساعدتها منذ البداية نهاية يوم ممتع في المرة القادمة إن شاء الله، يوم المصادر المفتوحة سيكون اكبر واوسع نطاقاً! يمكنك تحميل مجموعة من صور المؤتمر من هنا: OSED2011_photos.rar (2.24 mb)
التشتت في حياة المطوّرين: الحل! 28. نوفمبر 2010 سلوان الهلالي تطوير, علم نفس (0) من اصعب المسائل التي يجب ان يتعامل معها كل مطوّر هي الالتزام بالمشاريع لغاية اكتمالها، تتضاعف الصعوبة كثيراً عندما تكون المشاريع شخصية، لقد وقعت شخصياً في هذا الفخ لعدة سنوات! عشرات المشاريع التي لم ترى ضوء النهار تجدها متناثرة في كل مكان. لكي نكتشف كيف ولماذا يحصل ذلك، سوف احاول تلخيص ما يحصل بشكل سريع: انت جالس في مكانك امام الكومبيوتر من المفترض انك تعمل ولكنك لا تقوم بأي شيء محدد، فجأة تأتيك هذه الفكرة الرائعة! سواء قرأتها في مكان ما من الشبكة او وردتك بطريقة التخاطر، المهم انها تبدو لوهلة كأفضل فكرة في العالم. تبدأ شيئاً فشيء ببناء الفكرة الوردية في عقلك، يا إلهي كيف ستبدو رائعة! قد تكون افضل فكرة خطرت لك، يتصاعد هنا مستوى الحماس وفي لحظة تشعر بأن هذه الفكرة هي الجواب! (حتى وإن لم يكن هنالك سؤال فغلي). تشغل بيئة التطوير وتبدأ بالتخطيط والتعمق بشكل سطحي في ما تحتاجه للبدء. تكتب اول اسطر الكود، ياله من شعور رائع! لا زلت تسير على وقود الحماسه التي اكتسبتها. تحاول ان تجعل كل شيء بأكمل وجه ممكن، حتى وإن كنت تدرك من دون اي شك إن الكمال مستحيل على البشر، لكنك تتأمل خيراً. بعد فترة ما، تكون قد قمت بتصميم النافذة الرئيسية او المقدمة للعبة، ووضعت اسمك في المقدمة مع موسيقى خلابة، تبدأ مرحلة العمل الحقيقي التي لم تحسب لها حساباً بالدخول، ويرمي الكمال الذي تحاول المحافظة عليه نفسه خارج الشباك، فجأة تحس وكأن هنالك عوائق ضد رؤيتك الرائعة، وبالنتيجة تبدأ الفكرة شيئاً فشيء بفقدان بريقها، المسألة الآن مسألة وقت ليس إلا. بمجرد وصولك للسؤال: “ماذا يجب ان افعل الآن؟” او “What’s next” وعدم توفر اي دليل في تصاميمك الاولية حول المرحلة الجديدة التي وصلتها، حتى وإن كان هنالك 100 مهمة يمكنك ان تختار اي منها! حقيقة انك لم تحدد اي من هذه الـ 100 مهمة بأي طريقة مقدماً تضعك في حيرة عجيبة، وكأنك في حلقة مفرغة. اين ذهب الحماس الآن؟ والاحساس بالسعادة؟ تبحث عنه… ليس موجوداً في اي مكان… اصبح المشروع مملاً إذاً! ولكني مع ذلك سأحاول ان اكمله بطريقة ما… يتعلق برقبتك الاحساس بالذنب وكأنما تدين للمشروع بتفسير حول ما يحصل. في اليوم التالي، لديك مهام افضل، وهنالك اشياء ممتعة اكثر… لنؤجل العمل على المشروع ليوم آخر. كرر من النقطة 1 (المشروع الرائع الجديد في الطريق!) فعلاً هذا ما كان يحصل معي بالضبط، وانا متأكد ان نفس الكلام يحصل مع كل مطوّر في مرحلة ما من صياعته العملية… اقصد حياته. السؤال المهم الآن، لماذا تتكرر نفس الخطوات تماماً؟ مرة ومرتان وثلاث مرات، حتى تصبح طريقة حياة. لنكتشف ذلك سوف اقدم لكم مبدئاً من علم النفس يمكن ان يساعدنا في التحليل واكتشاف الحل، تحديداً من البرمجة اللغوية العصبية (Neuro-Linguistic Programming)، والتي طورت لها حباً وولعاً كبير ينافس ولعي بالبرمجة… المبدأ يدعى اللولب الحلزوني (spiral)، هنالك نوعان من هذا اللولب، اللولب الصاعد (upward spiral)، واللولب النازل (downward spiral). في اللولب النازل، تبدأ بمكافئة نفسك على شيء لم تعمله بعد، ثم تحاول عمل ذلك الشيء، وعندما تجد ان من الصعب جداً عمله بالمستوى الذي تصورته في البداية، يبقى لديك خياران، ان تبقى مصراً على عمل ذلك الشيء بأي طريقة وبذل الجهد اللازم، او ان تتجاهل الموضوع ولا تختار اي خيار. عندما تتجاهل الموضوع يتملكك احساس بالراحة السلبية، ابعدت نفسك عن التعب المرتبط بإكمال المشروع، وهذه الراحة تصبح بعد فترة مكافأتك على عدم اكمال المشروع! كل مرة يتكرر فيها ذلك، تكون قد هبطت اكثر داخل اللولب النازل، حتى يصبح هذا السلوك في النهاية جزءاً منك من الصعب الافلات منه، وتستمر بالهبوط اكثر فأكثر، وتضيق الحلقة اكثر فأكثر، انت ببساطة تكافئ نفسك على شيء لم تعمله، ولا تعاقب نفسك ابداً. والأسوأ من ذلك ان اللولب النازل سوف ينتقل ليصيب اوجه اخرى من حياتك، جميعها ستساهم في تضييق اللولب… هل انت الآن في لولب نازل في حياتك؟ سواء عملياً او اجتماعياً او في اي من عناصر الحياة المختلفة؟ إذاً …. توقف الآن! هل توقفت؟ حسناً، حان الوقت للتغيير، حان الوقت للتوجه بالاتجاه الصحيح. يجب ان تعكس اللولب ليكون لولباً صاعداً. في اللولب الصاعد، تبدأ اولاً بأهم خطوة، وهي تحديد اهدافك بالضبط. لا تدع اي شيء للصدفة.. بعد ذلك يجب ان تقوم بتحدد كيف ستكافئ نفسك عندما تحقق تلك الاهداف، واجعلها مكافئة رائعة وقيّمة فعلاً بالنسبة لك. وكذلك كيف ستعاقب نفسك إن فشلت بسبب التكاسل المباشر عن بذل الجهد، وعندما اقول ان تعاقب نفسك، لا اقصد الأذى ابداً، ولكن ان تؤنب نفسك بطريقة بنّائة مثلاً، او ان تحرم نفسك من شيء تستمتع به، وسوف اعطي امثلة بعد قليل… المهم ان تصل لفكرة ان تكافئ نفسك على الشيء الصحيح الذي يساعدك في تحقيق اهدافك، وتعاقب نفسك إن كانت السبب في عدم تحقيقها. في البداية، قد تتلكأ العملية وتواجه بعض المصاعب، ولكن بالجهد الكافي ستبدأ بالانتقال للّولب الصاعد، وسوف تلاحظ الحلقة وهي تتوسع وتتوسع أكثر، وتبدأ بالاحساس بأنك ترتفع أكثر فأكثر، حتى يصبح هذا السلوك جزءاً منك، ونعم سوف ينتقل ليصيب كل اوجه حياتك بالايجابية والعمل الجاد! والآن، لتطبيقه في حالتنا الخاصة، تطوير المشاريع البرمجية، هل تتذكر استراتيجية اللولب النازل فوق؟ ما سنفعله تقريباً هو عكس الخطوات… في البداية يجب ان تكون لديك فكرة مشروع معينة، برنامج او لعبة او ما شابه، حتى وإن كانت فكرة عامة. إجلس مع نفسك او مع فريقك وحدّد حدود المشروع بالضبط، مثلاً إن كان المشروع لبرنامج حدد بالضبط ماذا يجب على البرنامج ان يعمله وماذا يقع خارج نطاقه. وكميزة إضافية عندما تضع حدوداً واضحة للمشروع تتزايد قدرتك على الابداع! قسّم المشروع لعدة مراحل في كل مرحلة ستعمل على هدف محدد ولا شيء غيره. يجب ان يكون لديك الآن خطة جيدة للعمل، ونظرة شاملة لمدى المشروع وحجمه. حدّد ماذا ستكافئ نفسك عندما تنهي كل مرحلة من مراحل المشروع بنجاح، على سبيل المثال يمكنك ان تعزم نفسك على عشاء في مطعم يعجبك، ان تذهب لحفلة موسيقية او لمدينة الملاهي، ان تزور مجموعة اصدقاء من الممتع ان تقضي وقتك معهم، يمكنك هنا ان تربط بين اهداف حياتك الاخرى واهدافك العملية من المشروع! و من المفيد ان تقول لنفسك شيئاً يشبه الكلمات الآتية: إن نجح المشروع، اكون قد استثمرت وقتي بأكمل وجه! إن نجح المشروع، اكون قد اضفت مشروعاً ناجحاً لتاريخي البرمجي! إن نجح المشروع، اكون قد اضفت خبرة جيدة جداً ستفيدني في مشاريعي المستقبلية. إن نجح المشروع، سوف اشعر بالسعادة والفخر إن نجح المشروع، سوف استمتع بكل تلك المكافئات الرائعة التي وعدت بها نفسي حدّد بماذا ستعاقب نفسك إن فشلت في تحقيق الاهداف، لكل شخص خياراته الخاصة هنا، إن كنت تحب ان تلعب لعبة معينة، إمنع نفسك منها لفترة محددة. أو إن كنت تتابع مسلسلاً ما بشغف، عاقب نفسك بعدم مشاهدة عدة حلقات منه، يمكنك حتى ان تجبر نفسك على سماع الموسيقى التي تكرهها بدل الموسيقى التي تعجبك لعدة ايام (قد يكون هذا اقسى عقاب هههههههه)، ولكن من المهم جداً ان لا يؤثر العقاب على حياتك العملية او الاجتماعية ابداً بل يمكنك حتى ان تأتي بعقاب يساعدك في تحقيق اهدافك في وجه اخر من اوجه الحياة. ويمكنك ببساطة ان تقول لنفسك الكلمات الآتية: إن فشل المشروع، اكون قد ضيعت وقتي الثمين بدل ان استثمره. إن فشل المشروع، اكون قد اضفت مشروعاً فاشل لتاريخي البرمجي. إن فشل المشروع، اكون قد ضيعت على نفسي فرحة إكمال المشروع والفخر بإنجازي. إن فشل المشروع، أكون قد ضيعت على نفسي فرصة الاستمتاع بالمكافئات الرائعة التي اخطط لها. هل انت مستعد لهذه الرحلة الرائعة؟ هل انت مستعد للمكافئات الجميلة التي ستحصل عليها؟ إذاً حان وقت البدء بالمشروع الآن! بالتوفيق… سوف ازودك بالاضافة لذلك بطريقة طورتها بشكل تدريجي، اصبحت شيئاً لا يمكنني التخلي عنه اثناء العمل، اسميتها قائمة المهام (TaskList)، عسى ان تكون ذات فائدة لك. قائمة المهام ما هي؟ إنها طريقة لعمل قوائم ToDo تحافظ على الاستمرارية في العمل خاصة وإن لم تكن متفرغاً 100% (كأن تكون تدرس في جامعة في نفس الوقت)، وهي بسيطة جداً وفعّالة جداً جداً. عندما تبدأ بالعمل اول مرة، حضّر كراسة مخصصة للمشروع بجانبك، ابدأ اولاً بكتابة المرحلة التي تهدف الوصول لها الآن ووصف بسيط لاهدافها وحدودها. اكتب اول قائمة كعنوان: “TaskList 1” ومن المفيد وضع التاريخ بجانبها. والآن ضع قائمة من 10 عناصر، مرقمة من 1 الى 10، كل عنصر يأخذ سطراً واحداً. ما هو اول شيء عليك عمله؟ قم بتجزءته الى مهام قصيرة ولا تأخذ وقتاً للإنجاز ثم اكتب تلك المهام بتسلسل تقريبي موزعة على النقاط من 1 الى 10، إن احتجت اكثر، قم بأنشاء قائمة جديدة “TaskList 2” واكمل سرد المهام. ثم قائمة ثالثة وهكذا… عندما تنهي مهمة ما، يجب ان تمسك القلم وتشطبها، كل مهمة تشطبها نعني انك تقترب اكثر من تحقيق هدفك وكل ما يرتبط به من مكافئات رائعة، سوف تتعلم حب هذا الاحساس! من المهم جداً أن تقوم بكتابة 10 مهام جديدة على الاقل نهاية كل فترة عمل، لكي تساعدك في البدء بسرعة في المرة القادمة. شروط المهمة: يجب ان تكون كل مهمة تضعها بسيطة قدر الإمكان، ولا تستغرق وقتاً طوي��اً للإنجاز، وحاول جعلها تتضمن شيئاً واحداً كل مرة بدل عدة اشياء. لماذا؟ لنفرض انك عملت اليوم على مشروعك، ثم دخلت فترة امتحانات لمدة اسبوع لم تستطع خلالها ان تكمل عملك، عندما تعود في نهاية الاسبوع ستكون في حالة غريبة من الضياع، لن تدرك اين وصلت الآن وماذا يجب ان تفعل.. باستخدام قوائم المهام يمكنك أن تعرف أين وصل المشروع بالضبط وآخر مجموعة مهام قمت بإنجازها. ثم اختر مهمة صغيرة، اصغر وابسط مهمة يمكنك ايجادها من القائمة، وابدأ بها، ثم مهمة اصعب قليلاً، وهكذا… سوف يساعدك ذلك على الدخول للعمل من جديد بفعالية حتى وإن تركت المشروع لفترة طويلة. إن كانت لعبتك مجانية وسوف تنشرها بشكل عام، ابدأ بالنشر بمجرد وصولها لحالة مقبولة، اتبع القاعدة المشهورة: “Release Early, Release Often”. مثال لأول قائمة مهام لمشروعي الحالي: Remake of Super Mario Bros. 3 on SNES. Title: Super Lario Bros. 3 (appropriately Lario and Muigy :D) Limitations: - Only first level of the game will be made Goals: - To add tiling support to my prototyping game engine pyEnkido - Developing pyEnkido further as I go Solutions: - Python, PyGame, pyEnkido, and optionally Psyco for performance. - IDE: pyScripter TaskList 1 (24/11/2010) ----------------------------------------------------------------- [1] Specify goals and limitations. [2] Prepare tools. [3] Setup initial project, with company intro. [4] Commit to new repo in googlecode (http://code.google.com/p/lario) [5] Plan for game intro. [6] Prepare first scene textures. [7] Transition from intro (FadeIn to game) [8] Shortcut to quit the game immediately anytime. [9] Ground showing with black background. [10] Curtain lifting works. والنتيجة في نفس اليوم: الختام اتمنى ان تكون قد استمتعت بهذه الرحلة الصغيرة داخل عقل المطوّرين، لا تتردد في طرح اي تعليق او تساؤل هنا ولنفتح باب النقاش بخصوص الموضوع. لا تنسى ان ترسل لي نسخة من لعبتك مجاناً طبعاً بمجرد ان تنهيها
توسعة فيجوال ستوديو: SourceCreator 15. أكتوبر 2010 سلوان الهلالي تطوير (1) لو سألت اي مبرمج سي++ ما هو اكبر نشاط مضيع للوقت عند العمل على مشاريع سي++؟ بالنسبة لي فهو انشاء ملفات الكود المصدرية والرأسية باستمرار لكل صنف، ثم كتابة الهيكل الرئيسي للصنف في الملف الرأسي، ثم ملئ الملف المصدري،… بعد عدة اصناف يصبح الموضوع غير جميل ابداً.. تصوروا عمل نفس الخطوات تماماً كل مرة لـ 50 صنف، الكثير من الجهد الضائع. خلال السنوات الاخبرة عملت على عدة لغات برمجة عالية المستوى لا تعاني هذه المشكلة ابداً، لأنها مصممة بطريقة تختصر الموضوع، بالاضافة الى وجود ادوات مساعدة. اعتقد ان سي++ هي اللغة الوحيدة التي لا زالت كما هي تقريباً في هذه النقطة بالذات منذ سنوات. الآن، انا احاول العودة لسي++ بعد فترة من عدم الاستخدام، وأجد نفسي في مواجهة نفس المشكلة القديمة.. حسناًـ حان وقت التعامل معها… ماذا احتاج لكي اجعل الموضوع اسهل؟ احتاج لأداة تستطيع انشاء ملفات الاصناف بشكل اوتوماتيكي، ثم ملئها بكود موحّد لتعريف الصنف، ثم اضافتها للمشروع في فيجوال ستوديو. فيجوال ستوديو يأتي مع قدرة ممتازة للتخصيص، وابسط طريقة لانشاء ادوات عملية هي عن طريق الماكروات (Macros) (لا علاقة لها بماكروات سي)، حيث يأتي مدمجاً مع فيجوال ستوديو بيئة تطوير كاملة خاصة بالماكرو، كذلك يمكن تسجيل نشاط معين في ماكرو بشكل اوتوماتيكي (يمكن الدخول لكل ادوات الماكرو عن طريق Tools –> Macros). القيت نظرة سريعة على الماكروات، ولكن لم يعجبني الامر، اولاً لأن اللغة المستخدمة هي لغة بيسك وثانياً، يبدو ان الماكرو مخصص للمهام البسيطة ولكن قد يكون ذلك هو انطباعي لأن الامثلة المقدمة بسيطة جداً كما أني لم اعمل على لغة بيسك منذ سنة 2005. لذلك انتقلت للطريقة الاخرى، وهي اكثر قوة بالتأكيد، انشاء التوسعات (Add-ins) باستخدام فيجوال ستوديو (عند انشاء مشروع جديد اختر Visual Studio Add-in من Extensibility)، اول ميزة لهذه الطريقة هي امكانية كتابة التوسعات باستخدام اي لغة برمجة مدعومة، اخترت سي شارب. المزايا الاخرى هي امكانية بناء نوافذ Windows Forms اعتيادية وكأنك تعمل على تطبيق عادي، وكذلك يمكن فحص عمل التوسعة وحتى عمل Debugging من داخل فيجوال ستوديو، حيث يقوم فيجوال ستوديو بتشغيل فيجوال ستوديو آخر لكي تجرب فيه التوسعة! بعد عدة ساعات من العمل، وصلت للتوسعة بشكلها الحالي، وقد حققت ما اريد تماماً، يبقى معرفة ما اذا كانت هكذا اداة ستساعد فعلاً بشكل عملي... يمكن تشغيل الأداة من قائمة Tools لفيجوال ستوديو وهي تحمل الاسم Source Creator، يجب ان يكون هنالك مشروع سي++ مفتوح فعلاً لكي تعمل، ستظهر النافذة الآتية لحظة التشغيل: يمكنك ان تحدد المشروع إن كان هنالك اكثر من مشروع مفتوح من حقل Project، الاداة ستختار دائماً اول مشروع مفتوح تجده بشكل اوتوماتيكي. حقل Class Name و Base Class Name هما لأسم الصنف واسم الصنف الأب. عندما تقوم بأدخال اسم الصنف، تولّد الأداة بشكل اوتوماتيكي اسماء للملف الرأسي و المصدري، يمكنك بالطبع تغيير أسماء الملفات كما يعجبك. عندما تنقر على Finish، سوف يتم انشاء الملف الرأسي والمصدري للصنف ثم اضافتهما لمجلّدي Source Files و Header Files (الأداة ستنشئهم إن لم تجدهم). ولكن ماذا عن محتوى الملف الرأسي والمصدري؟ إن تم استخدام الأداة بشكل مباشر كما هي، سوف يتم ملئ الملفات باستخدام هذا الهيكل البسيط: للملف الرأسي: 1: #pragma once 2: 3: class ClassName : BaseClass 4: { 5: public: 6: ClassName(); 7: virtual ~ClassName(); 8: 9: private: 10: 11: }; للملف المصدري: 1: #include "HeaderFile.h" 2: 3: ClassName::ClassName() 4: { 5: } 6: 7: ClassName::~ClassName() 8: { 9: } ولكن، هذه العملية لا تحل المشكلة تماماً، حيث ان تعريف الصنف لا يكون بهذه البساطة عادة. لذلك فالأداة تقدم طريقة لانشاء قالب للملف المصدري والرأسي تستخدمه إن وجد، ملفات القالب يمكن انشاءهما بأي منقح نصوص اعتيادي مثل Notepad، واسمائهما يجب أن تكون: hfile.template cppfile.template بعد انشاءهما قم بإضافتهما للمشروع في فيجوال ستوديو، يجب ان يكون موقعهما تحت المشروع مباشرة وليس في داخل أي مجلد، ويمكنك تعريف قالب مختلف لكل مشروع. ملف القالب الخاص بالملفات الرأسية يمكن تعريفه بهذا الشكل (مثال): 1: #ifndef _{ClassDefName}_HEADER_ 2: #define _{ClassDefName}_HEADER_ 3: 4: #include <libheader.h> 5: #include "something1.h" 6: #include "something2.h" 7: 8: class {ClassName} : {BaseName} 9: { 10: public: 11: {ClassName}() 12: { 13: } 14: 15: virtual ~{ClassName}() 16: { 17: } 18: 19: void DoSomething() 20: { 21: } 22: 23: private: 24: bool someFlag; 25: 26: }; 27: 28: #endif اما القالب الخاص بالملفات المصدرية فيبدو هكذا (مثال): 1: #include "{ClassHeader}" 2: 3: {ClassName}::{ClassName}() 4: { 5: } 6: 7: {ClassName}::~{ClassName}() 8: { 9: } 10: 11: void {ClassName}::DoSomething() 12: { 13: if(someFlag) 14: { 15: printf("What do you want me to do?"); 16: } 17: } بعد اضافة القوالب، إن قمت بتشغيل الأداة، سوف يتم استخدام القوالب اوتوماتيكياًَ. حالياً، تدعم التوسعة الثوابت الآتية: {ClassDefName} {ClassName} {BaseName} {ClassHeader} ومن السهل جداً اضافة ثوابت جديدة او تعديل الثوابت الموجودة من داخل كود التوسعة (لكن لا تنسى اعادة بناءها ثم تحديث ملف SourceCreator.dll لديك). وفي النهاية، بعد انشاء الملفات، سوف تقوم الأداة بفتحها في فيجوال ستوديو، فقط لكي تعرف كم انت مدلّل… :) تحميل الكود الكامل مع التوسعة جاهزة للاستخدام (public domain) للتنصيب قم بنسخ الملفين: SourceCreator.Addin و SourceCreator.dll الى المسار الآتي الموجود لديك: My Documents\Visual Studio 2008\Addins عند تشغيل فيجوال ستوديو، ستجد الاداة في قائمة Tools هكذا: إن لم تجدها، فهي غير مفعّلة على الأكثر، لتفعيلها ادخل من Tools واختر Add-in Manager، قم بالتأشير امام التوسعة وإن أردت يمكنك تأشير الخيار Startup ايضاً لكي يتم تحميل التوسعة اوتوماتيكياً عند تشغيل فيجوال ستوديو: إن واجهتك اي مشاكل في الاستخدام، فلا تتردد في طرحها هنا! ملاحظة مهمة: استخدمت فيجوال ستوديو 2008 لإنشاء التوسعة، هل تدعم الاصدارات الاقدم او الاحدث؟ لا علم لي!
Boo Tao Mono 14. يوليو 2010 سلوان الهلالي تطوير (0) بو تاو مونو، ليس هذا اسم مدينة في تايلند ، ولكنه اسم لثلاثة حلول برمجية يمكنها العمل مع بعض لإنشاء منصة تطوير العاب اكثر من رائعة. هذا هو بالضبط ما كنت اقوم به هذا الصباح، اكتشاف ما اذا كانوا متوافقين مع بعض،... لماذا؟ للمتعة! شخص جالس في الخلف: "حسناً يا نبيه، ولماذا المنصة الناتجة اكثر من رائعة؟" لأجيب على هذا السؤال يجب ان نتصور اولاً كيف تبدو منصة تطوير الالعاب المثالية؟ تستخدم لغة برمجة سهلة، قوية، ومختصرة توفّر مجمع نفايات متكامل وسريع (garbage collector) يمكن تنفيذ برامجها مباشرة (كـ native) بدون استخدام اسلوب الترجمة الفورية (not interpreted) يمكنها التعامل مع المكتبات المكتوبة بلغة ++C/C بشكل سريع، يمكن مثلاً توفير دخول مباشر لـ DirectX او OpenGL متعددة المنصات (اي يجب ان تعمل على وندوز، لينوكس، وماكنتوش) مع امكانية توسيعها لتدعم منصات غير الدسكتوب مستقبلاً زمن التشغيل للمنصة صغير نسبياً ولا يحتاج ان يكون مثبت على نظام التشغيل لكي تعمل اللعبة توفر بيئة تطوير متكاملة (IDE) لقد استكشفت عدة تقنيات للوصول للاستنتاج الحالي، اذكر منها: حلول بايثون لزيادة الاداء (مثل psyco و cython)، ولغة D (لغة رائعة!) جميعها كان يفتقد لشيء ما، اقرب منافس كان لغة D. ولكن بعد تجربتي لـ Boo Tao Mono، اصبح كل شيء باهت بالمقارنة... لنبداً مع Boo... Boo هي لغة شبيهه لبايثون لكن مع اختلافات اساسية، كان هدف مصممها الحصول على امكانات واداء #C من دون ازعاجاته مع الاحتفاظ بجوهر بايثون (للتفاصيل يمكنك قراءة هذه الوثيقة)، Boo مصممة لتعمل مع دوت نت ومونو، لذلك فهي تمتلك بشكل اوتوماتيكي مجمع نفايات ممتاز، مكتبات دوت نت الرائعة، وفي حالة استخدام مونو القدرة على العمل على عدة منصات! ولأنها تستخدم دوت نت ومونو، فإن البرامج المكتوبة باستخدامها يتم تنفيذها كـ native بعد مسحة سريعة من مترجم JIT، ولذلك فيمكنها الدخول بشكل شبه مباشر على مكتبات ++C/C! لقد غطت Boo لوحدها معظم نقاط منصة تطوير الالعاب المثالية. والآن، Mono... وهي دوت نت مفتوح المصدر يعمل على جميع المنصات، بكل بساطة. ولكن هنالك ميزة مهمة جداً جداً يمتلكها مونو وغير موجودة في دوت نت... يمكن بدء والتحكم في زمن تشغيل مونو من داخل لعبتك، اي بغض النظر عن امتلاك او عدم امتلاك نظام التشغيل لزمن تشغيل مونو او دوت نت، يمكنك ببساطة القيام بالموضوع بنفسك باستخدام مكتبة ديناميكية خاصة: mono.dll يبقى امامنا جزء واحد لنحل اللغز، المكتبات التي تتيح تطوير الالعاب، اقدم لك Tao Framework، يمكنك ان تتوقف هنا... اطار عمل Tao يدعم دوت نت ومونو، وبالتالي يمكن استخدامه مباشرة عبر Boo.. و Tao لا يقدم واجهة لمكتبة واحدة فقط، بل 11 مكتبة موجهة لتطوير الالعاب... - OpenGL: للرسوميات - OpenAL: للصوتيات - Cg: للمظللات بانواعها - DevIL: لعمليات الصور - FFMpeg: لعمليات الفيديو - FreeType: للخطوط (لا اعلم بعد إن كانت اللغة العربية مدعومة ام لا) - LUA: للنصوص البرمجية - ODE: للفيزياء - PhysFS: لعمليات مستودعات البيانات - SDL: لكل شيء - GLFW و FreeGlut: مكتبات مساعدة لـ OpenGL كل ذلك بدعم كامل لمنصتي وندوز و X11. امر لا يصدّق... عملية التطوير يبدأ التطوير على دوت نت أو مونو، بشكل مستقل عن كل شيء آخر، يمكن استخدام Boo او #C للتطوير، مع Tao Framework (او SlimDX إن كنت تفضّل DirectX). كبيئة تطوير يمكنك استخدام Visual Studio او SharpDevelop (على وندوز) او MonoDevelop بتوسعة Boo (يدعم وندوز، لينوكس، وماكنتوش)، بغض النظر فإن الكود واحد والتشغيل واحد. لعمليات البناء المؤتمتة يمكنك استثمار اداة NAnt (عند الحاجة). ان كنت تحتاج لعمل بعض العمليات في ++C/C يمكنك القيام بذلك بسهولة عن طريق بناء مكتبة ++C/C غير مدارة ثم استخدامها في دوت نت أو مونو باستخدام اي من الطرق المعروفة (Invoking مثلاً). في نهاية المطاف ستصل للعبة الناتجة بشكل ملف تنفيذي (exe)، تأكد من أن الملف التنفيذي يمكن تشغيله بدون مشاكل باستخدام مونو، والاضمن ان تستخدم مونو لبناءه. عملية التشغيل يمكن ذلك عن طريق كتابة تطبيق ++C/C يقوم بتشغيل مونو ثم تشغيل اللعبة داخله، بغض النظر عن توفر مونو في نظام التشغيل المضيف. مونو يقدم مكتبة C (تدعى mono.lib) للقيام بكافة العمليات المرتبطة بزمن تشغيل مونو. مثال ++C لتشغيل ملف تنفيذي مكتوب باستخدام Boo ومبني باستخدام مونو: //////////////////////////////////////////////////////////////// Mono Embedding///////////////////////////////////////////////////////////////#include <cstdio>#include <mono/jit/jit.h>#include <mono/metadata/assembly.h>#pragma comment(lib, "mono.lib")int main(int argc, char* argv[]){ mono_set_dirs("{path_to_mono_lib}", "{path_to_mono_config"); MonoDomain* domain; domain = mono_jit_init("boo_mono_app.exe"); MonoAssembly* assembly; assembly = mono_domain_assembly_open(domain, "boo_mono_app.exe"); if(!assembly) { printf("Assembly opening FAILED!!\n"); } else { printf("Assembly opening SUCCESS!!\n"); } printf("Argc = %d\n", argc); for(int i = 0; i < argc; i++) { printf("Argv [%d] = %s\n", i, argv[i]); } printf("Mono application would really like to say: "); int retval = mono_jit_exec(domain, assembly, argc, argv); printf("\n"); mono_jit_cleanup(domain); printf("Mono out."); getchar(); return 0;} بهذه البساطة! حسناً، ما رأيكم بمثال؟ لنكتب برنامج Boo يستخدم Tao لتشغيل مثال يستخدم OpenGL، ثم نكتب برنامجاً باستخدام ++C يستخدم زمن تشغيل مونو مضمّن (embedded) لتشغيل ذلك المثال. الخطوة 1: انشاء مشروع Boo على SharpDevelop يستخدم Tao Framework. الخطوة 2: الآن لدينا ملف تنفيذي بالاسم HelloTao.exe يستخدم دوت نت و Tao Framework، من الممكن اعادة بناءه باستخدام Mono، ولكن لن نحتاج لذلك لأن HelloTao.exe سيعمل مباشرة على مونو! الخطوة 3: إنشاء مشروع ++C جديد على فجوال ستوديو يقوم بتحميل برنامج HelloTao.exe وتشغيله عن طريق زمن تشغيل Mono، مع توفير مكتبات مونو التي يحتاجها HelloTao.exe. يمكن استخدام نفس كود المثال اعلاه. تم تحقيق الهدف!! (تحميل مشروع BooTaoMono، الحجم: 8 ميغابايت) روابط مهمة: - لغة Boo - زمن تشغيل Mono - اطار عمل Tao - SharpDevelop - MonoDevelop - NAnt (ملاحظة: عدا فجوال ستوديو، جميع الحلول المطروحة حرّة مفتوحة المصدر )
محرك ألعاب إنكيدو 2 22. نوفمبر 2009 سلوان الهلالي إنكيدو2, تطوير, تطوير العاب (2) السلام عليكم، لقد سألني أمس أحد الأصدقاء في الجامعة ماذا أفعل بالضبط؟ لأنه يسمع دائماً أني مشغول ولدي عمل كثير، لم استطع أن أجيبه بشكل مباشر، ولم أعرف كيف أجيب، ماذا كنت أفعل بالضبط خلال السنة الماضية وحتى الآن؟ قبل ما يقارب 8 أشهر، قررت الدخول في مجال تطوير الألعاب المستقلة والألعاب الخفيفة (casual) التجارية، وقد بدأت منذ تلك اللحظة وحتى الآن سباقاً مع الزمن للوصول لأنسب تقنية أستطيع استخدامها لبناء الألعاب مع الاحتفاظ بالمرونة الكافية لتنفيذ الأفكار الغير تقليدية، وقد اعطيت نفسي مهلة تنتهي بعد سنة تقريباً لكي أصدر أول لعبة لي، وهي أعتقد مهلة كافية. في الشهور الأولى، بحثت ونقبت في الانترنت عن محرك ألعاب كامل مجاني يتيح المنتجات التجارية استطيع استخدامه لعمل ألعابي ولكني لم أعثر على ضالتي، جميع المحركات المعروفة إما تكون محركات رسوميات فقط وذلك ليس ما أبحث عنه، أو تكون محركات لا تصل للمستوى المطلوب. ولكن في نفس الوقت، بدأت ببناء المحرك الذي أبحث عنه ولم اعثر عليه، وقد اسميته إطار عمل إنكيدو، وهو محرك موجه لصناعة الألعاب ثنائية الأبعاد، يستند إنكيدو على مكتبة مفتوحة المصدر تسمى ClanLib وهي مكتبة نظام متكاملة موجهة للألعاب ومتعددة المنصات، تتضمن نظام GUI كامل، مكتبة شبكات موجهة للألعاب، مكتبة صوتية، نظام Signal/Slot لتوزيع الأحداث،... وأشياء كثيرة أخرى، وقد شاركني في العمل الصديق العزيز أحمد عز. عندما بدأت العمل كانت مكتبة ClanLib في الإصدارة 0.8 وكان هنالك الإصدارة 0.9 أيضاً ولكنها كانت تجريبية وغير كاملة في وقتها. بعد شهرين من العمل وصل محرك إنكيدو لشكل إعتقدته جيد، أضفت له مزايا مثل إمكانية تحميل الملفات -خاصة ملفات الإكساء- في الخلفية (secondary thread) لكي لا تقاطع سلاسة اللعبة، وهي الميزة التي شكلت أكبر تحدّي لي في تلك الفترة. بعد ذلك وبشكل مفاجئ غير متوقع تم اصدار النسخة 2.0 من مكتبة ClanLib، وقد احتوت على مزايا جميلة مثل الدخول لقواعد البيانات ونظام عرض ثلاثي الأبعاد متكامل مستند على OpenGL ويستخدم مظللات GLSL، وهذه مزايا كنت أخطط إضافتها مستقبلاً، لذلك لم يكن لدي خيار إلا التحويل لـ ClanLib2، وجدت لسوء الحظ إن جزءاً كبيراً من إنكيدو يجب إعادة كتابته، لأن ClanLib2 يختلف كثيراً، كذلك فوجئت عندما اكتشفت أنهم قرروا إلغاء نظام الموارد (Resource System) الذي كان موجوداً في النسخة الأولى والذي يستند عليه نظام إدارة الموارد في إنكيدو، وبالتالي إضطررت لإلغاء نظام إدارة إنكيدو بالكامل أيضاً. بسبب الإعتمادية الكبيرة على ClanLib القديم أصبح إنكيدو فجأة لا يصلح لشيء، في النهاية شطبته بالكامل وقررت إعادة كتابته بطريقة أفضل، احتفظت بالنسخة القديمة واسميت النسخة الجديدة Enkido2. بعد ذلك توقفت عن العمل لما يقارب 4 شهور بسبب الامتحانات وبسبب إنضمامي لشركة TimeLine Interactive كمبرمج ألعاب متدرب في فترة الصيف. عندما إنتهت فترة التدريب، عدت للعمل بقوة على Enkido2، حتى وصلت بحمد الله إلى الإصدارة التجريبية 0.2، المزايا الموجودة الآن في المحرك يمكن تلخيصها كالآتي: تتألف الألعاب في Enkido2 من عالم اللعبة (World) وهو يدير كل شيء، عدد من المشاهد (Scenes)، وعدد كبير من عناصر اللعبة (Entities) سواء كانت مرئية أو غير مرئية، والتي تشكّل المشاهد. إمكانية تبادل المعلومات بين جميع الأجزاء عن طريق الرسائل. دعم العمق (Z-index) أثناء الرسم ويقوم جزء خاص من المحرك بعملية ترتيب العناصر حسب عمقها لكي ترسم بشكل صحيح، إحدى المحدوديات التي لم أستطع تلافيها أن كل عنصر يستطيع الرسم لعمق واحد فقط، لا يمكن مثلاً رسم الجسم وظله كل في عمق مختلف من قبل عنصر لعبة واحد. بنك المعلومات (InfoBank) ويمكن استخدامه لحفظ أي بيانات يجب أن تتوفر بشكل Global لجميع الأجزاء. نظام لقياس الأداء التفصيلي (Profiler) مدمج ضمن المحرك. يستخدم المحرك ملفات إعدادات (configurations) تعتمد XML. نظام لتسجيل وتوزيع أحداث الإدخال (Input Events) حالياً يقدم دعم للوحة المفاتيح فقط، يتم تسجيل الأحداث فيه عن طريق ملفات XML الخاصة بالإدخال. نظام مؤقت للتعرف على التصادم بين أجزاء اللعبة يدعم التصادم باستخدام الصندوق المحيطي وتعريف مجموعات تصادم مختلفة. نظام بسيط لآلات الحالة State Machines يمكن إضافتها لأي عنصر. المشكلة التي أعتقد أنها تواجه جميع المطوّرين الذين يعملون لفترة طويلة على مشروع كهذا أنهم يكتشفون بعد عدة شهور طرق أفضل لكتابة بعض الأجزاء التي تمت كتابتها في البداية، وقد واجهت عدة مرات هذه المشكلة وفي احدى المرات أعدت كتابة المحرك بكامله، وانا لا زلت اواجهها الآن، لا أعرف كيف أتعامل مع هذه الرغبة التي تدفعني لإعادة كتابة جزء ما بطريقة أفضل خاصة وأن ذلك يعني إعادة كتابة عدة أجزاء تعتمد عليه أو حتى إلغاء أجزاء بالكامل، هكذا لن أنتهي من هذا المحرك للأبد، وانا فعلاً في حيرة، ماذا كنتم لتفعلوا إن كنتم مكاني؟ نصائحكم؟ بالنسبة لـ Enkido2، قررت بناء المحرك عن طريق التطبيق، كيف ذلك؟ ما أقوم به هو عمل فكرة للعبة بسيطة جداً تستخدم مكونات محددة من المحرك هي قيد التطوير حالياً، وأمشي في تطوير المحرك بموازاة تطوير اللعبة، بحيث أكتشف أحياناً مشاكل عملية في تصميم أجزاء المحرك من المستحيل التعرّف عليها لو تم بناء المحرك بشكل مستقل، وجدت أن هذه الفكرة ممتازة، وأنصح بها شخصياً لمن يطور محركه الخاص لأهداف عملية لأول مرة، المشكلة الوحيدة التي لم أحلها هي أن بعد عدة ألعاب سوف تكون هنالك أجزاء كثيرة تغيرت من المحرك ويكون هنالك احتمال كبير أن الألعاب التي تم عملها في السابق لن تعمل الآن إلا بإعادة كتابتها، وإعادة الكتابة قد تأخذ وقتاً طويلاً. بالنسبة للإصدار 0.2 من المحرك، كان التركيز على أساسيات المحرك نفسه، وقد انشأت لعبة صغيرة أسميتها TopDown Shooter (ليس أفضل إسم جئت به بالتأكيد )، يمكنكم تجربة اللعبة (وإعلامي بأي مشاكل تلاحظوها إن لم يكن في ذلك مانع): TopDown Shooter (الحجم: 3 MB) موسيقى البداية هي أحد مقاطع موسيقى Metal Gear والمسماة "Old Snake"، وقد أضفتها لتجربة تشغيل الموسيقى بطريقة Streaming، تشغيل الصوت يتم في مسار تنفيذ ثانوي (secondary thread). الإدخال: مفاتيح الأسهم لتحريك الدبابة. مفتاح المسافة أو مفتاح الإدخال لبدء اللعبة أو تجاوز الشاشات مثل المقدمة. مفتاح المسافة لإطلاق النار. مفتاح `p` لعمل pause للعبة. مفتاح Escape في أي وقت للخروج من اللعبة. للحصول على نقاط إضافية ثمينة يمكنك محاولة إسقاط الصواريخ باستخدام المدفع. صورة من اللعبة: بالمناسبة لعلكم لاحظتم الاسم (RedHawk Interactive) في البداية وهو فقط اسم مؤقت، لدي اسم أفضل بدأت باعتماده مؤخراً. ماذا بعد؟ سؤال محيّر دائماً. هدفي الآن الوصول للإصدارة 0.3 من المحرك وأثناء ذلك تطوير لعبة صغيرة جديدة سأطرحها أيضاً للتجربة عندما تكتمل، الإصدارة الجديدة سوف تشهد إضافة ما يلي للمحرك: استبدال نظام التصادم البسيط الموجود حالياً بمحرك فيزياء ثنائية الأبعاد كامل، سوف استخدم Box2D لهذا الهدف. هنالك مشكلة في ClanLib2 وهي أنه يقدم نظام إحداثيات يعتمد على إحداثيات النافذة، أي إن كانت النافذة 800x600 سوف تكون إحداثيات ClanLib للرسم 800x600 أيضاً، ما أود الوصول إليه هو تثبيت الإحداثيات بغض النظر عن إحداثيات النافذة، كما أن محرك الفيزياء يحتاج إحداثياته الخاصة والتي يجب أن لا تتجاوز 100 وحدة للطول او العرض (للحصول على أفضل دقة لـ Box2D في التعرّف على التصادم والحسابات الفيزيائية يجب ان تكون أبعاد الأجسام من 10 وحدات إلى 0.1 وحدة)، لذلك سوف استخدم نظام احداثيات موحّد غريب قليلاً، مثلاً 100x100 مشترك بين إنكيدو و Box2D، لا زلت أفكر بطريقة لحل هذه المشكلة وأرحب بأي اقتراحات. إنشاء نظام الكاميرا والتي تستطيع الحركة بأربعة اتجاهات إضافة إلى عمل zoom in/out، ترتبط الكاميرا إرتباطاً كبيراً بما أتوصل إليه في ما يخص محرك الفيزياء والإحداثيات الموحدة. تحسين قابلية الاتصال بين عناصر اللعبة المختلفة عن طريق إضافة إمكانية امتلاك عناصر اللعبة لأسماء وسم (tags)، ويمكن كذلك إعطاء العنصر إسماً يشير لطبيعته (names)، مثلاً العنصر الذي يمثل اللاعب سوف يحمل الاسم "Player". أيضاً إضافة إمكانية الاستعلام عن العناصر بالاسم أو الوسم عن طريق المشهد الحالي. أحد المتطلبات التي اكتشفتها خلال تطوير TopDown Shooter الحاجة للربط بين عنصري لعبة بحيث يعتمد أحدهما على الآخر، إن تم تدمير عنصر معين يتم تدمير جميع العناصر التي تعتمد عليه، ينطبق هذا الكلام على الطائرة وظلها مثلاً، الظل يعتمد على وجود الطائرة ويجب تدميره عند تدمير الطائرة، في TopDown Shooter الطائرة وظلها يرسمهما عنصر واحد (أي في نفس العمق) ولكن ذلك لم يسبب أي مشاكل مرئية ملحوظة بسبب بساطة اللعبة. نظام إدارة اصوات للعبة: هنالك مشكلة عملية أيضاً وهي عند تشغيل المؤثرات الصوتية مرة واحدة (fire and forget) واثناء ذلك قام اللاعب بعمل pause، يجب عمل pause لجميع المؤثرات الصوتية التي تعمل في تلك اللحظة، لا يحصل هذا الآن، نظام إدارة (أو قل تشغيل) الأصوات يقدم مقابس للمؤثرات الصوتية بعدد محدود (sound banks) ويتولى عملية أيقاف وتشغيل المؤثرات الصوتية والموسيقى عند عمل pause للمشاهد. بالطبع لدي فكرة للعبة الصغيرة التالية، وقد قام صديقي الفنان عاصف برسم بعض الشخصيات التي ستدخل في اللعبة التالية: شكراً عاصف ما مستقبل إنكيدو 2؟ لم أتكلم حتى الآن عن إمكانية إصدار المحرك في يوم ما للعامّة، هنالك إمكانية بالطبع ولكن ليس الآن وهو لا زال في المراحل الأولى ويتغير باستمرار. من المزايا التي انا عازم على إضافتها: نظام موارد متكامل يستطيع التحميل من ملفات مضغوطة (قد تكون مشفّرة) مع تقديم طريقة لتحميل موارد المشاهد قبل تشغيل المشهد مع إظهار progress bar وما إلى ذلك، قد يستخدم نظام الموارد قاعدة بيانات فعلية لمتابعة كل شيء. برنامج Project Editor: يستطيع تعديل وإنشاء أجزاء كثيرة من اللعبة مثل إنشاء الأشباح (sprites) ومعلوماتها الفيزيائية، الخطوط، رزم الموارد، كتابة نصوص إعداد اللعبة، عمل build لكل شيء، كتابة وتعديل النصوص البرمجية للعبة، ...الخ أود أن أنقل كتابة اللعبة نفسها من كود ++C إلى نصوص برمجية ينفذها المحرك لتسريع وتسهيل عملية تطوير الألعاب، سوف استخدم مكتبة Mono الرائعة لإنشاء نظام النصوص البرمجية وتنفيذها بطريقة JIT للترجمة، بسبب ذلك فالأداء سيكون مقارب من أداء ++C ويمكن كذلك كتابة النصوص بأي لغة برمجية تدعم CLI، مثل #C، فجوال بيسك، أو Python، لقد شغلت هذه الميزة فعلاً للتجربة خارج إنكيدو حالياً، وانا عازم على إعتماد لغة Boo (وهي نكهة من Python مع دعم لـ static typing و generators ومزايا أخرى لطيفة). دعم لأنظمة الجزيئات (particle systems) وامكانية كتابة نصوص XML لتعريف تلك الأنظمة باستخدام Project Editor. نظامان للإظهار. القياسي يستخدم المظللات (shader driven)، اما في حالة عدم إمكانية العتاد التعامل مع المظللات، يمكن استخدام نظام الإظهار الثانوي والذي يعتمد ممر الرسوميات الثابت (Fixed Function Pipeline). النظامان يستخدمان OpenGL. كما ترون المشروع ضخم رغم كونه محرك ألعاب ثنائية الأبعاد فقط، الهدف منه الوصول لمحرك يمكن استخدامه لإنشاء ألعاب 2D ذات جودة عالية بأقصر وأسهل طريقة ممكنة، عندما استطيع تطوير لعبة كاملة من البداية للنهاية خلال شهر أو إثنين، أكون قد حققت الهدف المراد من تطوير المحرك. ... وها انا بدلاً من العمل على إضافة محرك الفيزياء لإنكيدو 2، أكتب قصة حياتي، عد إلى العمل! *يصفع نفسه عدة مرات عقاباً*