الخميس، 23 يونيو 2011

الكرات المتحركة - مثال بكلمات

نريد أن نبدأ بتحريك كرة واحدة، ثم بعد ذلك نتصرف في باقي الكرات.
إجراء حرك.الكرة ( طيف ، س ، ص ، السرعة ) :
-- سوف نكتب كود هنا
نهاية
(اعتبر الإجراء مثل void function).
هذا الإجراء يأخذ اربع عوامل:
  • طيف هو الطيف الذي يعبر عن رسمة الكرة؛ الطيف شكل متحرك يرسم على الشاشة (sprite) وسنعرف الآن كيف نتعامل معه
  • س، ص هو المكان الذي نريد أن يبدأ فيه رسم الكرة
  • السرعة هو مصفوفة (array) من عنصرين يعبر عن متجه vector فيه سرعة الكرة في الاتجاهين السيني والصادي
نبدأ في تفاصيل الإجراء:
إجراء حرك.الكرة ( طيف ، س ، ص ، السرعة ) :
    كرر :
        ارسم.طيف طيف في ( س ، ص )
        س = س + السرعة [ 1 ]
        ص = ص + السرعة [ 2 ]
        انتظر(15)
    تابع
نهاية
الأمر هنا بسيط: الأمر ارسم.طيف/في يأخذ طيفاً ويرسمة في نقطة محددة هي هنا نقطة البداية، ثم نغير هذه النقطة كل مرة حسب متجه السرعة، بأن نضيف السرعة في الاتجاه السيني إلى س ونفس الشيء في ص. لاحظ أن المصفوفات في كلمات تبدأ من الواحد.

نكرر هذه العملية باستمرار مع انتظار بسيط - 15 ميلليثانية - بين رسمة والأخرى

المشكلة هنا هي أن الكرة ستخرج من الشاشة بعد قليل وتختفي، نحن نريدها أن "تصطدم" بالشاشة ومن ثم تغير اتجاهها. خطتنا بسيطة:
  • إذا اصطدمت الكرة بقمة الشاشة أو قاعها، نقلب إشارة السرعة في الاتجاه الصادي فنحيلها من موجبة لسالبة أو بالعكس، وبذلك تنزل الكرة مثلاً إن كانت تصعد.
  • إذا اصطدمت بيمين الشاشة أو يسارها نغير إشارة المكون السيني للسرعة
  • في الحالتين إن كانت الكرة تكاد أن تُرسم خارج الشاشة نعيد مكانها لحافة الشاشة
كيف ينعكس ذلك على الكود؟ تعال نرى مثلاً ماذا يحدث لو تجاوزت الكرة الحافة اليمنى للشاشة.
إذا س < 0 :
    س = 0
    السرعة [ 1 ] = - السرعة [ 1 ]
تم
الحافة اليمنى هي النقطة س=صفر، فأن كانت س أقل من الصفر فمعنى هذا أن الكرة توشك أن تخرج، فنعيدها مرة أخرى إلى الحافة ونعكس إشارة المكون الأول للسرعة. لاحظ أن نظام الإحداثيات يساير الكتابة العربية (س تزداد من اليمين لليسار).

ماذا يحدث لو تجاوزت الكرة يسار الشاشة؟ هذا:
إذا س + عرض.الطيف ( طيف ) > 799 :
    س = 799 - عرض.الطيف ( طيف )
    السرعة [ 1 ] = - السرعة [ 1 ]
تم
شاشة الرسم في كلمات عرضها 800 نقطة وارتفاعها 600، لذلك النقطة في أقصى اليسار هي النقطة 799 لأن العد يبدأ من الصفر.

إذا تجاوزت حافة الكرة اليسرى (المحددة بقيمة س + عرض الكرة) هذا الحد نعيد الحافة اليسرى للنقطة الأخيرة. لاحظ أن التخصيص
س = 799 - عرض.الطيف ( طيف )
معناه اجعل س + عرض الطيف = 799، أي اجعل الحافة اليسرى بهذه القيمة.
سنفعل نفس الشيء مع قيم ص ليكون الإجراء الكامل كالآتي:
إجراء حرك.الكرة ( طيف ، س ، ص ، السرعة ) :
    كرر :
        ارسم.طيف طيف في ( س ، ص )
        س = س + السرعة [ 1 ]
        ص = ص + السرعة [ 2 ]
        إذا س < 0 :
            س = 0
            السرعة [ 1 ] = - السرعة [ 1 ]
        وإلا إذا س + عرض.الطيف ( طيف ) > 799 :
        س = 799 - عرض.الطيف ( طيف )
            السرعة [ 1 ] = - السرعة [ 1 ]
        تم
        إذا ص < 0 :
            ص = 0
            السرعة [ 2 ] = - السرعة [ 2 ]
        وإلا إذا ص + ارتفاع.الطيف ( طيف ) > 599 :
            ص = 599 - ارتفاع.الطيف ( طيف )
            السرعة [ 2 ] = - السرعة [ 2 ]
        تم
        انتظر ( 15 )
    تابع
نهاية
عظيم!! لقد أنهينا الإجراء. لم يتبق سوى استدعاؤه:
ط = حمل.طيف ( "ball1.bmp" )
س = عشوائي ( 800 )
ص = عشوائي ( 600 )
السرعة.س = عشوائي ( 20 ) + 1
السرعة.ص = عشوائي ( 20 ) + 1
السرعة = [ السرعة.س ، السرعة.ص ]
حرك.الكرة ( ط ، س ، ص ، السرعة )
هنا قمنا باستخدام الدالة الجاهزة حمل.طيف لنقوم بتحميل صورة للكرة وتكوين طيف منها، ثم ولدنا بعض القيمة العشوائية لمكان الكرة وسرعتها وقمنا بتمريرهم إلى الإجراء. لاحظ كيف يمكن عمل مصفوفة من عنصرين بالتعبير [ أ، ب] كما فعلنا للمتغير السرعة

يمكننا الآن أن ننفذ البرنامج:
للأسف لقطة الشاشة لا تبين روعة الكرة وهي تجري..كان ينبغي أن أضع فيديو لهذا المثال على اليوتيوب :]

الآن نريد أن نجعل البرنامج يتحرك فيه كرات كثيرة...هذا في الواقع أسهل مما نتخيل بسبب إمكانات البرمجة المتوازية في لغة كلمات. الأمر شغل يأخذ الصيغة التالية:
شغل <استدعاء إجراء>
ومعناه "استدع هذا الإجراء بحيث يعمل على التوازي مع باقي البرنامج وأي إجراءات أخرى". كل ما علينا الآن هو تشغيل عدة نسخ من الإجراء على التوازي ليكون لدينا كرات كثيرة!

(ملاحظة: تنفيذ الإجراءات في الواقع لن يكون متوازياً، بل ستقوم الآلة الافتراضية virtual machine الخاصة بكلمات بالانتقال بسرعة بين إجراء والآخر ليبدو الأمر كأنه على التوازي. في المستقبل ننوي تغيير الآلة الافتراضية لتحقيق توازٍ حقيقي).

سيبدو تنفيذ الإجراء الآن كالآتي، لنحرك عشر كرات عشوائياً:
لكل أ من 1 إلى 10 :
    ط = حمل.طيف ( "ball1.bmp" )
    س = عشوائي ( 800 )
    ص = عشوائي ( 600 )
    السرعة.س = عشوائي ( 20 ) + 1
    السرعة.ص = عشوائي ( 20 ) + 1
    السرعة = [ السرعة.س ، السرعة.ص ]
    شغل حرك.الكرة ( ط ، س ، ص ، السرعة ) 
تابع

جميل، لكن الكرات كلها من نفس اللون، نريد أن يكون الأمر متنوعاً قليلاً..نرى الآن البرنامج في صورته النهائية:
ملفات.الأطياف=["ball4.bmp"،"ball3.bmp"،"ball2.bmp"،"ball1.bmp"]

لكل أ من 1 إلى 10 :
    ط = حمل.طيف ( ملفات.الأطياف [ عشوائي ( 4 ) + 1 ] )
    س = عشوائي ( 800 )
    ص = عشوائي ( 600 )
    السرعة.س = عشوائي ( 20 ) + 1
    السرعة.ص = عشوائي ( 20 ) + 1
    السرعة = [ السرعة.س ، السرعة.ص ]
    شغل حرك.الكرة ( ط ، س ، ص ، السرعة )
تابع

إجراء حرك.الكرة ( طيف ، س ، ص ، السرعة ) :
    كرر :
    ارسم.طيف طيف في ( س ، ص )
        س = س + السرعة [ 1 ]
        ص = ص + السرعة [ 2 ]
        إذا س < 0 :
            س = 0
            السرعة [ 1 ] = - السرعة [ 1 ]
        وإلا إذا س + عرض.الطيف ( طيف ) > 799 :
        س = 799 - عرض.الطيف ( طيف )
            السرعة [ 1 ] = - السرعة [ 1 ]
        تم
        إذا ص < 0 :
            ص = 0
            السرعة [ 2 ] = - السرعة [ 2 ]
        وإلا إذا ص + ارتفاع.الطيف ( طيف ) > 599 :
            ص = 599 - ارتفاع.الطيف ( طيف )
            السرعة [ 2 ] = - السرعة [ 2 ]
        تم
        انتظر ( 15 )
    تابع
نهاية
لتحميل المثال كاملاً:
اضغط هذا الرابط

لتحميل لغة كلمات:
http://code.google.com/p/kalimat/downloads
أو من الموقع الرسمي http://www.kalimat-lang.com

هناك 9 تعليقات:

Unknown يقول...

اقتراح: ممكن حضرتك تحط Source code مع نهاية كل برنامج

root3 يقول...

ربما أصبح بالإمكان مشاهدة روعة الكرة و هي تجري من هنا:
http://www.youtube.com/watch?v=sldLsnQs4Jk

:]

Anas Abo El Ala يقول...
أزال المؤلف هذا التعليق.
Anas Abo El Ala يقول...

عيزين تطوير للعبة كوكو و توتو :D:D
بجد مش لاقي كلمات توصف اد ايه انا سعييييييييييد ب"كلمات" :):):)

Mohamed Samy يقول...

@5olio

تقصد في صورة ملف يمكن تحميله؟ فكرة تستحق التنفيذ...

@Tasniem Seliem

شكراً جداً!!!

@Anas Abo El Ala

ربما تكون مثالاً قادماً :)
أنا سعيد أن اللغة أعجبتك هكذا!

Shqear يقول...

عمل رائع ولكن .. كلما حاولت عمل ملف تنفيذي لأي برنامج يقول "خطأ في عمل الملف التنفذي Failed to compile the program"

Mohamed Samy يقول...

@Khaled Abushqair

أشكرك على إبلاغي بالمشكلة. هناك بعض المعلومات التي أريد الاستفسار عنها:

- هل هذه المشكلة في إصدارة فبراير 2013 من كلمات؟
- ما إصدارة ويندوز التي قمت بالتجربة عليها؟

على العموم سأبحث في الأمر وأحاول حل المشكلة في إصدارة قادمة.

Shqear يقول...

مرحبا....
بالنسبه للإصدار هي كما ذكرت فبراير2013...
اما إصدار الوندوز فهو Win.XPSP3
البرنامج يعمل جيدا عند تنفيذ الكود ولكنة لا يقبل عمل أي نسخة تنفيذية لأي كود..

الأمر الآخر
بالنسبة لكود الكرات المتحركة لقد زودتنا برابط لتحميل المثال كاملا.. ولكن الكود فيه مشكلة عند (طالما صحيح:)

Mohamed Samy يقول...

@Khaled Abushqair

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

الكود المشار إليها في الرابط قديمة (وعليّ أن أعدل المقال)، لكن مثال الكرات المتحركة موجود الآن مع كلمات نفسها في مجلد 'أمثلة بسيطة' لو أردت أن تجربه.