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

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

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

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

الدرس السادس

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

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

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

 int currentPlayer = 0;

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

 private void ProcessKeyboard()
 {
	 KeyboardState keybState = Keyboard.GetState();
	 if (keybState.IsKeyDown(Keys.Left))
		 players[currentPlayer].Angle -= 0.01f;
	 if (keybState.IsKeyDown(Keys.Right))
		 players[currentPlayer].Angle += 0.01f;
 }

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

الآن دعنا لا ننسى إضافة الإستدعاء لهذه الدالة من داخل دالة ال Update, لنتأكد أنه قد تم قراءة لوحة المفاتيح 60 مرة في الثانية الواحدة:

 ProcessKeyboard();

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

if (players[currentPlayer].Angle > MathHelper.PiOver2)
	 players[currentPlayer].Angle = -MathHelper.PiOver2;
 if (players[currentPlayer].Angle < -MathHelper.PiOver2)
	 players[currentPlayer].Angle = MathHelper.PiOver2;

في هذا الكود, يجب أن نتذكر أن ال Pi=3.14 مقابلة للزاوية 180, إذن PiOver2 مقابلة للزاوية 90 درجة. إذن ببساطة: إذا كان المدفع بزاوية 90 درجة (بمعنى أنه موجه أفقيا إلى اليمين), و تم ضغط زر السهم الأيمن, سوف تتغير الزاوية إلى -90 درجة بمعنى أن المدفع سوف يشير إلي اليسار. السطرين الأخيرين يقومان بنفس العمل و لكن للجهة الأخرى. قم بتنفيذ الكود ولاحظ !

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

if (keybState.IsKeyDown(Keys.Down))
	 players[currentPlayer].Power -= 1;
 if (keybState.IsKeyDown(Keys.Up))
	 players[currentPlayer].Power += 1;
 if (keybState.IsKeyDown(Keys.PageDown))
	 players[currentPlayer].Power -= 20;
 if (keybState.IsKeyDown(Keys.PageUp))
	 players[currentPlayer].Power += 20;

 if (players[currentPlayer].Power > 1000)
	 players[currentPlayer].Power = 1000;
 if (players[currentPlayer].Power < 0)
	 players[currentPlayer].Power = 0;

عندما يقوم المستخدم بضغط زر السهم الأعلى و الأسفل, سوف يتم زيادة طاقة المدفع بواحد.

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

الأسطر الأربعة الأخيرة ببساطة تقوم بتحديد قيمة طاقة المدفع في المجال من 0 إلى 1000.

post-133895-1236092151_thumb.jpg

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

كتمرين: حاول ان تجعل المدفع يستجيب لأزرار أخرى , مثلا الأحرف A,D بدلا من الأسهم.

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

 using [color= #990000;]System[color= #339933;];

 using [color= #990000;]System[color= #339933;].Collections[color= #339933;].Generic[color= #339933;];

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

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

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

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

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

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

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

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

 

 namespace XNAtutorial

 [color= #009900;]{

     [color= #000000; font-weight: bold;]public struct PlayerData

     [color= #009900;]{

         [color= #000000; font-weight: bold;]public Vector2 Position[color= #339933;];

         [color= #000000; font-weight: bold;]public bool IsAlive[color= #339933;];

         [color= #000000; font-weight: bold;]public Color Color[color= #339933;];

         [color= #000000; font-weight: bold;]public float Angle[color= #339933;];

         [color= #000000; font-weight: bold;]public float Power[color= #339933;];

     [color= #009900;]}

 

     [color= #000000; font-weight: bold;]public [color= #000000; font-weight: bold;]class Game1 [color= #339933;]: Microsoft[color= #339933;].Xna[color= #339933;].Framework[color= #339933;].Game

     [color= #009900;]{

         GraphicsDeviceManager graphics[color= #339933;];

         SpriteBatch spriteBatch[color= #339933;];

         GraphicsDevice device[color= #339933;];

 

         int screenWidth[color= #339933;];

         int screenHeight[color= #339933;];

 

         Texture2D backgroundTexture[color= #339933;];

         Texture2D foregroundTexture[color= #339933;];

         Texture2D carriageTexture[color= #339933;];

         Texture2D cannonTexture[color= #339933;];

 

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

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

         float playerScaling[color= #339933;];

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

 

         [color= #000000; font-weight: bold;]public Game1[color= #009900;]([color= #009900;])

         [color= #009900;]{

             graphics [color= #339933;]= [color= #000000; font-weight: bold;]new GraphicsDeviceManager[color= #009900;](this[color= #009900;])[color= #339933;];

             Content[color= #339933;].RootDirectory [color= #339933;]= [color= #0000ff;]"Content"[color= #339933;];

         [color= #009900;]}

 

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

         [color= #009900;]{

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

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

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

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

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

 

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

         [color= #009900;]}

 

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

         [color= #009900;]{

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

             spriteBatch [color= #339933;]= [color= #000000; font-weight: bold;]new SpriteBatch[color= #009900;](device[color= #009900;])[color= #339933;];

 

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

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

 

 

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

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

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

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

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

            playerScaling [color= #339933;]= [color= #cc66cc;]40[color= #339933;].0f [color= #339933;]/ [color= #009900;](float[color= #009900;])carriageTexture[color= #339933;].Width[color= #339933;];

        [color= #009900;]}

 

        [color= #000000; font-weight: bold;]private void SetUpPlayers[color= #009900;]([color= #009900;])

        [color= #009900;]{

            Color[color= #009900;][[color= #009900;]] playerColors [color= #339933;]= [color= #000000; font-weight: bold;]new Color[color= #009900;][[color= #cc66cc;]10[color= #009900;]][color= #339933;];

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

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

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

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

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

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

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

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

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

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

 

            players [color= #339933;]= [color= #000000; font-weight: bold;]new PlayerData[color= #009900;][numberOfPlayers[color= #009900;]][color= #339933;];

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

            [color= #009900;]{

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

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

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

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

            [color= #009900;]}

 

            players[color= #009900;][[color= #cc66cc;]0[color= #009900;]][color= #339933;].Position [color= #339933;]= [color= #000000; font-weight: bold;]new Vector2[color= #009900;]([color= #cc66cc;]100[color= #339933;], [color= #cc66cc;]193[color= #009900;])[color= #339933;];

            players[color= #009900;][[color= #cc66cc;]1[color= #009900;]][color= #339933;].Position [color= #339933;]= [color= #000000; font-weight: bold;]new Vector2[color= #009900;]([color= #cc66cc;]200[color= #339933;], [color= #cc66cc;]212[color= #009900;])[color= #339933;];

            players[color= #009900;][[color= #cc66cc;]2[color= #009900;]][color= #339933;].Position [color= #339933;]= [color= #000000; font-weight: bold;]new Vector2[color= #009900;]([color= #cc66cc;]300[color= #339933;], [color= #cc66cc;]361[color= #009900;])[color= #339933;];

            players[color= #009900;][[color= #cc66cc;]3[color= #009900;]][color= #339933;].Position [color= #339933;]= [color= #000000; font-weight: bold;]new Vector2[color= #009900;]([color= #cc66cc;]400[color= #339933;], [color= #cc66cc;]164[color= #009900;])[color= #339933;];

        [color= #009900;]}

 

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

        [color= #009900;]{

        [color= #009900;]}

 

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

        [color= #009900;]{

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

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

 

 

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

 

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

         [color= #009900;]}

 

         [color= #000000; font-weight: bold;]private void ProcessKeyboard[color= #009900;]([color= #009900;])

         [color= #009900;]{

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

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

                 players[color= #009900;][currentPlayer[color= #009900;]][color= #339933;].Angle [color= #339933;]-= [color= #cc66cc;]0[color= #339933;].01f[color= #339933;];

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

                 players[color= #009900;][currentPlayer[color= #009900;]][color= #339933;].Angle [color= #339933;]+= [color= #cc66cc;]0[color= #339933;].01f[color= #339933;];

 

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

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

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

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

 

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

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

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

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

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

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

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

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

 

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

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

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

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

         [color= #009900;]}

 

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

         [color= #009900;]{

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

 

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

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

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

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

 

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

         [color= #009900;]}

 

         [color= #000000; font-weight: bold;]private void DrawScenery[color= #009900;]([color= #009900;])

         [color= #009900;]{

             Rectangle screenRectangle [color= #339933;]= [color= #000000; font-weight: bold;]new Rectangle[color= #009900;]([color= #cc66cc;]0[color= #339933;], [color= #cc66cc;]0[color= #339933;], screenWidth[color= #339933;], screenHeight[color= #009900;])[color= #339933;];

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

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

         [color= #009900;]}

         [color= #000000; font-weight: bold;]private void DrawPlayers[color= #009900;]([color= #009900;])

         [color= #009900;]{

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

             [color= #009900;]{

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

                 [color= #009900;]{

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

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

                     Vector2 cannonOrigin [color= #339933;]= [color= #000000; font-weight: bold;]new Vector2[color= #009900;]([color= #cc66cc;]11[color= #339933;], [color= #cc66cc;]50[color= #009900;])[color= #339933;];

 

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

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

                 [color= #009900;]}

             [color= #009900;]}

         [color= #009900;]}

     [color= #009900;]}

 [color= #009900;]}

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

Learn_Xna6.pdf

تم تعديل هذه المشاركة بواسطة خلدون خالد2 في 3 مارس 2009 في 18:03

#2

درس جميل ,

تغيير اللاعبين , و الخروج من اللعبة

// change player
             if (kbs.IsKeyDown(Keys.D1))
             {
                 current_player = 0;
             }
             if (kbs.IsKeyDown(Keys.D2))
             {
                 current_player = 1;
             }
             if (kbs.IsKeyDown(Keys.D3))
             {
                 current_player = 2;
             }
             if (kbs.IsKeyDown(Keys.D4))
             {
                 current_player = 3;
             }
            // exit game
             if (kbs.IsKeyDown(Keys.Escape))
             {
                 Exit();
             }

ياترى ايه فكرة عميل pause و Continue

توقف للعبة عند الضغط على زر , بمعنى انه يتوفق الأستجابة لأى زى او مدخلات حتى يضغط اللاعب مرة اخرى على زر Continue

تم تعديل هذه المشاركة بواسطة sp_mmf في 31 يوليو 2009 في 01:46

#3

فى حل بسيط فكرت فيه ( علشان pause & Continue )

private void process_keyboard()
		{


			KeyboardState kbs = Keyboard.GetState();
			// lets play()
			//--------------------------------------------
			// Power Control (up, down, pageup, pagedown)
			// Up
			if (!pause)
			{
				if (kbs.IsKeyDown(Keys.Up))
				{
					players[current_player].power += 1;
				}
				// down
				if (kbs.IsKeyDown(Keys.Down))
				{
					players[current_player].power -= 1;
				}
				// pageUp
				if (kbs.IsKeyDown(Keys.PageUp))
				{
					players[current_player].power += 20;
				}
				// pageDown
				if (kbs.IsKeyDown(Keys.PageDown))
				{
					players[current_player].power -= 20;
				}
				// checks
				if (players[current_player].power > 1000)
				{
					players[current_player].power = 1000;
				}
				if (players[current_player].power < 0)
				{
					players[current_player].power = 0;
				}
				//----------------------------------------------------------
				// Angle Control (right, left)
				// right
				if (kbs.IsKeyDown(Keys.Right))
				{
					players[current_player].angle += 0.01f;
				}
				// left
				if (kbs.IsKeyDown(Keys.Left))
				{
					players[current_player].angle -= 0.01f;
				}
				// checks
				if (players[current_player].angle > MathHelper.PiOver2)
				{
					players[current_player].angle = -MathHelper.PiOver2;
				}
				if (players[current_player].angle < -MathHelper.PiOver2)
				{
					players[current_player].angle = MathHelper.PiOver2;
				}
				//------------------------------------------------------------
				// Others
				// change player
				if (kbs.IsKeyDown(Keys.D1))
				{
					current_player = 0;
				}
				if (kbs.IsKeyDown(Keys.D2))
				{
					current_player = 1;
				}
				if (kbs.IsKeyDown(Keys.D3))
				{
					current_player = 2;
				}
				if (kbs.IsKeyDown(Keys.D4))
				{
					current_player = 3;
				}
				// exit game
				if (kbs.IsKeyDown(Keys.Escape))
				{
					Exit();
				}
			}
			// pause & continue the game
			if (kbs.IsKeyDown(Keys.P))
			{
				if (pause)
				{
					pause = false;
				}
				else
				{
					pause = true;
				}
			}
		}

نعمل متغير فوق خالص

boolean pause = false;

و نعمل check قبل كل الزراير ان pause = false او لأ

==============================

لو حد يعرف طريقة تانية مثلا

application.pause

sleep

#4

حل الإيقاف و التشغيل جيد و يحقق المطلوب، ولكن قد تحتاج لوضع مثل هذا الكود في الدالة Update في بعض الحالات.

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