مدونة سلوان الهلالي
تطوير ألعاب - برمجة - علم نفس

قائمة الصفحات

آخر التدوينات

آخر التعليقات

ملخص التعليقات
يوم المصادر المفتوحة للتعليم 2011
التوقيت 21 أيار 2011 03:27 ص بقلم الكاتب سلوان الهلالي

وهو مؤتمر يعد الاول من نوعه في المنطقة هدفه تقديم البرامج الحرة ذات المصادر المفتوحة (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)





عندما كانت لنا ثقافة...
التوقيت 17 كانون الأول 2010 03:10 م بقلم الكاتب سلوان الهلالي

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

وانا جالس اتفرج على اخي الصغير وهو يشاهد الكارتون المفضّل لديه على ام بي سي 3، وهو Ben 10، لم استطع مقاومة عقد مقارنة بين الماضي والحاضر في برامج الأطفال.

 

لنرى مثلاً أغنية الشارة لكرتون Ben 10:

 

في Ben 10، لا يبدو ان المهم هو ما تقوله كلمات الاغنية! ولكن فقط مدى تشابه اللحن للكرتون الانجليزي الاصلي، كلمات الاغنية ليست إلا حشو لا معنى له ولا هدف...

 

ولنقارنها بأغنية الشارة لكرتون حكايات عالمية (احد كرتوناتي المفضلة عندما كنت صغيراً):

 

 

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

 

"من كل بلاد الدنيا... من كل بقاع الأرض... قصص شتى... تروى حتى... نعرف أحوال الانسان... والكل هنا جيران"

 

اما عن اللغة نفسها، فقد كانت تحتل مكانة مميزة بين برامج الأطفال، مثلاً شاهد هذين المقطعين من برنامج المناهل الرائع:

 

 

 

من الملفت للنظر طريقة التمثيل الممتازة لطاقم الممثلين بأكمله! وكذلك مراعاة اللفظ العربي الصحيح دائماً.

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

لماذا لا تنتج برامج من هذا النوع وبهذه الجودة المدروسة هذه الايام؟ تبدو قنواتنا فارغة تماماً بالمقارنة....

 

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

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

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

 

 

كما ترى الافكار التي تم شرحها لا تعتبر بسيطة ابداً....

وهذا مثال لطريقة الشرح من نفس القصة:

 

 

 

هل لاحظت دقة وجودة الترجمة؟ وهذا علم الفلك وليس بالموضوع الهين، اصعب من البرمجة وبرمجة الالعاب مجتمعين من ناحية الترجمة..

وهل تلاحظ كيفية تجنب طباعة كلمة إنجليزية واحدة؟ ولا حتى واحدة، ومع ذلك تم ايصال الفكرة بالكامل.

تصوّر لو إن مطبوعات بهذه الجودة وبهذا المستوى من المعلومات العلمية قد حلت محل "كتب" رسائل الموبايل وقراءة الكف ونظريات المؤامرة، كيف سيكون جيل الشباب الذي ينبثق من هكذا مجتمع؟

اعتقد اننا وصلنا لمرحلة رائعة من التقدّم الثقافي في نقطة ما خلال الثمانينيات وبداية التسعينيات ولم يكن التقدم معتمداً على اللغة الانجليزية ولكن على العربية الصحيحة....

...

لسبب ما انهار كل شيء قبل أن نصل لمرحلة التغيير الاجتماعي الجذري، وعدنا للصفر (أو أقل من ذلك).

 

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





التشتت في حياة المطوّرين: الحل!
التوقيت 28 تشرين الثاني 2010 03:25 ص بقلم الكاتب سلوان الهلالي

من اصعب المسائل التي يجب ان يتعامل معها كل مطوّر هي الالتزام بالمشاريع لغاية اكتمالها، تتضاعف الصعوبة كثيراً عندما تكون المشاريع شخصية، لقد وقعت شخصياً في هذا الفخ لعدة سنوات! عشرات المشاريع التي لم ترى ضوء النهار تجدها متناثرة في كل مكان. لكي نكتشف كيف ولماذا يحصل ذلك، سوف احاول تلخيص ما يحصل بشكل سريع:

 

  1. انت جالس في مكانك امام الكومبيوتر من المفترض انك تعمل ولكنك لا تقوم بأي شيء محدد، فجأة تأتيك هذه الفكرة الرائعة! سواء قرأتها في مكان ما من الشبكة او وردتك بطريقة التخاطر، المهم انها تبدو لوهلة كأفضل فكرة في العالم.
  2. تبدأ شيئاً فشيء ببناء الفكرة الوردية في عقلك، يا إلهي كيف ستبدو رائعة! قد تكون افضل فكرة خطرت لك، يتصاعد هنا مستوى الحماس وفي لحظة تشعر بأن هذه الفكرة هي الجواب! (حتى وإن لم يكن هنالك سؤال فغلي).
  3. تشغل بيئة التطوير وتبدأ بالتخطيط والتعمق بشكل سطحي في ما تحتاجه للبدء.
  4. تكتب اول اسطر الكود، ياله من شعور رائع! لا زلت تسير على وقود الحماسه التي اكتسبتها.
  5. تحاول ان تجعل كل شيء بأكمل وجه ممكن، حتى وإن كنت تدرك من دون اي شك إن الكمال مستحيل على البشر، لكنك تتأمل خيراً.
  6. بعد فترة ما، تكون قد قمت بتصميم النافذة الرئيسية او المقدمة للعبة، ووضعت اسمك في المقدمة مع موسيقى خلابة، تبدأ مرحلة العمل الحقيقي التي لم تحسب لها حساباً بالدخول، ويرمي الكمال الذي تحاول المحافظة عليه نفسه خارج الشباك، فجأة تحس وكأن هنالك عوائق ضد رؤيتك الرائعة، وبالنتيجة تبدأ الفكرة شيئاً فشيء بفقدان بريقها، المسألة الآن مسألة وقت ليس إلا.
  7. بمجرد وصولك للسؤال: “ماذا يجب ان افعل الآن؟” او “What’s next” وعدم توفر اي دليل في تصاميمك الاولية حول المرحلة الجديدة التي وصلتها، حتى وإن كان هنالك 100 مهمة يمكنك ان تختار اي منها! حقيقة انك لم تحدد اي من هذه الـ 100 مهمة بأي طريقة مقدماً تضعك في حيرة عجيبة، وكأنك في حلقة مفرغة.
  8. اين ذهب الحماس الآن؟ والاحساس بالسعادة؟ تبحث عنه… ليس موجوداً في اي مكان… اصبح المشروع مملاً إذاً! ولكني مع ذلك سأحاول ان اكمله بطريقة ما…
  9. يتعلق برقبتك الاحساس بالذنب وكأنما تدين للمشروع بتفسير حول ما يحصل.
  10. في اليوم التالي، لديك مهام افضل، وهنالك اشياء ممتعة اكثر… لنؤجل العمل على المشروع ليوم آخر.
  11. كرر من النقطة 1  (المشروع الرائع الجديد في الطريق!)

 

فعلاً هذا ما كان يحصل معي بالضبط، وانا متأكد ان نفس الكلام يحصل مع كل مطوّر في مرحلة ما من صياعته العملية… اقصد حياته.

السؤال المهم الآن، لماذا تتكرر نفس الخطوات تماماً؟ مرة ومرتان وثلاث مرات، حتى تصبح طريقة حياة.

لنكتشف ذلك سوف اقدم لكم مبدئاً من علم النفس يمكن ان يساعدنا في التحليل واكتشاف الحل، تحديداً من البرمجة اللغوية العصبية (Neuro-Linguistic Programming)، والتي طورت لها حباً وولعاً كبير ينافس ولعي بالبرمجة…

المبدأ يدعى اللولب الحلزوني (spiral)، هنالك نوعان من هذا اللولب، اللولب الصاعد (upward spiral)، واللولب النازل (downward spiral).

 

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

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

والأسوأ من ذلك ان اللولب النازل سوف ينتقل ليصيب اوجه اخرى من حياتك، جميعها ستساهم في تضييق اللولب…

هل انت الآن في لولب نازل في حياتك؟ سواء عملياً او اجتماعياً او في اي من عناصر الحياة المختلفة؟

إذاً ….

توقف الآن!

 

هل توقفت؟ حسناً، حان الوقت للتغيير، حان الوقت للتوجه بالاتجاه الصحيح. يجب ان تعكس اللولب ليكون لولباً صاعداً.

 

في اللولب الصاعد، تبدأ اولاً بأهم خطوة، وهي تحديد اهدافك بالضبط. لا تدع اي شيء للصدفة..

بعد ذلك يجب ان تقوم بتحدد كيف ستكافئ نفسك عندما تحقق تلك الاهداف، واجعلها مكافئة رائعة وقيّمة فعلاً بالنسبة لك.

وكذلك كيف ستعاقب نفسك إن فشلت بسبب التكاسل المباشر عن بذل الجهد، وعندما اقول ان تعاقب نفسك، لا اقصد الأذى ابداً، ولكن ان تؤنب نفسك بطريقة بنّائة مثلاً، او ان تحرم نفسك من شيء تستمتع به، وسوف اعطي امثلة بعد قليل…

المهم ان تصل لفكرة ان تكافئ نفسك على الشيء الصحيح الذي يساعدك في تحقيق اهدافك، وتعاقب نفسك إن كانت السبب في عدم تحقيقها.

في البداية، قد تتلكأ العملية وتواجه بعض المصاعب، ولكن بالجهد الكافي ستبدأ بالانتقال للّولب الصاعد، وسوف تلاحظ الحلقة وهي تتوسع وتتوسع أكثر، وتبدأ بالاحساس بأنك ترتفع أكثر فأكثر، حتى يصبح هذا السلوك جزءاً منك، ونعم سوف ينتقل ليصيب كل اوجه حياتك بالايجابية والعمل الجاد!

 

والآن، لتطبيقه في حالتنا الخاصة، تطوير المشاريع البرمجية، هل تتذكر استراتيجية اللولب النازل فوق؟ ما سنفعله تقريباً هو عكس الخطوات…

 

  1. في البداية يجب ان تكون لديك فكرة مشروع معينة، برنامج او لعبة او ما شابه، حتى وإن كانت فكرة عامة.
  2. إجلس مع نفسك او مع فريقك وحدّد حدود المشروع بالضبط، مثلاً إن كان المشروع لبرنامج حدد بالضبط ماذا يجب على البرنامج ان يعمله وماذا يقع خارج نطاقه. وكميزة إضافية عندما تضع حدوداً واضحة للمشروع تتزايد قدرتك على الابداع!
  3. قسّم المشروع لعدة مراحل في كل مرحلة ستعمل على هدف محدد ولا شيء غيره. يجب ان يكون لديك الآن خطة جيدة للعمل، ونظرة شاملة لمدى المشروع وحجمه.
  4. حدّد ماذا ستكافئ نفسك عندما تنهي كل مرحلة من مراحل المشروع بنجاح، على سبيل المثال يمكنك ان تعزم نفسك على عشاء في مطعم يعجبك، ان تذهب لحفلة موسيقية او لمدينة الملاهي، ان تزور مجموعة اصدقاء من الممتع ان تقضي وقتك معهم، يمكنك هنا ان تربط بين اهداف حياتك الاخرى واهدافك العملية من المشروع!
    و من المفيد ان تقول لنفسك شيئاً يشبه الكلمات الآتية:
    • إن نجح المشروع، اكون قد استثمرت وقتي بأكمل وجه!
    • إن نجح المشروع، اكون قد اضفت مشروعاً ناجحاً لتاريخي البرمجي!
    • إن نجح المشروع، اكون قد اضفت خبرة جيدة جداً ستفيدني في مشاريعي المستقبلية.
    • إن نجح المشروع، سوف اشعر بالسعادة والفخر
    • إن نجح المشروع، سوف استمتع بكل تلك المكافئات الرائعة التي وعدت بها نفسي
  5. حدّد بماذا ستعاقب نفسك إن فشلت في تحقيق الاهداف، لكل شخص خياراته الخاصة هنا، إن كنت تحب ان تلعب لعبة معينة، إمنع نفسك منها لفترة محددة. أو إن كنت تتابع مسلسلاً ما بشغف، عاقب نفسك بعدم مشاهدة عدة حلقات منه، يمكنك حتى ان تجبر نفسك على سماع الموسيقى التي تكرهها بدل الموسيقى التي تعجبك لعدة ايام (قد يكون هذا اقسى عقاب هههههههه)، ولكن من المهم جداً ان لا يؤثر العقاب على حياتك العملية او الاجتماعية ابداً بل يمكنك حتى ان تأتي بعقاب يساعدك في تحقيق اهدافك في وجه اخر من اوجه الحياة. 
    ويمكنك ببساطة ان تقول لنفسك الكلمات الآتية:
    • إن فشل المشروع، اكون قد ضيعت وقتي الثمين بدل ان استثمره.
    • إن فشل المشروع، اكون قد اضفت مشروعاً فاشل لتاريخي البرمجي.
    • إن فشل المشروع، اكون قد ضيعت على نفسي فرحة إكمال المشروع والفخر بإنجازي.
    • إن فشل المشروع، أكون قد ضيعت على نفسي فرصة الاستمتاع بالمكافئات الرائعة التي اخطط لها.
  6. هل انت مستعد لهذه الرحلة الرائعة؟ هل انت مستعد للمكافئات الجميلة التي ستحصل عليها؟ إذاً حان وقت البدء بالمشروع الآن! بالتوفيق… ضحك

 

سوف ازودك بالاضافة لذلك بطريقة طورتها بشكل تدريجي، اصبحت شيئاً لا يمكنني التخلي عنه اثناء العمل، اسميتها قائمة المهام (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.

والنتيجة في نفس اليوم:

lario intro

 

الختام

اتمنى ان تكون قد استمتعت بهذه الرحلة الصغيرة داخل عقل المطوّرين، لا تتردد في طرح اي تعليق او تساؤل هنا ولنفتح باب النقاش بخصوص الموضوع.

لا تنسى ان ترسل لي نسخة من لعبتك مجاناً طبعاً بمجرد ان تنهيها لسان خارج





توسعة فيجوال ستوديو: SourceCreator
التوقيت 15 تشرين الأول 2010 03:18 ص بقلم الكاتب سلوان الهلالي

لو سألت اي مبرمج سي++ ما هو اكبر نشاط مضيع للوقت عند العمل على مشاريع سي++؟

بالنسبة لي فهو انشاء ملفات الكود المصدرية والرأسية باستمرار لكل صنف، ثم كتابة الهيكل الرئيسي للصنف في الملف الرأسي، ثم ملئ الملف المصدري،… بعد عدة اصناف يصبح الموضوع غير جميل ابداً.. تصوروا عمل نفس الخطوات تماماً كل مرة لـ 50 صنف، الكثير من الجهد الضائع.

 

خلال السنوات الاخبرة عملت على عدة لغات برمجة عالية المستوى لا تعاني هذه المشكلة ابداً، لأنها مصممة بطريقة تختصر الموضوع، بالاضافة الى وجود ادوات مساعدة.

اعتقد ان سي++ هي اللغة الوحيدة التي لا زالت كما هي تقريباً في هذه النقطة بالذات منذ سنوات.

 

الآن، انا احاول العودة لسي++ بعد فترة من عدم الاستخدام، وأجد نفسي في مواجهة نفس المشكلة القديمة.. حسناًـ حان وقت التعامل معها…

 

ماذا احتاج لكي اجعل الموضوع اسهل؟

احتاج لأداة تستطيع انشاء ملفات الاصناف بشكل اوتوماتيكي، ثم ملئها بكود موحّد لتعريف الصنف، ثم اضافتها للمشروع في فيجوال ستوديو.

فيجوال ستوديو يأتي مع قدرة ممتازة للتخصيص، وابسط طريقة لانشاء ادوات عملية هي عن طريق الماكروات (Macros) (لا علاقة لها بماكروات سي)، حيث يأتي مدمجاً مع فيجوال ستوديو بيئة تطوير كاملة خاصة بالماكرو، كذلك يمكن تسجيل نشاط معين في ماكرو بشكل اوتوماتيكي (يمكن الدخول لكل ادوات الماكرو عن طريق Tools –> Macros).

 

القيت نظرة سريعة على الماكروات، ولكن لم يعجبني الامر، اولاً لأن اللغة المستخدمة هي لغة بيسك وثانياً، يبدو ان الماكرو مخصص للمهام البسيطة ولكن قد يكون ذلك هو انطباعي لأن الامثلة المقدمة بسيطة جداً كما أني لم اعمل على لغة بيسك منذ سنة 2005.

 

لذلك انتقلت للطريقة الاخرى، وهي اكثر قوة بالتأكيد، انشاء التوسعات (Add-ins) باستخدام فيجوال ستوديو (عند انشاء مشروع جديد اختر Visual Studio Add-in من Extensibility)، اول ميزة لهذه الطريقة هي امكانية كتابة التوسعات باستخدام اي لغة برمجة مدعومة، اخترت سي شارب.

المزايا الاخرى هي امكانية بناء نوافذ Windows Forms اعتيادية وكأنك تعمل على تطبيق عادي، وكذلك يمكن فحص عمل التوسعة وحتى عمل Debugging من داخل فيجوال ستوديو، حيث يقوم فيجوال ستوديو بتشغيل فيجوال ستوديو آخر لكي تجرب فيه التوسعة!

 

بعد عدة ساعات من العمل، وصلت للتوسعة بشكلها الحالي، وقد حققت ما اريد تماماً، يبقى معرفة ما اذا كانت هكذا اداة ستساعد فعلاً بشكل عملي...

 

يمكن تشغيل الأداة من قائمة Tools لفيجوال ستوديو وهي تحمل الاسم Source Creator، يجب ان يكون هنالك مشروع سي++ مفتوح فعلاً لكي تعمل، ستظهر النافذة الآتية لحظة التشغيل:

 

 Source CreatorWindow

 

يمكنك ان تحدد المشروع إن كان هنالك اكثر من مشروع مفتوح من حقل 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 هكذا:

 

Source Creator

إن لم تجدها، فهي غير مفعّلة على الأكثر، لتفعيلها ادخل من Tools واختر Add-in Manager، قم بالتأشير امام التوسعة وإن أردت يمكنك تأشير الخيار Startup ايضاً لكي يتم تحميل التوسعة اوتوماتيكياً عند تشغيل فيجوال ستوديو:

Add-in Manager

 

إن واجهتك اي مشاكل في الاستخدام، فلا تتردد في طرحها هنا!

 

ملاحظة مهمة: استخدمت فيجوال ستوديو 2008 لإنشاء التوسعة، هل تدعم الاصدارات الاقدم او الاحدث؟ لا علم لي!





كيف تعثر على تخصصك المفضل؟
التوقيت 25 أيلول 2010 02:08 م بقلم الكاتب سلوان الهلالي

احدى اكثر الأسئلة حيرة بالنسبة لي هو: لو عملت على لعبة كبيرة وترك لي قرار اختيار اي جزء من اللعبة سأكون مسؤولاً عنه، فهل سأستطيع ان اتوصل لقرار؟ ماذا لو سُئلت انت؟ هل تستطيع الاختيار؟

 

لا اخفي انني لا امتلك تخصصاً محدداً حتى الآن في تطوير الالعاب، وصدقوني هنالك الكثييـ....ـييير من التخصصات الممكنة، لكل منها عالم لوحده.

حتى الآن اتبعت مبدأ Jack of all trades master of none، وقد يكون لذلك فوائد كبيرة في زيادة المعلومات وكذلك القدرة على العمل على المشاريع بشكل فردي، ولكن يجب عاجلاً ام آجلاً اختيار تخصص واحد فقط (كبداية) والتعمق فيه محاولاً الوصول للقاع في يوم ما... وقد يمكن في يوم من الايام ان آتي بطرق وتقنيات جديدة غير موجودة في ذلك التخصص...

ولكن اي واحد؟

 

قمت بتجربة تمرين صغير اليوم في محاولة للتوصل لجواب ما.

 

أكتب قائمة بأفضل 5 العاب لعبتها في حياتك، لا تهتم للترتيب.

لو كنت تستطيع اختيار ثلاثة اجزاء من كل لعبة لكي تعمل عليها، فأي أجزاء ستكون؟

 

بالنسبة لي، الوضع يبدو هكذا:

 

Shenmue I

  1. نظام الأحداث (تحديداً triggers وتتابع القصة)
  2. سوق Dobuita (الليل والنهار، الناس والمتاجر)
  3. حركة الشخصيات

 

Metal Gear Solid 3

  1. المعارك مع القادة (boss fights)
  2. الذكاء الصناعي للحراس (من لا يتمنى العمل على ذلك؟ ضحك)
  3. نظام الاشتباك (CQC)

 

Tomb Raider

  1. حركة لارا كروفت
  2. الاحداث السريعة المتتابعة
  3. الألغاز

 

Half Life 2

  1. الفيزياء ودورها في اللعبة
  2. الإظهار
  3. المركبة الآلية التي تشبه العنكبوت! (هل كان اسمه Walker؟)

Indigo Prophecy/Fahrenheit

  1. نظام الاحداث
  2. حركة الشخصيات
  3. الإظهار

يبدو اني اميل الى حركة الشخصيات وكل ما تعلق بها... وعندما أفكر في الموضوع، يبدو الامر منطقياً!

حيث مقالي في مسابقة المقالات التي اقامتها الشبكة العربية كان حول حركة الشخصيات، اما الالعاب التي تعجبني اكثر من غيرها فهي التي تكون فيها الشخصيات فريدة ومتكاملة وتساهم في القصة بشكل مباشر، كما اني كنت دائم الاهتمام بقضية تحريك الشخصيات في برامج التصميم وتصدير واستيراد الشخصية مع حركاتها.

يبدو اني قد عثرت على تخصصي للتو... ضحك

 

ماذا عنكم؟ ابتسامة

 





Boo Tao Mono
التوقيت 14 تموز 2010 04:08 م بقلم الكاتب سلوان الهلالي

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

هذا هو بالضبط ما كنت اقوم به هذا الصباح، اكتشاف ما اذا كانوا متوافقين مع بعض،... لماذا؟ للمتعة!

 

شخص جالس في الخلف: "حسناً يا نبيه، ولماذا المنصة الناتجة اكثر من رائعة؟"

 

لأجيب على هذا السؤال يجب ان نتصور اولاً كيف تبدو منصة تطوير الالعاب المثالية؟

  • تستخدم لغة برمجة سهلة، قوية، ومختصرة
  • توفّر مجمع نفايات متكامل وسريع (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 01:28 م بقلم الكاتب سلوان الهلالي

السلام عليكم،

 

لقد سألني أمس أحد الأصدقاء في الجامعة ماذا أفعل بالضبط؟ لأنه يسمع دائماً أني مشغول ولدي عمل كثير، لم استطع أن أجيبه بشكل مباشر، ولم أعرف كيف أجيب، ماذا كنت أفعل بالضبط خلال السنة الماضية وحتى الآن؟

 

قبل ما يقارب 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، أكتب قصة حياتي، عد إلى العمل! *يصفع نفسه عدة مرات عقاباً*

 





كرنفال المطوّرين المستقلين: UDK
التوقيت 19 تشرين الثاني 2009 08:43 ص بقلم الكاتب سلوان الهلالي

من أشهر محركات الألعاب اليوم هو محرك Unreal Engine، هو بلا منازع أكثر محركات الألعاب استخداماً حتى الآن، خاصة إصدارته الثالثة والتي تم استخدامها لتطوير Batman Arkham Asylum و  Mirror's Edge و Gears of War وآخرين، ما أروع الحصول على نفس الأدوات التي تم استخدامها لتطوير هكذا ألعاب؟

في مفاجأة رائعة فجرّتها شركة Epic قبل أسابيع، تم طرح طقم تطوير Unreal والمسمى UDK اختصاراً، والمذهل في الموضوع إنه نفسه محرك Unreal Engine 3 ولا وجود لأي محدودية مفروضة على إمكانياته على حد علمي، يتضمن UDK كذلك مجموعة من التقنيات التجارية مثل FaceFX و SpeedTree والمضمنّة مع المحرك لكي تستخدمها مجاناً! (اتفاق بين Epic والشركات المسؤولة عن تلك التقنيات)

هل بدأ لعابك يسيل؟ لقد بدئنا للتو..

 

 

Unreal Development Kit

 

UDK هو Unreal Engine 3 نفسه، إطار العمل الاحترافي المتكامل والذي يضم عدداً كبيراً من الأدوات التي تمكنّك من تطوير ألعاب عظيمة، إنشاء عوالم افتراضية، أو تطوير برامج محاكاة واقعية. تم تطويره من قبل شركة Epic Games بقيادة Tim Sweeny مؤسس الشركة، أول ظهور لـ Unreal Engine كان سنة 1998 في ثاني لعبة ناجحة للشركة والتي سميت Unreal، أصبح Unreal Engine في السنوات اللاحقة أساساً للكثير من الألعاب ذات الجودة العالية.

آخر جيل من المحرك هو الجيل الثالث، من الألعاب التي استخدمته:

  • Unreal Tournament 2007
  • Gears of War
  • Bioshock
  • Mirror's Edge
  • Batman Arkham Asylum
  • Mass Effect
  • وغيرها كثير

نواة المحرك مكتوبة بلغة ++C ويقدم محرك Unreal Engine 3 الكامل دعماً لجميع المنصات الأساسية مثل Windows، Linux، MacOS X، XBOX360، Playstation3 ودعم لـ DirectX9، DirectX10، OpenGL حسب المنصة، أما UDK فبالطبع يقتصر دعمه على Windows فقط، وكذلك فإن كود ++C للمحرك غير مقدّم مع UDK.

 

التطوير

 

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

 

محرّر Unreal

 

الأداة الرئيسية التي يعتمد عليها محرك Unreal هي المحرّر UnrealEd، ويمكن من خلاله عمل كل شيء تقريباً عدا كتابة البرامج التي تعرّف عناصر اللعبة (Actors) في Unreal.

ولكن ما هي عناصر اللعبة؟ كما في Unity والكثير من محركات الألعاب الأخرى يتألف العالم من مجموعة من العناصر التي تسمى Actor أو GameObject أو Entity (أو ما شابه) والتي تشكل بمجموعها اللعبة نفسها، قد يكون العنصر شجرة أو صخرة لا تتحرك ولا تتفاعل مع أي شيء، او قد يكون وحش كاسر يمتلك ذكاء اصطناعي، مخالب مخيفة، وكره شديد غير مبرّر تجاه اللاعب، أو قد يكون العنصر أميرة حسناء محبوسة في قمة قصر، صاروخ أطلقته دبابة معادية، أو سيارة يستطيع اللاعب أن يركبها ويقودها ويحولها إلى طائرة عندما يريد، ... حسناً سأتوقف الآن. مغلق

في Unreal يسمى عنصر اللعبة الواحد Actor، وهنالك طريقة واحدة فقط لكتابة عناصر جديدة وهي البرمجة باستخدام UnrealScript.

UnrealScript هي اللغة التي يستخدمها Unreal وهي تستعير أفكار من لغتي ++C و Java، ولكن تضيف الكثير من الأفكار الموجهة للألعاب خصيصاً، على سبيل المثال كل عنصر يمتلك State Machine تعمل بالتوازي مع كود العنصر الفعلي، وكذلك فإن إمكانات الشبكات وتعدّد اللاعبين (networking/multiplayer) جزء من اللغة نفسها وليست مكتبة منفصلة.

أول عيب لاحظته في UDK هو عدم توفير برنامج لكتابة أكواد UnrealScript، يمكن بالطبع استخدام أي محرّر نصوص اعتيادي بدءاً من Notepad وانتهاءاً بـ Visual Studio، ولكن ليس لدي معلومات حول إمكانية إعداد Debugger لـ UnrealScript يدوياً باستخدام ادوات خارجية.

 

الجزء الرئيسي من محرّك Unreal هو محركّ اللعبة، ومعظمه مكتوب بلغة UnrealScript ويمكنك أن تلقي نظرة على الأكواد في المسار التالي (UDK/Development/Src/Engine/Classes)، على سبيل المثال تصفح ملف Actor.uc والذي يتضمن تعريف عنصر اللعبة النموذجي وجزء كبير من خصائصه مثل الفيزياء والحركة، يمكنك قراءة الكود بسهولة حتى وإن لم تكن درست UnrealScript لأنه مشابه لـ ++C كما ذكرت.

ولكي تزيد الأمور روعة، تقدم Epic مع UDK ديمو كامل للعبة Unreal Tournament مع أربعة خرائط، وبالطبع، أكواد اللعبة وعناصر اللعبة مقدّمة بالكامل لكي تستفيد منها، تجد تلك الأكواد في المسار (UDK/Development/Src/UTGame/Classes).

 

ديمو UTGame

 

بالإضافة إلى ذلك هنالك 3 ألعاب معمولة باستخدام UDK مقدمة لنا للدراسة، Whizzle وهي لعبة من نمط Casual، والثانية The Ball وهي تعديل على لعبة Unreal Tournament، وأخيراً Prometheus وهي لعبة شبيهة بلعبة Portal.

 

من الجدير بالذكر أن عدم توفير كود ++C لمحرك Unreal Engine سوف يؤدي إلى حتمية الاعتماد الكامل على UnrealScript وهي لغة يقوم محرك Unreal بتنفيذها بطريقة التفسير فوري (Interpreted) من ما يعني أنها أبطئ كثيراً من كود ++C، قد يؤثر ذلك على المشاريع المتوسطة التي يتم تطويرها باستخدام UDK لأن أي أكواد معقدة سوف تكون بالنتيجة بطيئة، وسوف يؤثر ذلك سلباً بالتأكيد على المشاريع الضخمة تأثيراً جدّياً.

من الأفضل أن أشير أيضاً إلى أن كود UnrealScript الذي يشكل محرك اللعبة والمقدم مع UDK يقدم اداءاً جيد جداً لسبب، إن حاولت تصفح بعض ملفات UnrealScript المقدمة لا شك أنك لاحظت معرّفات كثيرة تسبق تعريف الإجراءات وأحياناً تصف class معيّن، يهمنا هنا تحديداً المعرّف native، يعني هذا المعرّف أن كود الإجراء الفعلي (أو جزء من الـ class) مكتوب باستخدام ++C للحصول على أفضل اداء ممكن، وليس باستخدام UnrealScript، بطبيعة الحال لا نملك مع UDK هذه الإمكانية، ألا وهي كتابة جزء من الكود في ++C، كذلك لا يمكن تعديل جزء كبير من محرك اللعبة المقدّم مع UDK مباشرة، لأن أي تعديل على جزء native يجب أن ينعكس على ++C ونحن لا نملك تلك الإمكانية، ولكن يمكن بدلاً عن ذلك وراثة class من نوع native، وعمل override لإجراءاته.

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

ومن المهم فهم تبعات عدم تقديم كود ++C قبل اتخاذ قرار استخدام UDK لعمل مشروع جدّي.

 

رخصة الاستخدام

رخصة استخدام UDK فريدة من نوعها بالنسبة لمحرك ألعاب تجاري (خاصة من هذا الحجم)، وسأركز على تطوير ألعاب باستخدامه لأن هنالك شروط خاصة بتطوير برامج لمؤسسات ثالثة وغير ذلك من الكلام الذي لا يهمنا هنا، كبداية فإن المحرك مجاني تماماً للاستخدام الشخصي الغير تجاري بلا قيود، عندما تقرّر تطوير لعبة تجارية باستخدام UDK يمكنك تطوير اللعبة مجاناً أيضاً، ولكن عندما تنتهي من اللعبة وتستعد لإصدارها يجب أن تدفع رسماً مقداره 99 دولاراً فقط للحصول على الرخصة المسماة Royalty Bearing License، ليس واضحاً لي ما إذا كان هذا الرسم يدفع مرة واحدة للمنتج الأول فقط أو يجب دفعه لكل منتج، على كل حال فهو مبلغ رمزي ولا مشكلة إن كان يدفع لكل منتج.

والآن، لنفرض أنك قد أصدرت لعبتك وبدأت أرباح المبيعات تصلك، الـ 5000 دولار الأولى من الأرباح التي تحصل عليها لك بالكامل، ولا تطالب Epic بأي نسبة هنا، بعد الـ 5000 دولار الأولى يجب عليك أن تدفع لشركة Epic ما نسبته 25 بالمئة من الأرباح، تلك هي الرخصة باختصار.

على سبيل المثال، لنفترض أنك طوّرت لعبة أسميتها الأرنب المفترس، ثم قررت إصدارها تجارياً، يجب عليك أولاً دفع 99 دولار لشركة Epic للحصول على حق النشر التجاري، لنفترض أنك حصلت على أرباح  5000 دولار من اللعبة في أول شهر، هذه الأرباح لك بالكامل (مبروك مقدماً وأنت مطالب بعزيمة غداء محترمة)، ثم في الشهر الثاني حصلت على أرباح 10000 دولاراً، فيجب أن تدفع من هذه الـ 10000 دولار 25% أي 2500 دولار لشركة Epic، وتستمر بعد ذلك في دفع 25% من أي أرباح تحققها اللعبة.

 

مزايا UDK


  • محرّر Unreal والذي يقدم بيئة تحرير كاملة لمشروعك مع إمكانية استخدام جميع أدوات المحرّك الأساسية من داخل المحرّر. أهم تلك الأدوات:
    • محرّر التضاريس (Terrain Editor)
    • محرّر المواد (Material Editor): يقدم نظاماً فريد من نوعه لإنشاء المواد بشكل مرئي، يمكنك استخدامها لكي تطوّر مظلّلات لعبتك ومؤثراتها خاصة من دون الحاجة لكتابة سطر برمجي واحد. (تذكّر أن معظم أدوات المحرّر موجهة للفنانين الذين ليسوا من المعجبين بالبرمجة عادةً)
    • محرّر المجسّمات (Mesh Editor): يمكنك تغيير الخصائص الفيزيائية للمجسّم كذلك يمكن تبسيط المجسّم، إنشاء مستويات الدقة للمجسّم، إنشاء إحداثيات الإكساء، وكذلك أداة لتكسير المجسّم لإضافة قابلية التدمير.
    • محرّر الحركة (Animation Editor): لضبط الحركة العظمية للشخصيات وربطها بأحداث اللعبة وأكواد UnrealScript.
    • محرّر النباتات (Foliage Editor): يستخدم محرّك SpeedTree لإنشاء الأشجار، الحشائش، والزهور بكافة الأشكال والأحجام.
    • محرّر الهياكل الفيزيائية (Unreal PhAT): يمكن استخدامها لإنشاء هيكل عظمي فيزيائي للشخصيات والأشياء للحصول على مؤثرات من قبيل الدمى القماشية (Ragdolls).
    • محرّر الأنظمة الجزيئية (Unreal Cascade): تستخدم لإنشاء الأنظمة الجزئية والمؤثرات البيئية.
    • محرّر السينمائيات (Unreal Matinee): أداة إنشاء العروض السينمائية للعبة (Cutscenes or FMVs).
    • محرّر النصوص البرمجية المرئي (Unreal Kismet): يمكن استخدامه لكتابة أكواد بسيطة بشكل مرئي، مثلاً إن أردت أن تشغل مصعد ضمن مرحلة من مراحل اللعبة يمكنك كتابة وظيفية المصعد باستخدام Kismet.
    • محرّر واجهة المستخدم (UI Editor): يمكن استخدامه لإنشاء قوائم اللعبة وواجهتها (HUD) بالشكل الذي ترغب فيه، يقدم دعم لاستيراد خطوط TrueType.
    • محرّر الصوت (Sound Cue Editor): لإنشاء الأحداث الصوتية وتغيير خصائص الصوت.
    • محرّر المؤثرات الخاصة (Post-process Editor): يمكنك إنشاء أي عدد من المؤثرات الخاصة التي تنطبق على كامل العرض مثل Depth of Field أو Motion Blur.
    • متصفح المحتوى (Unreal Content Browser): أداة لإدارة جميع محتويات اللعبة.
  • الإظهار: نظام إظهار Gemini يقدم لك نظام إظهار متعدد المسارات (multi-threaded) يتيح إظهار مشاهد معقدة ومفصلة، يستطيع كذلك تعديل دقة المشاهد والمؤثرات الخاصة لكي يتناسب مع العتاد الذي يعمل عليه، يستند النظام على 64-بت HDR ويقدم مؤثرات كثيرة يمكن تطبيقها على المشاهد مثل Depth of Field، Motion Blur، و Bloom مع إمكانية إنشاء مؤثرات جديدة بأيدي الفنانين.
  • الحركة: نظام قوي للحركة، مع محرّرات متعددة، يستطيع نظام الحركة تطبيق الحركات الإجرائية (Procedural Animation) على الهياكل العظمية للشخصيات ويقدم نظام حركية عكسية كامل (Inverse Kinematics)، نظام حركة المجموعات، دعم لحركة الوجوه التحولية وإمكانية إنشاءها وتصديرها في Maya أو Max.
  • النصوص البرمجية: إمكانية كتابة النصوص البرمجية باستخدام لغة UnrealScript وهي لغة عالية المستوى مرنة وبسيطة، وإمكانية كتابة النصوص البرمجية بشكل مرئي باستخدام Unreal Kismet.
  • الفيزياء: يستخدم Unreal محرك الفيزياء PhysX من NVIDIA مع دعم لفيزياء العربات (Vehicle Physics)، البيئات القابلة للتدمير، نظام لمحاكاة الحشود (Crowd System).
  • الإضاءة والظلال: دعم لجميع تقنيات الإضاءة الحديثة (مثل Ambient Occlusion)، نظام Unreal Lightmass لإنشاء الإضاءة المحسوبة مسبقاً (باستخدام Global Illumination)، دعم للظلال في الزمن الحقيقي إضافة لتنعيمها.
  • المشاهد السينمائية: يمكن استخدام أداة Unreal Matinee لإنشاء المقاطع السينمائية بتحكم كامل بالكاميرات والمؤثرات الصورية.
  • الشبكات: نظام ألعاب شبكات عالي المستوى مع دعم عدد لاعبين يصل 64 واللعب عن طريق الإنترنت أو الشبكة المحلية.
  • المظلّلات: أداة تصميم مظلّلات مرئي مشابهه للأدوات الموجودة في برنامجي XSI و Maya موجهة للفنانين.
  • الصوت: دعم الأصوات ثلاثية الأبعاد، يستخدم Unreal مكتبة Ogg Vorbis لضغط الملفات، ويأتي مجهز بمحرّر أصوات.
  • الأنظمة الجزيئية: محرّر الأنظمة الجزيئية Unreal Cascade لإنشاء المؤثرات.
  • الذكاء الاصطناعي: نظامان لإنشاء المسارات في العالم ثلاثي الأبعاد مع خوارزمية خاصة لإيجاد المسار.
  • الفيديو: يستخدم Unreal أداة Bink Video لترميز الفيديو.
  • النباتات: محرّك SpeedTree الكامل متوفر مع UDK (برنامجي SpeedTree Modeler و SpeedTree Compiler المستقلين عن المحرّر)، يستطيع المحرّك إنشاء الأشجار والأعشاب بكافة أشكالها وأنواعها وتحريكها بشكل صحيح.
  • حركة الوجوه: نظام FaceFX مضمّن كجزء من UDK، يستطيع تحريك وجوه الشخصيات إستناداً إلى الملفات الصوتية للكلام.

 

روابط مهمة


 





كرنفال المطوّرين المستقلين: Unity
التوقيت 06 تشرين الثاني 2009 09:08 م بقلم الكاتب سلوان الهلالي

بشرى سارة لمطوّري الألعاب المستقلين، لقد اصبح بإمكانكم استخدام اشهر محركات الألعاب المتوفرة مجاناً!

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

سوف أستعرض في سلسلة من التدوينات عدد من تلك المحركات، ولنبدأ بأولها...

 

محرك Unity3D

 

أحد محركات الألعاب الأكثر متعة في الاستخدام، كان هذا المحرّك حديث أروقة مطوّري الألعاب لفترة من الزمن، بدأ تطويره قبل عدة سنوات وأول ظهور لاصدارته التجارية كان في سنة 2005 وهو الآن في الجيل الثاني، يدعم هذا المحرك أنظمة التشغيل Windows و Mac OSX ويستطيع تشغيل الألعاب عن طريق المتصفح مباشرة عن طريق Unity web player plugin ويدعم جميع المتصفحات المعروفة، ويبلغ حجم Unity web player ثلاثة ميغابايت فقط، بالنسبة للمنصات فهو يدعم Wii و iPhone.

 

التطوير

يعتمد محرك Unity على مبدأ بيئة التطوير بطريقة شبيهه بمحرك وبرنامج التصميم ثلاثي الأبعاد Blender3D، يمكنك كتابة النصوص البرمجية التي تشكّل اللعبة من داخل بيئة Unity باستخدام أي من لغات البرمجة المدعومة حالياً:

  • #C
  • Javascript
  • نكهة من نكهات Python تسمى Boo

 

بيئة تطوير Unity

بيئة تطوير Unity

 

من الداخل، يستخدم المحرك زمن تشغيل MONO لتنفيذ النصوص البرمجية، يقود ذلك إلى الحصول على أداء جيد جداً مقارب لأداء ++C، مايكروسوفت دوت نت يستخدم المبدأ نفسه (مبدأ Just-In-Time Compiler).

 

رخصة الاستخدام

وهي رخصة المحرك الموجهة للمطوّرين المستقلين، قبل أسبوع كانت هذه الرخصة تكلّف 500 دولاراً، اما الآن فهي مجانية! سواءاً كانت للاستخدام الشخصي أم التجاري(هنالك شرط واحد مهم وهو إن كانت أرباح شركتك تتعدى 100 ألف دولار سنوياً لا يحق لك استخدام النسخة المجانية)، ولكن بالطبع النسخة المجانية تأتي مع بعض المحدودية، أولها ظهور شاشة عند تشغيل اللعبة تشير إلى إن اللعبة تستخدم محرك Unity إن تم تشغيل اللعبة كتطبيق مستقل على وندوز أو ماكنتوش، أما في حالة تشغيلها داخل متصفح فتظهر علامة مائية في إحدى الزوايا باسم Unity.

 

اللعبة تستخدم Unity - تظهر في بداية تشغيل اللعبة

تستخدم Unity - تظهر في بداية تشغيل اللعبة

 

كذلك هنالك مزايا متقدمة تم تعطيلها في الإصدارة المجانية يحصل عليها من يشتري الرخصة الإحترافية Pro من Unity (حالياً يبلغ سعر الرخصة الاحترافية 1500 دولار)، تضم هذه المزايا بعض الأشياء المهمة مثل امكانية برمجة جزء من اللعبة عن طريق ++C/C أو إظهار الظلال أثناء التنفيذ (Realtime Shadow) وكذلك إظهار التأثيرات الخاصة التي تنطبق على كامل الشاشة (fullscreen post-processing effects).

 

مزايا المحرك تحت الرخصة المجانية

  • مزايا بيئة التطوير (Editor): يمكن تشغيل اللعبة من داخل البيئة مباشرة، تقدم البيئة عدداً من المكونات الجاهزة التي يمكن استخدامها داخل اللعبة (Prefabs)، يتم تجهيز ملفات اللعبة كاملة وجاهزة للتوزيع بضغطة زر واحدة.
  • مزايا الرسوميات: أداء عالي، دعم لـ Direct3D و OpenGL، دعم الأنظمة الجزيئية.
  • استيراد الموارد: يدعم Unity نظام كامل لاستيراد الموارد للصور ثنائية الأبعاد والمجسّمات ثلاثية الأبعاد (مع الحركة طبعاً) مع دعم جميع برامج التصميم ثلاثية الأبعاد المعروفة، لحظة حفظك للملفات الناتجة من برامج التصميم يقوم Unity بتحديث الملفات التي لديه، دعم استيراد المقاطع الصوتية وتحويلها إلى هيئة Ogg داخلياً.
  • التوزيع (Deployment): دعم التطبيقات المستقلة بذاتها (standalone) تحت نظامي Windows و Mac، دعم تشغيل الألعاب عن طريق جميع المتصفحات المعروفة على نظامي التشغيل المذكورين.
  • المظللات (Shaders): عدد من المظللات الجاهزة المبنية مسبقاً (40 مظلّل)، نظام مبسط لبناء المواد.
  • خرائط التضاريس (Terrain): نظام كامل للتضاريس يدعم الأشجار، الأعشاب، الصخور، والإضاءة عن طريق خرائط الضوء (light mapping).
  • دعم الشبكات: دعم كامل مبني داخل Unity للشبكات، إمكانية التعامل المباشر مع بروتوكولات الإنترنت UDP و TCP/IP، يمكن عند تشغيل اللعبة داخل متصفح التعامل مع AJAX.
  • الفيزياء: يستخدم Unity محرك PhysX للفيزياء.
  • النصوص البرمجية: يستخدم Unity زمن تشغيل MONO للحصول على أداء مقارب لبرامج ++C ويقدم واجهة استخدام شبيهه تماماً بتلك التي يقدمها دوت نت، دعم لغات برمجة متعددة.
  • الإضاءة: دعم لخرائط الإضاءة (Light Maps).
  • الوثائق (Documentation): توثيق كامل لمزايا المحرك ودروس تفصيلية كاملة تتضمن دروس لبناء ألعاب ثلاثية الأبعاد من الصفر.

 

روابط مهمة