بتـــــاريخ : 2/28/2011 1:31:40 AM
الفــــــــئة
  • الحـــــــــــاسب
  • التعليقات المشاهدات التقييمات
    0 1660 0


    [دروس] الدرس الثاني من سلسلة دروس تعلم 3d Xna السلسلة الأولى

    الناقل : elmasry | العمر :42 | الكاتب الأصلى : *خلدون خالد* | المصدر : www.arabteam2000-forum.com

    كلمات مفتاحية  :

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

    الدرس الثاني


    أهلا بكم في الدرس الثاني من سلسلة دروس تعلم ال 3D Xna السلسلة الأولى، في هذا الدرس سوف نتحدث عن ملف التأثيرات “Effect File” .
    أحد الفروق الأساسية بين ال DirectX 9 و ال Xna أنه يلزمنا في ال Xna تأثير “effect” لكل شيئ نرسمه. إذا ماذا نعني بالتأثير بالضبط؟
    في برمجة الألعاب ثلاثية الأبعاد، كل العناصر يتم تمثيلها بمثلثات. حتى الكرات بالإمكان تمثيلها بإستخدام المثلثات، إذا إستخدمنا كمية كافية منها. التأثير هو الكود الذي يقوم بإرشاد المكونات الفيزيائية في الجهاز (بطاقة الرسوميات) كيف سوف تقوم بعرض هذه المثلثات. ملف التأثير يحتوي على طريقة (تقنية) “technique” أو عدة طرق، على سبيل المثال الطريقة A و الطريقة B. رسم المثلثات بإستخدام الطريقة A سوف يؤدي إلى رسمهم بشكل نصف شفاف على سبيل المثال، بينما رسمهم بالطريقة B سوف يؤدي إلى رسمهم بالألوان الأزرق- الرمادي فقط، كما هو الحال في بعض أفلام الرعب.
    لا تقلق كثيرا حيال هذا الموضوع، صحيح أن هذا متقدم قليلا حيث سوف يتم التطرق له في السلسلة الثالثة. بكل الأحوال، ال Xna يلزمه ملف تأثير من أجل رسم أبسط المثلثات، لذلك لقد قمت بكتابة ملف تأثير يحتوي على بعض الطرق البسيطة للرسم. بإمكانك أن تقوم بتنزيله من
    هنا (أو من الملفات المرفقة). إضغط بالزر الايمن على الرابط و إختر "حفظ بإسم" “Save As”. يجب عليك أن تضع الملف في نفس الموقع إلى جانب ملفات الكود الخاصة بك. إذا كنت لا تعلم أين تتواجد ملفات الكود، إذهب أولا إلى الكود، و من القائمة “File”، و إختر “Save[Project Name] As” لكي تشاهد الموقع المخزن فيه مشروعك. بشكل إفتراضي، فإن ملفات الكود سوف تكون محفوظة في المسار:

    LEFT TO RIGHT
    C:\Documents and Settings\[user name]\My Documents\Visual Studio 2005\Projects\[project name]\[project name]


    الآن وقد قمت بتنزيل ملف التأثير في نفس مكان ملفات الكود، سوف نقوم بإستيراد الملف داخل مشروع ال Xna. في داخل ال “Solution Explorer” على الجهة اليمنى لشاشة ال Xna، إبحث عن مجلد ال “Content” و إضغط عليها بالزر الأيمن. و إختر Add->Existing Item و إنتقل إلى مكان وجود مل ف ال .fx ، بعد ذللك إضغط على OK ، سوف يتم إضافة ملف ال fx إلى مجلد ال Content كما هو موضح في الصورة التالية:
    ارفق صورة : monthly_07_2009/post-133895-1247665023.jpg

    بعد ذلك، سوف نقوم بربط ملف التأثير بمتغير، بحيث يصبح بإمكاننا إستعماله فعليا داخل الكود. سوف نقوم بتعريف كائن من النوع Effect، إذا قم بوضع الكود التالي في بداية ال Class:
     Effect effect;


    في داخل الدالة LoadContent، قم بإضافة السطر التالي لكي تقوم ال Xna بتحميل ملف ال .fx إلى متغير ال effect:
    effect = Content.Load<Effect> ("effects");


    الإسم “effects” يشير إلى إسم الملف بدون الإمتداد “.fx”.
    بعد أن تم تحميل كل المتغيرات الآزمة، بإستطاعتنا أن نركز على الدالة Draw. سوف تلاحظ أن السطر الأول يبدأ ب graphics.GraphicsDevice. بإستطاعتنا إستبدال ذلك بسهولة. هذا السطر يقوم بمسح الذاكرة الخاصة بالشاشة بلون معين. دعنا نحدد ذلك باللون DarkSlateBlue، للمتعة فقط :) :
     device.Clear(Color.DarkSlateBlue);


    تستعمل ال Xna الذاكرة من أجل الرسم، بدلا من الرسم مباشرة إلى النافذة. في نهاية الدالة Draw، سوف يتم رسم محتويات تلك الذاكرة على الشاشة مرة واحدة. بهذه الطريقة سوف لن ترمش الشاشة كما في حالة لو رسمنا كل جزء من المشهد على حدة على الشاشة.
    قم بتشغيل الكود سوف تظهر لك شاشة مثل الظاهرة في الأسفل، ولكن أريد أولا أن اقوم بإضافة بعض الكود إلى الدالة Draw أيضا. كما ناقشنا في الأعلى، من أجل رسم شيئ ما على الشاشة سوف نحتاج أولا لتحديد تقنية لكائن ال Effect. سوف نقوم مباشرة بتفعيل التاثير، بحين يكون بإستطاعتنا في الدرس القادم أن نرسم شيئا على الشاشة مباشرة!
     effect.CurrentTechnique = effect.Techniques["Pretransformed"];
     effect.Begin();


    كما ترى فقد إخترنا تقنية ال Pretransformed من ملف ال effects.fx .هذه التقنية سوف نستخدمها و سنناقشها في الدرس القادم. السطر الأخير يطلب من التأثير و من بطاقة الرسوميات الإستعداد من أجل بعض العمل.
    يتم عمل التقنية بإستخدام عدة مسوحات (مررورات) “Multiple Passes” ، إذن سوف نحتاج لأن نمر عدة مرات. قم بإضافة الكود التالي تحت الكود الذي وضعته قبل قليل:
     foreach (EffectPass pass in effect.CurrentTechnique.Passes)
     {
             pass.Begin();
     
             pass.End();
     }
     effect.End();


    بإستطاعتك أن تلاحظ أن إن كل مرور يحتاج لأن نستدعي كل من الدالتين Begin و End. يجب أن يتم رسم المشهد بين هذين الإستدعائين، في النهاية، نحتاج أن نضع إستدعاء للدالة effect.End لكي نخبر المؤثر الخاص بنا اننا لا نريد أن نرسم عناصر أخرى بعد بإستخدام هذه التقنية.
    أخيرا، بعد مررورنا على قسم التجهيز! إذا أحسست أنك لم تفهم اي شيئ عن المؤثرات و التقنيات، لا يجب عليك أن تقلق لأننا سوف نشرح كل ذلك بشكل مفصل في السلسلة الثالثة إن شاء الله. بعد وضع كل الكود السابق، نحن جاهزون أخيرا لكي نبدأ برسم الاشياء على الشاشة، وهو ما سوف نقوم بعمله في الدرس القادم بإذن الله.
    ارفق صورة : monthly_07_2009/post-133895-1247665062.jpg

    الملفات الازمة لتنفيذ الدرس:
    ملف مرفق  effects.zip (1.27كيلو )
    عدد مرات التحميل : 169
    نسخة عن الدرس بصيغة PDF:
    ملف مرفق  Learn3D_Xna_S1L2.pdf (193.09كيلو )
    عدد مرات التحميل : 331

    كود المشروع حتى الآن:
    انسخ الكود
     using System;
     using System.Collections.Generic;
     using Microsoft.Xna.Framework;
     using Microsoft.Xna.Framework.Audio;
     using Microsoft.Xna.Framework.Content;
     using Microsoft.Xna.Framework.GamerServices;
     using Microsoft.Xna.Framework.Graphics;
     using Microsoft.Xna.Framework.Input;
     using Microsoft.Xna.Framework.Net;
     using Microsoft.Xna.Framework.Storage;
     
     namespace XNAtutorial
     {
         public class Game1 : Microsoft.Xna.Framework.Game
         {
             GraphicsDeviceManager graphics;
             SpriteBatch spriteBatch;
             GraphicsDevice device;
             Effect effect;
     
             public Game1()
             {
                 graphics = new GraphicsDeviceManager(this);
                 Content.RootDirectory = "Content";
             }
     
             protected override void Initialize()
             {
                 graphics.PreferredBackBufferWidth = 500;
                 graphics.PreferredBackBufferHeight = 500;
                 graphics.IsFullScreen = false;
                 graphics.ApplyChanges();
                 Window.Title = "Riemer's XNA Tutorials -- Series 1";
     
                 base.Initialize();
             }
     
             protected override void LoadContent()
             {
                 device = graphics.GraphicsDevice;
                 spriteBatch = new SpriteBatch(GraphicsDevice);
     
                effect = Content.Load ("effects");
             }
     
             protected override void UnloadContent()
             {
             }
     
             protected override void Update(GameTime gameTime)
             {
                 if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                     this.Exit();
     
                 base.Update(gameTime);
             }
     
             protected override void Draw(GameTime gameTime)
             {
                 device.Clear(Color.DarkSlateBlue);
     
                 effect.CurrentTechnique = effect.Techniques["Pretransformed"];
                 effect.Begin();
                 foreach (EffectPass pass in effect.CurrentTechnique.Passes)
                 {
                     pass.Begin();
     
                     pass.End();
                 }
                 effect.End();
     
                 base.Draw(gameTime);
             }
         }
     }
     

    كلمات مفتاحية  :

    تعليقات الزوار ()