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

الدرس الحادي عشر من سلسلة دروس تعلم ال Xna

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

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

الدرس الحادي عشر

أهلا بكم في الدرس الحادي عشر من سلسلة دروس تعلم الXna , سوف نقوم في هذا الدرس بعمل رسم للألوان في خامة لكل بكسل على حدة.

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

لقد قمنا في الدروس السابقه بإرتكاب خطأ كبير (بشكل مقصود طبعا) ألا وهو أننا قمنا بإستخدام صورة للأرضيه طولها 500بكسل على محور Y. و لكننا في هذا الدرس سوف نستخدم طريقة افضل من تلك ألا وهي اننا سوف نقوم بتعرف إنحدار “Slope” التضاريس بأنفسنا , وسوف نقوم بإنشاء صورة الأرضيه الأمامية (التضاريس) بشكل ديناميكي.

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

ناتج دالة GenerateTerrainContour سوف يكون ببساطة مصفوفة من الأرقام الصحيحة “Integers” تخزن قيمة واحدة من الإحداثي Y لكل إحداثي X في الشاشة. بما أننا سوف نحتاج هذه المصفوفة في الكود الخاص بنا فيما بعد, إذن دعنا نضيف المتغير التالي في أعلى الكود:

 int[] terrainContour;

بما أن قيم الإحداثيات Y هي أرقام صحيحة, لذلك إستخدمنا مصفوفة من الأرقام الصحيحه “ints” لتخزينها.

بعد ذلك في دالة GenerateTerrainContour , التي تقوم بتجهيز هذه المصفوفة و تعبئتها بالقيم. كما قلنا سابقا فإننا سوف نبدأ بنسخة بسيطة جدا :

 private void GenerateTerrainContour()
 {
	 terrainContour = new int[screenWidth];

	 for (int x = 0; x < screenWidth; x++)
		 terrainContour[x] = screenHeight / 2;
 }

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

دعنا ننتقل إلى الدالة CreateForeground. هذه الدالة يجب أن تقوم بإنشاء خامة الأرضية الأمامية, بناء على محتويات المصفوفة terrainContour :

 private void CreateForeground()
 {
	 Color[] foregroundColors = new Color[screenWidth * screenHeight];

	 for (int x = 0; x < screenWidth; x++)
	 {
		 for (int y = 0; y < screenHeight; y++)
		 {
			 if (y > terrainContour[x])
				 foregroundColors[x + y * screenWidth] = Color.Green;
			 else						
				 foregroundColors[x + y * screenWidth] = Color.TransparentBlack;
		 }
	 }
 }

السطر الأول يقوم بإنشاء مصفوفة, من أجل تخزين الألوان. قمنا بتجيهزها من أجل تخزين لون لكل بسكل على الشاشة.

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

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

 foregroundTexture = new Texture2D(device, screenWidth, screenHeight, 1, TextureUsage.None, SurfaceFormat.Color);
 foregroundTexture.SetData(foregroundColors);

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

السطر الثاني يقوم عمليا بنسخ الألوان من المصفوفة إلى الذاكرة في بطاقة الرسوميات.

الآن في دالة LoadContent , إبحث عن السطر الذي يقوم بتحميل صورة الأرضية الأمامية “foreground” من الملف, و قم بحذفها. و قم بوضع الأسطر التالية في نهاية الدالة:

 GenerateTerrainContour();
 CreateForeground();

الآن قم بتشغيل الكود! يجب أن ترى كما في الصورة التالية:

post-133895-1236877732_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;

         Texture2D smokeTexture;

         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;

 

 

        List<Vector2> smokeList [color= #339933;]= new List<Vector2> [color= #009900;]([color= #009900;]);

        Random randomizer [color= #339933;]= new Random[color= #009900;]([color= #009900;]);

 

         [color= #993333;]int[color= #009900;][[color= #009900;]] terrainContour;

 

         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;]);

            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;]);

            smokeTexture [color= #339933;]= Content.[color= #202020;]Load<Texture2D> [color= #009900;]([color= #ff0000;]"smoke"[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;

 

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

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

         [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;]}

 

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

         [color= #009900;]{

             terrainContour [color= #339933;]= new [color= #993333;]int[color= #009900;][screenWidth[color= #009900;]];

 

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

                 terrainContour[color= #009900;][x[color= #009900;]] [color= #339933;]= screenHeight [color= #339933;]/ [color= #cc66cc;]2;

         [color= #009900;]}

 

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

         [color= #009900;]{

             Color[color= #009900;][[color= #009900;]] foregroundColors [color= #339933;]= new Color[color= #009900;][screenWidth [color= #339933;]* screenHeight[color= #009900;]];

 

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

             [color= #009900;]{

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

                 [color= #009900;]{

                     [color= #b1b100;]if [color= #009900;](y > terrainContour[color= #009900;][x[color= #009900;]][color= #009900;])

                         foregroundColors[color= #009900;][x [color= #339933;]+ y [color= #339933;]* screenWidth[color= #009900;]] [color= #339933;]= Color.[color= #202020;]Green;

                     [color= #b1b100;]else                        

                         foregroundColors[color= #009900;][x [color= #339933;]+ y [color= #339933;]* screenWidth[color= #009900;]] [color= #339933;]= Color.[color= #202020;]TransparentBlack;

                 [color= #009900;]}

             [color= #009900;]}

 

             foregroundTexture [color= #339933;]= new Texture2D[color= #009900;](device, screenWidth, screenHeight, [color= #cc66cc;]1, TextureUsa
ge.[color= #202020;]None, SurfaceFormat.[color= #202020;]Color[color= #009900;]);

             foregroundTexture.[color= #202020;]SetData[color= #009900;](foregroundColors[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;]);

             UpdateRocket[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;]}

 

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

         [color= #009900;]{

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

             [color= #009900;]{

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

                 rocketDirection [color= #339933;]+= gravity [color= #339933;]/ [color= #cc66cc;]10.0f;

                 rocketPosition [color= #339933;]+= rocketDirection;

                 rocketAngle [color= #339933;]= [color= #009900;]([color= #993333;]float[color= #009900;])Math.[color= #202020;]Atan2[color= #009900;](rocketDirection.[color= #202020;]X, [color= #339933;]-rocketDirection.[color= #202020;]Y[color= #009900;]);

 

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

                 [color= #009900;]{

                     Vector2 smokePos [color= #339933;]= rocketPosition;

                     smokePos.[color= #202020;]X [color= #339933;]+= randomizer.[color= #202020;]Next[color= #009900;]([color= #cc66cc;]10[color= #009900;]) [color= #339933;]- [color= #cc66cc;]5;

                     smokePos.[color= #202020;]Y [color= #339933;]+= randomizer.[color= #202020;]Next[color= #009900;]([color= #cc66cc;]10[color= #009900;]) [color= #339933;]- [color= #cc66cc;]5;

                     smokeList.[color= #202020;]Add[color= #009900;](smokePos[color= #009900;]);

                 [color= #009900;]}

             [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;]);

             DrawSmoke[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;]}

 

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

         [color= #009900;]{

             foreach [color= #009900;](Vector2 smokePos in smokeList[color= #009900;])

                 spriteBatch.[color= #202020;]Draw[color= #009900;](smokeTexture, smokePos, [color= #000000; font-weight: bold;]null, Color.[color= #202020;]White, [color= #cc66cc;]0, new Vector2[color= #009900;]([color= #cc66cc;]40,
 [color= #cc66cc;]35[color= #009900;]), [color= #cc66cc;]0.2f, SpriteEffects.[color= #202020;]None, [color= #cc66cc;]1[color= #009900;]);

         [color= #009900;]}

     [color= #009900;]}

 [color= #009900;]}

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

Learn_Xna11.pdf

#2

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

وأنا متابع معكم درساً بدرس ..

بس ممكن سؤال؟؟

تظهر عندي المشكلة التالية أثناء التشغيل .. علماً أني استخدم Visual Studio 2010 و XNA 4.0

The name 'TextureUsage' does not exist in the current context

فما الحال جزاكم الله خيراً كثيراً ..

#3
mamprogr كتب:

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

وأنا متابع معكم درساً بدرس ..

بس ممكن سؤال؟؟

تظهر عندي المشكلة التالية أثناء التشغيل .. علماً أني استخدم Visual Studio 2010 و XNA 4.0

The name 'TextureUsage' does not exist in the current context

فما الحال جزاكم الله خيراً كثيراً ..

على الأغلب أن ال TextureUsage غير مدعومة في ال Xna 4، لاحظ أن الدروس تشرع عن ال Xna2 أو 3.

حاول أن تستخدم نسخة أقدم، أو ربما هنالك بديل عن هذا الباراميتر

طبعا المشكلة في هذا السطر:

 foregroundTexture = new Texture2D(device, screenWidth, screenHeight, 1, TextureUsage.None, SurfaceFormat.Color);

للأسف ليس لدي Xna 4 على الجهاز، لكنت أوجدت الحل بشكل دقيق

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