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

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

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

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

الدرس التاسع

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

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

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

دعنا ننشئ دالة جديدة لكي تقوم بهذه الوظيفة. بما أن هذه الدالة لن ترسم شيئا, ولكنا نحتاج إلى إستدعائها بشكل متكرر إذن سوف نقوم بإستدعائها من الدالة Update , بهذا سوف نتأكد أن الدالة تم إستدعائها 60 مره في الثانية.

 private void UpdateRocket()
 {
	 if (rocketFlying)
	 {
		 rocketPosition += rocketDirection;
	 }
 }

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

UpdateRocket();

الآن قم بتشغيل الكود و أطلق الصاروخ! سوف يطير الصاروخ في خط مستقيم بسرعة تعتمد على طاقة إطلاق الصاروخ.

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

 Vector2 gravity = new Vector2(0, 1);
 rocketDirection += gravity / 10.0f;
 rocketPosition += rocketDirection;

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

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

و ذلك لان ال SpriteBatch يقوم برسم الصاروخ بعد تدويره بناء على القيمة rocketAngle, و عندما قمنا بتغيير إتجاه الصاروخ rocketDirection لم نقم بتغير قيمة الزاوية بعد. إذن ما نحتاج معرفته هو : إذا كان الإتجاه معلوما, ما هي الزاوية المرتبطه بهذا الإتجاه.؟

لإيجاد الزاوية, ألق نظرة على الصورة التاليه, على الجانب الأيسر:

post-133895-1236538892_thumb.jpg

الآن, إرجع إلى ايام الثانوية :huh: , كان هنالك بعض من القوانين البسيطة التي يجب أن تكون قد حفظتهم. هذا واحد منهم:

"في المثلث القائم الزاوية, تستطيع أن تجد قيمة الزاوية عن طريق تقسيم طول الضلع المقابل على طول الضلع المجاور, و بعدها أخذ الظل المعكوس “Atan” لناتج القسمة".

تم إشتقاق ذلك من تعريف الجيب و جيب التمام و الظل.

بتطبيق ذلك على مثالنا, تستطيع إيجاد الزاوية بين الإتجاه و محور X المجاور عن طريق أخذ الظل المعكوس “Atan” لل Direction.Y/Direction.X . هذا ما وضح في الرسم السابق الجهة اليسرى: إبتداء من من الإتجاه المعروض هناك, و نريد أن نجد الزاوية بين الإتجاه و محور ال X . ذلك سوف يتم من خلال الكود التالي :

Math.Atan(Direction.Y/Direction.X)

هذه هي الحالة العامة, و هي التي تعلمناها في رياضيات الثانوية. في حالة الصاروخ الخاص بنا, هناك فرقين بسيطين قمت بتعليمهم بالخط العريض:

• أننا نريد الزاوية بين الإتجاه ومحور ال Y

• في ال Xna , المحور إلى الأعلى يمثل المحور Y السالب

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

 rocketAngle = (float)Math.Atan2(rocketDirection.X, -rocketDirection.Y);

بدلا من إستخدام الداله Atan, سوف نحتاج إلى إستخدام الدالة Atan2, و الفرق بينهما أن في الدالة Atan , يجب عليك إرسال ناتج عملية القسمة كوسيط. بما انه من المعروف أن -X/-Y لها نفس نتيجة X/Y , سيتطلب هذا عملية فحص إضافية “if-check”. عملية الفحص متوفرة في الدالة Atan2, مما يتيح لنا تحديد كل من المكونين بشكل منفصل.

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

post-133895-1236538914_thumb.jpg

في هذا الدرس و سابقه, رأينا كيفية إشتقاق الزاوية من الإتجاه و العكس. سوف نحتاج هذه المعلومات في برمجة الألعاب الثنائية و الثلاثية الأبعاد.

التمرين : و اضح أننا بحاجة لمراجعة تمارين الثانوية لكي نستطيع برمجة الألعاب :lol: .

كود المشروع حتى الآن:

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

 

             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= #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;]}

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

Learn_Xna9.pdf

#2
اقتباس
التمرين : و اضح أننا بحاجة لمراجعة تمارين الثانوية لكي نستطيع برمجة الألعاب

:lol:

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

انشغلت اليومين الماضيين .. وسأقوم بتطبيق الدرس هذا والسابق .. الموضوع مهم جدا جدا , وان شاء الله نستوعبه من خلال هذه السلسلة ;)

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3
اقتباس
والله معك حق ,, موضوع المتجهات والامور المتعلّقة بها , بالذات مقلقني , أملي في مادة سأدرسها هذا الترم ان شاء الله , ( أخشى أن يتم الغاءها ) , الامور النظرية سهلة .. لكن الجانب العملي يخيفني .. مشلكتي هي في الخلط بين المتجهات وأمور أخرى ( مشاكل عويصة) ..

صراحة أنه فعلا من يريد برمجة الألعاب عليه أن يكون فوق "الجيد جدا" في الفيزياء.

#4

بالتوفيق للجميع

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