Friday, October 1, 2010

XNA: Lesson5: Collision detection 1

الدرس الخامس: Collision Detection
اساسيات اكتشاف التصادمات


بسم الله و الصلاة و السلام علي رسول الله ...

  • درسنا اليوم هو اكتشاف التصادمات ... طيب ما معني التصادمات؟
التصادم هو شئ فيزيائي يحدث عندما يصطدم كائن في اللعبة بكائن اخر ... هنا نريد ان نحدد كيف سيصطدم الكائنان ببعض و كيف نكتشف بالكود هذا التصادم ...

بداية سنقوم باكتشاف التصادم مع اطار اللعبة نلاحظ في الدرس السابق ان عناصر اللعبة تمشي بسرعة معينة و لكنها تبقي تتحرك الي خارج اطار اللعبة لذلك مهمتنا الان هي اكتشاف التصادم مع اطار اللعبة و اذا اصطدم الكائن باطار اللعبة فنعيده مرة اخري الي داخل اطار اللعبة ... دعونا نبدا:

  • نفتح الملف clsSprite.CS:
اولا لكي نعرف احداثيات الشاشة يجب ان خاصية جديدة ستحمل طول و عرض شاشة اللعبة:
public Vector2 screenSize { get; set; }

ثم نعدل ال Constructor كالاتي:
        public clsSprite(Texture2D newTexture, Vector2 newPosition, int screenWidth, int screenHeight)
        {
            texture = newTexture;
            position = newPosition;
            screenSize = new Vector2(screenWidth, screenHeight);
        }

و هنا قمنا بملء ال screenSize بطول الشاشة و عرض الشاشة...

ثم نتجه الان الي الدالة Move() لكي نكتب الكود الذي سيكتشف التصادم:

        public void Move()
        {
            // سنفخص اذا كان الكائن يتحرك لليمين
            if (position.X + texture.Width + velocity.X > screenSize.X)
            {
                velocity = new Vector2(-velocity.X, velocity.Y);
            }
            // سنفخص اذا كان الكائن يتحرك للأسفل
            if (position.Y + texture.Height + velocity.Y > screenSize.Y)
            {
                velocity = new Vector2(velocity.X, -velocity.Y);
            }
            // سنفخص اذا كان الكائن يتحرك لليسار
            if (position.X + velocity.X < 0)
            {
                velocity = new Vector2(-velocity.X, velocity.Y);
            }
            // سنفخص اذا كان الكائن يتحرك للأعلي
            if (position.Y + velocity.Y < 0)
            {
                velocity = new Vector2(velocity.X, -velocity.Y);
            }

            //نعطي السرعة الجديدة للكائن
            position += velocity;
        }



شرح الكود:
            // سنفخص اذا كان الكائن يتحرك لليمين
            if (position.X + texture.Width + velocity.X > screenSize.X)
            {
                velocity = new Vector2(-velocity.X, velocity.Y);
            }

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


            // سنفخص اذا كان الكائن يتحرك للأسفل
            if (position.Y + texture.Height + velocity.Y > screenSize.Y)
            {
                velocity = new Vector2(velocity.X, -velocity.Y);
            }

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



            // سنفخص اذا كان الكائن يتحرك لليسار
            if (position.X + velocity.X < 0)
            {
                velocity = new Vector2(-velocity.X, velocity.Y);
            }

هنا سنفحص اذا كان الكائن يتجه لليسار  ... يتجه لليسار يعني تناقص  ال x  و بالتالي اذا وصل لاقصي نقطة في يسار الشاشة  ستكون الاحداثيات الخاصة به هي نقطة 0  Zero   زائد سرعته و بالتالي اذا كان الناتج اقل من الصفر فنقوم بعكس قيمة ال x للسرعة التي يتحرك بها حتي يتجه لليمين مرة ثانية ...


            // سنفخص اذا كان الكائن يتحرك للأعلي
            if (position.Y + velocity.Y < 0)
            {
                velocity = new Vector2(velocity.X, -velocity.Y);
            }
هنا سنفحص اذا كان الكائن يتجه للأعلي... يتجه للأعلي يعني تناقص  ال y   و بالتالي اذا وصل لاقصي نقطة في اعلي  الشاشة  ستكون الاحداثيات الخاصة به هي نقطة 0  Zero   زائد سرعته و بالتالي اذا كان الناتج اقل من الصفر فنقوم بعكس قيمة ال y  للسرعة التي يتحرك بها حتي يتجه للأسفل مرة ثانية ...


            //نعطي السرعة الجديدة للكائن بعد ان حسبناها
            position += velocity;
        }


تطبيق: اكمل علي التطبيق السابق و جرب هذا الكود بنفسك و اجعله يعمل .... و شاهد بنفسك ما يحدث ...


3 comments:

  1. أيوة كدة
    بسم الله ما شاء الله

    كتاب العالم ولده المخلد

    لازم نكتب و ندون نملأ مساحة الانترنت بافكارنا و آراءنا

    ربنا يباركلك

    ReplyDelete
  2. جزاك الله خيرا يا محمد .. و دائما انت السباق في الخير و المبادرات و لقد تعلمت منك الكثير و اتعشم ان اتعلم اكثر ....

    بارك الله فيك و في كل اسرتك و اسعدكم في الدنيا و الاخرة و جمعنا الله في الجنة

    ReplyDelete
  3. بجد شكرا جدا وجزاك الله عنا خير

    ReplyDelete