الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الدرس الثامن من سلسلة دروس تعلم ال Xna

بدأه *خلدون خالد* في 6 مارس 2009 · 5 رد · 2,577 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بســم الله الـرحمــن الرحيــم

الدرس الثامن

<<== إذهب إلى الدرس السابق

أهلا بكم في الدرس الثامن من سلسلة دروس تعلم الXna , سوف نقوم في هذا الدرس بإطلاق الصاروخ (إنبطحو على الأرض :S ).

في هذا الدرس, سوف نقوم بتوسيع الكود الخاص بنا بحيث نقوم بإطلاق الصاروخ من المدفع عند الضغط على زر المسافة “Spacebar”. أولا قم بتنزيل صورة الصاروخ من الرابط هنا (أو من خلال المرفقات) , و قم بإستيراده إلى داخل مشروع ال Xna . أضف المتغير التالي في أعلى الكود أيضا:

 Texture2D rocketTexture;

وقم بتجهيز المتغير في دالة ال LoadContent:

rocketTexture = Content.Load<Texture2D> ("rocket");

بعدها, اضف المتغيرات التالية في أعلى الكود أيضا:

 bool rocketFlying = false;
 Vector2 rocketPosition;		
 Vector2 rocketDirection;
 float rocketAngle;
 float rocketScaling = 0.1f;

المتغير الأول يعبر عما إذا كان الصاروخ في الهواء حاليا أم لا, بمعنى هل سوف يتم رسمه أم لا.

من الواضح أننا بحاجة لمعرفة موقع الصاروخ في كل الأوقات. اما بالنسبة لإتجاه الصاروخ فيلزمنا من أجل حساب الموقع الجديد للصاروخ, و هو مرتبط مباشرة بالزاوية. في الحقيقة يمكننا إشتقاق (حساب) الزاوية بناء على الإتجاه, ولكن لإننا سوف نحتاج الوصول إليها بشكل متكرر قمنا بوضعها في متغير منفصل. أخيرا, متغير التحجيم “Scaling”يمثل عدد ثابت, و لكن لأننا سوف نحتاجه أكثر من مره داخل الكود قمنا بوضعه في متغير.

دعنا نبدأ بمعالجة ضغطة الزر من خلال الدالة ProcessKeyboard , سوف نحتاج لإطلاق الصاروخ عندما يتم الضغط على الزر في لوحة المفاتيح. إذن قم بإضافة الكود التالي إلى الدالة :

 if (keybState.IsKeyDown(Keys.Enter) || keybState.IsKeyDown(Keys.Space))
 {
	 rocketFlying = true;
 }

حيث يقوم هذا الكود بإعطاء قيمة true للمتغير rocketFlying حتى الآن. بعدها, يمكننا ان نعطي قيم الموقع و الزاوية للصاروخ, لكي تكون مساوية للقيم الخاصة بالمدفع الذي يطلق الصاروخ. قم بإضافة الكود التالي داخل كتلة ال If السابقة:

 rocketPosition = players[currentPlayer].Position;
 rocketPosition.X += 20;
 rocketPosition.Y -= 10;
 rocketAngle = players[currentPlayer].Angle;

بالنسبة للموقع, بدئنا من الركن الأيسر الأسفل الخاص بحامل المدفع, و أضفنا 20 بسكل إلى اليمين و 20 بكسل للأعلى, ليكون مقابل مركز حامل المدفع. كقيمة إبتدائية للزاوية يجب علينا أن نأخذ الزاوية الحالية الخاصة بالمدفع.

إيجاد الإتجاه الصاروخ أعقد قليلا. الإتجاه مكون من مكونيين هما ال X و ال Y, للتعبير عن كم من بسكل يجب أن يتحرك الصاروخ أفقيا و عموديا في كل مره. بشكل واضح يمكن إيجاد ذلك من خلال الزاوية الخاصة بالصاروخ.

أحد الطرق تقتضي أن نأخذ جيب الزاوية “Sine” و جيب التمام لها “Cosine” و إستخدامهما للتعبير عن قيم ال X و ال Y, و لكن ال Xna تتيح لنا إستخدام طريقه (حل) أكثر أناقة. سوف نبدأ من الإتجاه إلى الأعلى (-10,) , وبعدها سنطلب من ال Xna أن يقوم بعمل التدوير بزاوية نقوم نحن بتحديدها. كما هو موضح في الصورة التالية:

post-133895-1236368681_thumb.jpg

دعنا نبدأ بتعريف متجه “Vector” يعبر عن المحور Y السالب, و له الإحداثيات (0,-1), ضع السطر التالي بعد الكود السابق:

 Vector2 up = new Vector2(0, -1);

بعدها, نريد من ال Xna أن يقوم بتدوير هذا المتجه. لعمل ذلك يلزمنا مصفوفة تدوير, ذلك يبدو معقدا, ولكنه ليس كذلك: المصفوفة هي "شيئ" نقوم بضربه في المتجه ليعطينا نسخة جديده و محولة “Transformed” من هذا المتجه. إذا كان بإمكان ال Xna أن يعطينا مصفوفة تحتوي على التدوير المطلوب, نستطيع بعدها أن نستخدم هذه المصفوفة من أجل تدوير المتجه. هذا السطر يتيح لنا إنشاء مصفوفة التدوير:

 Matrix rotMatrix = Matrix.CreateRotationZ(rocketAngle);

لتفسير السطر السابق, فكر كيف بإمكاننا تدوير المتجة الموجود في الصورة السابقة. في يدك اليسرى دع إصبع الإبهام يشير إلى محور X و أصبع السبابه إلى محور Y السالب, و بقية الأصابع إلى داخل الشاشة, بهذا يشكل بقية الأصابع محور الدوران.

هذا يفيدنا في فهم السطر السابق: فهو يقوم بإنشاء مصفوفة للدوران حول محور Z . هذا ما نحتاجه : إذا كان محور X يشير إلى اليمين و محور Y يشير إلى الأسفل, سيكون محور Z متجه إلى خارج الشاشة !

الآن لدينا هذه المصفوفة تحتوي على التدوير الذي نريده, نستطيع ان نطلب من ال Xna يقوم بتحويل المتجه بهذا التدوير:

 rocketDirection = Vector2.Transform(up, rotMatrix);

هذا السطر سوف يأخذ الإتجاه الأصلي المتجهه للأعلى, و يقوم بتدويره على محور Z , و يخزن النتيجة في المتغير rocketDirection ! الآن كل ما نحتاجه, هو أن نقوم بزيادة أو إنقاص الإتجاه بالإعتماد على طاقة إطلاق الصاروخ:

rocketDirection *= players[currentPlayer].Power / 50.0f;

في هذه اللحظة, قمنا بتخزين كل شيئ نحتاجه من أجل الصاروخ, لذا دعنا نقوم بإنشاء دالة صغيرة تقوم برسم الصاروخ على الشاشة:

 private void DrawRocket()
 {
	 if (rocketFlying)
		 spriteBatch.Draw(rocketTexture, rocketPosition, null, players[currentPlayer].Color, rocketAngle, new Vector2(42, 240), 0.1f, SpriteEffects.None, 1);
 }

السطر الأول يفحص فيما إذا تم إطلاق الصاروخ. السطر الثاني يطلب من ال SpriteBatch أن يقوم برسم:

• صورة الصاروخ

• في موقع rocketPosition على الشاشة

• كل الصورة

• بلون اللاعب الحالي

• بعد تدويرها بزاوية rocketAngle

• بإعتبار ان النقطة (42,240) هي مركز الصورة (إنظر إلى هذا الموقع في صورة الصاروخ الأصلية)

• مصغرة ب 10 مرات

• بدون قلبها

• على الطبقه على بعد 1

لا تنسى إستدعاء هذه الدالة من الدالة Draw() :

 DrawRocket();

الآن عند تنفيذ الكود, إذا ضغط على زر المسافة “Space” أو زر “Enter” , سترى أنه تم عرض الصاروخ على المدفع! ولكن بما أننا لم نقم بتحديث موقع الصاروخ, لن يتحرك الصاروخ بعد, و لكن من السهل عمل ذلك و هذا ما سنفعله في الدرس التالي بما أننا قمنا بحساب الإتجاه للصاروخ !

post-133895-1236370432_thumb.jpg

كود المشروع حتى اللحظه:

 using System;

 using System.[color= #202020;]Collections.[color= #202020;]Generic;

 using Microsoft.[color= #202020;]Xna.[color= #202020;]Framework;

 using Microsoft.[color= #202020;]Xna.[color= #202020;]Framework.[color= #202020;]Audio;

 using Microsoft.[color= #202020;]Xna.[color= #202020;]Framework.[color= #202020;]Content;

 using Microsoft.[color= #202020;]Xna.[color= #202020;]Framework.[color= #202020;]GamerServices;

 using Microsoft.[color= #202020;]Xna.[color= #202020;]Framework.[color= #202020;]Graphics;

 using Microsoft.[color= #202020;]Xna.[color= #202020;]Framework.[color= #202020;]Input;

 using Microsoft.[color= #202020;]Xna.[color= #202020;]Framework.[color= #202020;]Net;

 using Microsoft.[color= #202020;]Xna.[color= #202020;]Framework.[color= #202020;]Storage;

 

 namespace XNAtutorial

 [color= #009900;]{

     public [color= #993333;]struct PlayerData

     [color= #009900;]{

         public Vector2 Position;

         public bool IsAlive;

         public Color Color;

         public [color= #993333;]float Angle;

         public [color= #993333;]float Power;

     [color= #009900;]}

 

     public class Game1 [color= #339933;]: Microsoft.[color= #202020;]Xna.[color= #202020;]Framework.[color= #202020;]Game

     [color= #009900;]{

         GraphicsDeviceManager graphics;

         SpriteBatch spriteBatch;

         GraphicsDevice device;

 

         [color= #993333;]int screenWidth;

         [color= #993333;]int screenHeight;

 

         Texture2D backgroundTexture;

         Texture2D foregroundTexture;

         Texture2D carriageTexture;

         Texture2D cannonTexture;

         Texture2D rocketTexture;

         SpriteFont font;

 

         PlayerData[color= #009900;][[color= #009900;]] players;

         [color= #993333;]int numberOfPlayers [color= #339933;]= [color= #cc66cc;]4;

         [color= #993333;]float playerScaling;

         [color= #993333;]int currentPlayer [color= #339933;]= [color= #cc66cc;]0;

 

         bool rocketFlying [color= #339933;]= [color= #000000; font-weight: bold;]false;

         Vector2 rocketPosition;        

         Vector2 rocketDirection;

         [color= #993333;]float rocketAngle;

         [color= #993333;]float rocketScaling [color= #339933;]= [color= #cc66cc;]0.1f;

 

         public Game1[color= #009900;]([color= #009900;])

         [color= #009900;]{

             graphics [color= #339933;]= new GraphicsDeviceManager[color= #009900;](this[color= #009900;]);

             Content.[color= #202020;]RootDirectory [color= #339933;]= [color= #ff0000;]"Content";

         [color= #009900;]}

 

         protected override [color= #993333;]void Initialize[color= #009900;]([color= #009900;])

         [color= #009900;]{

             graphics.[color= #202020;]PreferredBackBufferWidth [color= #339933;]= [color= #cc66cc;]500;

             graphics.[color= #202020;]PreferredBackBufferHeight [color= #339933;]= [color= #cc66cc;]500;

             graphics.[color= #202020;]IsFullScreen [color= #339933;]= [color= #000000; font-weight: bold;]false;

             graphics.[color= #202020;]ApplyChanges[color= #009900;]([color= #009900;]);

             Window.[color= #202020;]Title [color= #339933;]= [color= #ff0000;]"Riemer's 2D XNA Tutorial";

 

             base.[color= #202020;]Initialize[color= #009900;]([color= #009900;]);

         [color= #009900;]}

 

         protected override [color= #993333;]void LoadContent[color= #009900;]([color= #009900;])

         [color= #009900;]{

             device [color= #339933;]= graphics.[color= #202020;]GraphicsDevice;

             spriteBatch [color= #339933;]= new SpriteBatch[color= #009900;](device[color= #009900;]);

 

             screenWidth [color= #339933;]= device.[color= #202020;]PresentationParameters.[color= #202020;]BackBufferWidth;

             screenHeight [color= #339933;]= device.[color= #202020;]PresentationParameters.[color= #202020;]BackBufferHeight;

 

 

            backgroundTexture [color= #339933;]= Content.[color= #202020;]Load<Texture2D> [color= #009900;]([color= #ff0000;]"background"[color= #009900;]);

            foregroundTexture [color= #339933;]= Content.[color= #202020;]Load<Texture2D> [color= #009900;]([color= #ff0000;]"foreground"[color= #009900;]);

            carriageTexture [color= #339933;]= Content.[color= #202020;]Load<Texture2D> [color= #009900;]([color= #ff0000;]"carriage"[color= #009900;]);

            cannonTexture [color= #339933;]= Content.[color= #202020;]Load<Texture2D> [color= #009900;]([color= #ff0000;]"cannon"[color= #009900;]);

 

            rocketTexture [color= #339933;]= Content.[color= #202020;]Load<Texture2D> [color= #009900;]([color= #ff0000;]"rocket"[color= #009900;]);

 

            font [color= #339933;]= Content.[color= #202020;]Load<SpriteFont> [color= #009900;]([color= #ff0000;]"myFont"[color= #009900;]);

            SetUpPlayers[color= #009900;]([color= #009900;]);

            playerScaling [color= #339933;]= [color= #cc66cc;]40.0f [color= #339933;]/ [color= #009900;]([color= #993333;]float[color= #009900;])carriageTexture.[color= #202020;]Width;

        [color= #009900;]}

 

        private [color= #993333;]void SetUpPlayers[color= #009900;]([color= #009900;])

        [color= #009900;]{

            Color[color= #009900;][[color= #009900;]] playerColors [color= #339933;]= new Color[color= #009900;][[color= #cc66cc;]10[color= #009900;]];

            playerColors[color= #009900;][[color= #cc66cc;]0[color= #009900;]] [color= #339933;]= Color.[color= #202020;]Red;

            playerColors[color= #009900;][[color= #cc66cc;]1[color= #009900;]] [color= #339933;]= Color.[color= #202020;]Green;

            playerColors[color= #009900;][[color= #cc66cc;]2[color= #009900;]] [color= #339933;]= Color.[color= #202020;]Blue;

            playerColors[color= #009900;][[color= #cc66cc;]3[color= #009900;]] [color= #339933;]= Color.[color= #202020;]Purple;

            playerColors[color= #009900;][[color= #cc66cc;]4[color= #009900;]] [color= #339933;]= Color.[color= #202020;]Orange;

            playerColors[color= #009900;][[color= #cc66cc;]5[color= #009900;]] [color= #339933;]= Color.[color= #202020;]Indigo;

            playerColors[color= #009900;][[color= #cc66cc;]6[color= #009900;]] [color= #339933;]= Color.[color= #202020;]Yellow;

            playerColors[color= #009900;][[color= #cc66cc;]7[color= #009900;]] [color= #339933;]= Color.[color= #202020;]SaddleBrown;

            playerColors[color= #009900;][[color= #cc66cc;]8[color= #009900;]] [color= #339933;]= Color.[color= #202020;]Tomato;

            playerColors[color= #009900;][[color= #cc66cc;]9[color= #009900;]] [color= #339933;]= Color.[color= #202020;]Turquoise;

 

            players [color= #339933;]= new PlayerData[color= #009900;][numberOfPlayers[color= #009900;]];

            [color= #b1b100;]for [color= #009900;]([color= #993333;]int i [color= #339933;]= [color= #cc66cc;]0; i < numberOfPlayers; i[color= #339933;]++[color= #009900;])

            [color= #009900;]{

                players[color= #009900;][i[color= #009900;]].[color= #202020;]IsAlive [color= #339933;]= [color= #000000; font-weight: bold;]true;

                players[color= #009900;][i[color= #009900;]].[color= #202020;]Color [color= #339933;]= playerColors[color= #009900;][i[color= #009900;]];

                players[color= #009900;][i[color= #009900;]].[color= #202020;]Angle [color= #339933;]= MathHelper.[color= #202020;]ToRadians[color= #009900;]([color= #cc66cc;]90[color= #009900;]);

                players[color= #009900;][i[color= #009900;]].[color= #202020;]Power [color= #339933;]= [color= #cc66cc;]100;                

            [color= #009900;]}

 

            players[color= #009900;][[color= #cc66cc;]0[color= #009900;]].[color= #202020;]Position [color= #339933;]= new Vector2[color= #009900;]([color= #cc66cc;]100, [color= #cc66cc;]193[color= #009900;]);

            players[color= #009900;][[color= #cc66cc;]1[color= #009900;]].[color= #202020;]Position [color= #339933;]= new Vector2[color= #009900;]([color= #cc66cc;]200, [color= #cc66cc;]212[color= #009900;]);

            players[color= #009900;][[color= #cc66cc;]2[color= #009900;]].[color= #202020;]Position [color= #339933;]= new Vector2[color= #009900;]([color= #cc66cc;]300, [color= #cc66cc;]361[color= #009900;]);

            players[color= #009900;][[color= #cc66cc;]3[color= #009900;]].[color= #202020;]Position [color= #339933;]= new Vector2[color= #009900;]([color= #cc66cc;]400, [color= #cc66cc;]164[color= #009900;]);

        [color= #009900;]}

 

        protected override [color= #993333;]void UnloadContent[color= #009900;]([color= #009900;])

        [color= #009900;]{

        [color= #009900;]}

 

        protected override [color= #993333;]void Update[color= #009900;](GameTime gameTime[color= #009900;])

        [color= #009900;]{

            [color= #b1b100;]if [color= #009900;](GamePad.[color= #202020;]GetState[color= #009900;](PlayerIndex.[color= #202020;]One[color= #009900;]).[color= #202020;]Buttons.[color= #202020;]Back [color= #339933;]== ButtonState.[color= #202020;]Pressed[color= #009900;])

                this.[color= #202020;]Exit[color= #009900;]([color= #009900;]);

 

            ProcessKeyboard[color= #009900;]([color= #009900;]);

 

            base.[color= #202020;]Update[color= #009900;](gameTime[color= #009900;]);

        [color= #009900;]}

 

        private [color= #993333;]void ProcessKeyboard[color= #009900;]([color= #009900;])

        [color= #009900;]{

            KeyboardState keybState [color= #339933;]= Keyboard.[color= #202020;]GetState[color= #009900;]([color= #009900;]);

            [color= #b1b100;]if [color= #009900;](keybState.[color= #202020;]IsKeyDown[color= #009900;](Keys.[color= #202020;]Left[color= #009900;])[color= #009900;])

                players[color= #009900;][currentPlayer[color= #009900;]].[color= #202020;]Angle [color= #339933;]-= [color= #cc66cc;]0.01f;

            [color= #b1b100;]if [color= #009900;](keybState.[color= #202020;]IsKeyDown[color= #009900;](Keys.[color= #202020;]Right[color= #009900;])[color= #009900;])

                players[color= #009900;][currentPlayer[color= #009900;]].[color= #202020;]Angle [color= #339933;]+= [color= #cc66cc;]0.01f;

 

            [color= #b1b100;]if [color= #009900;](players[color= #009900;][currentPlayer[color= #009900;]].[color= #202020;]Angle > MathHelper.[color= #202020;]PiOver2[color= #009900;])

                players[color= #009900;][currentPlayer[color= #009900;]].[color= #202020;]Angle [color= #339933;]= [color= #339933;]-MathHelper.[color= #202020;]PiOver2;

            [color= #b1b100;]if [color= #009900;](players[color= #009900;][currentPlayer[color= #009900;]].[color= #202020;]Angle < [color= #339933;]-MathHelper.[color= #202020;]PiOver2[color= #009900;])

                players[color= #009900;][currentPlayer[color= #009900;]].[color= #202020;]Angle [color= #339933;]= MathHelper.[color= #202020;]PiOver2;

 

            [color= #b1b100;]if [color= #009900;](keybState.[color= #202020;]IsKeyDown[color= #009900;](Keys.[color= #202020;]Down[color= #009900;])[color= #009900;])

                players[color= #009900;][currentPlayer[color= #009900;]].[color= #202020;]Power [color= #339933;]-= [color= #cc66cc;]1;

            [color= #b1b100;]if [color= #009900;](keybState.[color= #202020;]IsKeyDown[color= #009900;](Keys.[color= #202020;]Up[color= #009900;])[color= #009900;])

                players[color= #009900;][currentPlayer[color= #009900;]].[color= #202020;]Power [color= #339933;]+= [color= #cc66cc;]1;

            [color= #b1b100;]if [color= #009900;](keybState.[color= #202020;]IsKeyDown[color= #009900;](Keys.[color= #202020;]PageDown[color= #009900;])[color= #009900;])

                players[color= #009900;][currentPlayer[color= #009900;]].[color= #202020;]Power [color= #339933;]-= [color= #cc66cc;]20;

            [color= #b1b100;]if [color= #009900;](keybState.[color= #202020;]IsKeyDown[color= #009900;](Keys.[color= #202020;]PageUp[color= #009900;])[color= #009900;])

                players[color= #009900;][currentPlayer[color= #009900;]].[color= #202020;]Power [color= #339933;]+= [color= #cc66cc;]20;

 

            [color= #b1b100;]if [color= #009900;](players[color= #009900;][currentPlayer[color= #009900;]].[color= #202020;]Power > [color= #cc66cc;]1000[color= #009900;])

                players[color= #009900;][currentPlayer[color= #009900;]].[color= #202020;]Power [color= #339933;]= [color= #cc66cc;]1000;

            [color= #b1b100;]if [color= #009900;](players[color= #009900;][currentPlayer[color= #009900;]].[color= #202020;]Power < [color= #cc66cc;]0[color= #009900;])

                players[color= #009900;][currentPlayer[color= #009900;]].[color= #202020;]Power [color= #339933;]= [color= #cc66cc;]0;

 

 

             [color= #b1b100;]if [color= #009900;](keybState.[color= #202020;]IsKeyDown[color= #009900;](Keys.[color= #202020;]Enter[color= #009900;]) || keybState.[color= #202020;]IsKeyDown[color= #009900;](Keys.[color= #202020;]Space[color= #009900;])[color= #009900;])

             [color= #009900;]{

                 rocketFlying [color= #339933;]= [color= #000000; font-weight: bold;]true;

                 rocketPosition [color= #339933;]= players[color= #009900;][currentPlayer[color= #009900;]].[color= #202020;]Position;

                 rocketPosition.[color= #202020;]X [color= #339933;]+= [color= #cc66cc;]20;

                 rocketPosition.[color= #202020;]Y [color= #339933;]-= [color= #cc66cc;]10;

                 rocketAngle [color= #339933;]= players[color= #009900;][currentPlayer[color= #009900;]].[color= #202020;]Angle;

                 Vector2 up [color= #339933;]= new Vector2[color= #009900;]([color= #cc66cc;]0, [color= #cc66cc;]-1[color= #009900;]);

                 Matrix rotMatrix [color= #339933;]= Matrix.[color= #202020;]CreateRotationZ[color= #009900;](rocketAngle[color= #009900;]);

                 rocketDirection [color= #339933;]= Vector2.[color= #202020;]Transform[color= #009900;](up, rotMatrix[color= #009900;]);

                 rocketDirection [color= #339933;]*= players[color= #009900;][currentPlayer[color= #009900;]].[color= #202020;]Power [color= #339933;]/ [color= #cc66cc;]50.0f;

             [color= #009900;]}

         [color= #009900;]}

 

         protected override [color= #993333;]void Draw[color= #009900;](GameTime gameTime[color= #009900;])

         [color= #009900;]{

             graphics.[color= #202020;]GraphicsDevice.[color= #202020;]Clear[color= #009900;](Color.[color= #202020;]CornflowerBlue[color= #009900;]);

 

             spriteBatch.[color= #202020;]Begin[color= #009900;]([color= #009900;]);

             DrawScenery[color= #009900;]([color= #009900;]);

             DrawPlayers[color= #009900;]([color= #009900;]);

             DrawText[color= #009900;]([color= #009900;]);

             DrawRocket[color= #009900;]([color= #009900;]);

             spriteBatch.[color= #202020;]End[color= #009900;]([color= #009900;]);

 

             base.[color= #202020;]Draw[color= #009900;](gameTime[color= #009900;]);

         [color= #009900;]}

 

         private [color= #993333;]void DrawScenery[color= #009900;]([color= #009900;])

         [color= #009900;]{

             Rectangle screenRectangle [color= #339933;]= new Rectangle[color= #009900;]([color= #cc66cc;]0, [color= #cc66cc;]0, screenWidth, screenHeight[color= #009900;]);

             spriteBatch.[color= #202020;]Draw[color= #009900;](backgroundTexture, screenRectangle, Color.[color= #202020;]White[color= #009900;]);

             spriteBatch.[color= #202020;]Draw[color= #009900;](foregroundTexture, screenRectangle, Color.[color= #202020;]White[color= #009900;]);

         [color= #009900;]}

 

         private [color= #993333;]void DrawPlayers[color= #009900;]([color= #009900;])

         [color= #009900;]{

             foreach [color= #009900;](PlayerData player in players[color= #009900;])

             [color= #009900;]{

                 [color= #b1b100;]if [color= #009900;](player.[color= #202020;]IsAlive[color= #009900;])

                 [color= #009900;]{

                     [color= #993333;]int xPos [color= #339933;]= [color= #009900;]([color= #993333;]int[color= #009900;])player.[color= #202020;]Position.[color= #202020;]X;

                     [color= #993333;]int yPos [color= #339933;]= [color= #009900;]([color= #993333;]int[color= #009900;])player.[color= #202020;]Position.[color= #202020;]Y;

                     Vector2 cannonOrigin [color= #339933;]= new Vector2[color= #009900;]([color= #cc66cc;]11, [color= #cc66cc;]50[color= #009900;]);

 

                     spriteBatch.[color= #202020;]Draw[color= #009900;](cannonTexture, new Vector2[color= #009900;](xPos [color= #339933;]+ [color= #cc66cc;]20, yPos [color= #339933;]- [color= #cc66cc;]10[color= #009900;]), [color= #000000; font-weight: bold;]null, p
layer.[color= #202020;]Color, player.[color= #202020;]Angle, cannonOrigin, playerScaling, SpriteEffects.[color= #202020;]None, [color= #cc66cc;]1[color= #009900;]);

                     spriteBatch.[color= #202020;]Draw[color= #009900;](carriageTexture, player.[color= #202020;]Position, [color= #000000; font-weight: bold;]null, player.[color= #202020;]Color, [color= #cc66cc;]0, 
new Vector2[color= #009900;]([color= #cc66cc;]0, carriageTexture.[color= #202020;]Height[color= #009900;]), playerScaling, SpriteEffects.[color= #202020;]None, [color= #cc66cc;]0[color= #009900;]);

                 [color= #009900;]}

             [color= #009900;]}

         [color= #009900;]}

 

         private [color= #993333;]void DrawText[color= #009900;]([color= #009900;])

         [color= #009900;]{

             PlayerData player [color= #339933;]= players[color= #009900;][currentPlayer[color= #009900;]];

             [color= #993333;]int currentAngle [color= #339933;]= [color= #009900;]([color= #993333;]int[color= #009900;])MathHelper.[color= #202020;]ToDegrees[color= #009900;](player.[color= #202020;]Angle[color= #009900;]);

             spriteBatch.[color= #202020;]DrawString[color= #009900;](font, [color= #ff0000;]"Cannon angle: " [color= #339933;]+ currentAngle.[color= #202020;]ToString[color= #009900;]([color= #009900;]), new Vecto
r2[color= #009900;]([color= #cc66cc;]20, [color= #cc66cc;]20[color= #009900;]), player.[color= #202020;]Color[color= #009900;]);

             spriteBatch.[color= #202020;]DrawString[color= #009900;](font, [color= #ff0000;]"Cannon power: " [color= #339933;]+ player.[color= #202020;]Power.[color= #202020;]ToString[color= #009900;]([color= #009900;]), new Vecto
r2[color= #009900;]([color= #cc66cc;]20, [color= #cc66cc;]45[color= #009900;]), player.[color= #202020;]Color[color= #009900;]);

         [color= #009900;]}

 

         private [color= #993333;]void DrawRocket[color= #009900;]([color= #009900;])

         [color= #009900;]{

             [color= #b1b100;]if [color= #009900;](rocketFlying[color= #009900;])

                 spriteBatch.[color= #202020;]Draw[color= #009900;](rocketTexture, rocketPosition, [color= #000000; font-weight: bold;]null, players[color= #009900;][currentPlayer[color= #009900;]].[color= #202020;]C
olor, rocketAngle, new Vector2[color= #009900;]([color= #cc66cc;]42, [color= #cc66cc;]240[color= #009900;]), [color= #cc66cc;]0.1f, SpriteEffects.[color= #202020;]None, [color= #cc66cc;]1[color= #009900;]);

         [color= #009900;]}

     [color= #009900;]}

 [color= #009900;]}

الملفات الازمة للدرس:

rocket.zip

نسخة عن الدرس بصيغة ال PDF:

Learn_Xna8.pdf

#3

أهلا بك أخي .

اقتباس
لقد ذكرتني بأيام الـXNA الجميله

و اليوم ؟؟ أين أيامك؟

#4

السلام عليكم

من فضلك انا لم افهم شئ فى امر التدوير rotation

لانى نسيت المفاهيم النظريه للجرافيك

اولا لماذا هذه القيم

Vector2 up = new Vector2(0, -1);

ثانيا لماذا هذا السطر

Matrix rotMatrix = Matrix.CreateRotationZ(rocketAngle);

وجزاكم الله كل خير

hh.jpg
#5

و عليكم السلام ورحمة الله و بركاته

سأحاول التوضيح لك إن شاء الله..

نعلم أن الإتجاه في الرسم الحاسوبي, يتم تمثيله بإستخدام متجه Vector أو زوج مرتب (X,Y) في الرياضيات, إذن يجب علينا أن نخزن إتجاه الصاروخ

في هذا ال Vector, لكي نتوصل إلى هذا المتجه يجب أن يكون لدينا متجه سابق يعبر عن الإتجاه السابق.

في حالتنا هذه سوف يكون المتجه السابق (و الذي يمثل المتجه الأول في لحظة إطلاق الصاروخ) في نفس الإتجاه الذي تشير إليه زاوية المدفع, بما أننا نعرف زاوية المدفع بإمكاننا إستنتاج المتجه الذي سوف يعبر عن الصاروخ, كما ذكرنا سابقا أنه يجب أن يكون لدينا متجه سابق و في هذه الحالة قمنا بإفتراض أن المحور Y السالب هو المحور السابق وهذا سبب وجود هذا السطر

Vector2 up = new Vector2(0, -1);

الآن نريد تدوير هذا المتجه بالزاوية المعروفة لدينا,

مره أخرى نراجع الرسم الحاسوبي, نعرف أنه إذا أردنا أن ننقل, ندور, نكبر (بشكل عام نحول) نقطة في المستوى الديكارتي أو في الفضاء نقوم بضرب هذه النقطة (الزوج المرتب, ال Vector) نقوم بضربها (ضرب مصفوفات) بمصفوفة التحويل الخاصة بهذا التدوير , لإنشاء مصفوفة التدوير هذه إستخدمنا السطر التالي

Matrix rotMatrix = Matrix.CreateRotationZ(rocketAngle);

أرجو أن أكون قد أوصلت الفكره بدون تعقيد .

:)

#6

السلام عليكم

جزاكم الله كل خير الامر الان وضح قليلا

تم تعديل هذه المشاركة بواسطة SomeOne83 في 17 مارس 2009 في 04:06

hh.jpg

مواضيع مشابهة