مدونة سلوان الهلالي

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

Boo Tao Mono

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

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

 

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

 

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

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

 

(ملاحظة: عدا فجوال ستوديو، جميع الحلول المطروحة حرّة مفتوحة المصدر هادئ)

 

 

أضف تعليقاً

Loading