Saturday, September 25, 2010

XNA: Lesson2: Game1.CS التعرف علي ملف

الدرس الثاني
Game1.CS Members
بسم الله و الصلاة و السلام علي حبيبنا و قرة أعيننا محمد صلي الله عليه و سلم...
سنبدأ اليوم اخوتي الكرام بالتعرف علي اعضاء الكلاس Game1.CS
  • افتح الملف Game1.CS
  • في بداية الملف و بعد اسم الكلاس ستجد عضوين من اعضاء الكلاس اسمهم:
    • GraphicsDeviceManager graphics;
    • و هو يمثل كارت الشاشة في الجهاز و يسمح بالوصول الي وظائف و متغيرات كارت الشاشة.
    • SpriteBatch spriteBatch;
    • و هذا المتغير سيستخدم في رسم الصور ال 2D و رسم النصوص.
  • ثم ندخل بعد ذلك في ال Constructor الخاص بالكلاس Game1 و هذا اول حدث يبدا عند بدء اللعبة و نستطيع القول بانه يبدا قبل بدء اللعبة اصلا فهو اول شئ يحدث قبل تحميل اللعبة:
    • Public Game1(){
graphics = new GraphicsDeviceManager(this);
تحميل كارت الشاشة و تعريف متغير جديد منه
Content.RootDirectory = "Content";
خاصية Content تحتوي علي كل وظائف مخزن البيانات و هنا نحن نعرف المخزن علي مكان المصادر الخاصة بنا (الصور و الاصوات و خلافه) و هي في مجلد كما شرحنا سابقا اسمه Content و بعد ذلك سيكون لهذا المتغير Content دور في تحميل المصادر من المخزن الي اللعبة.
    • }
و اليكم هنا قائمة بانواع الملفات التي قد تحتويها لعبتنا و توضع في مجلد ال Content :
• 3D file formats: X (used by DirectX), FBX (transport file format, originally created by Autodesk and supported by most commercial and many freeware tools)
ملفات النماذج ال 3D المعدة بواسطة برامج كثيرة منها ال Autodesk.
• Material file formats: FX (effect files, which can be used to describe 3D model rendering details or add effects to the 3D scene)
ملفات المؤثرات الخاصة بنماذج ال 3D.
• 2D file formats: BMP, DDS, JPG, PNG, and TGA (the most commonly used image file formats)
ملفات الصور الخاصة بكائنات ال 2D.
• Font description: SPRITEFONT (XML files used by XNA, which describe how to generate a texture map from a specific font type size; the game then uses the images on the texture map to write text on the screen)
ملفات الخطوط و وصفها.
• XML files: XML format files copied to the game deployment directory, which can be used to store game settings, for example
ملفات ال XML و هي قد تستخدم معنا في تخزين اعدادات اللعبة مثلا.
• Audio file formats: XAP (audio project generated by the XACT tool), WAV, WMA, and MP3
ملفات الصوت.
  • بعد نأتي ذلك للحدث التالي و هو Initialize و هو يبدا مباشرة بعد ال Constructor و فيه يمكننا تحميل اي شئ غير مرسوم مثل الخدمات Services او خدمات الويب Web Services او اي معالجة للصوت قبل تحميله.
  • الحدث التالي LoadContent: و هو المكان الذي سنستخدم فيه المتغير Content لتحميل كل مصادر اللعبة من صور و نماذج 3D و اصوات و خلافه. و هو يحدث في كل مرة تحتاج اللعبة الي التحميل او اعادة التحميل مثلا يحدث عند تغيير حجم شاشة اللعبة من 800 * 600 الي مثلا 1024*700 فهنا انت تغير حجم الشاشة و ابعادها فهنا يقوم حدث ال LoadContent باعادة تحميل اللعبة مرة ثانية.
  • ندخل بعد ذلك في ال Game loop او بدء تكرارات اللعبة كما ذكرنا ... حيث بدءا من هذه النقطة الاحداث القادمة ستتم 60 مرة في الثانية (بالمناسبة التليفزيون في البيت يعرض بنفس ال refresh rate) يعني الصورة بالتليفزيون تتحدث 60 مرة بالثانية) المهم الاحداث التي تتكرر في اللعبة دوما هي:
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
base.Update(gameTime);
}
و حدث
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
// TODO: Add your drawing code here
base.Draw(gameTime);
}
مبدئيا نلاحظ ان الدالتين يستقبلون parameter من نوع GameTime و هو يحسب الوقت المنقضي منذ التكرار الفائت اي منذ اخر لفة في ال loop و كان من الممكن حسابها بالوقت لكنهم قاموا بعمل هذا المتغير لان بعض الاجهزة تكون بطيئة و بالتالي قد يحدث اي تاخر في وقت اللعبة بسبب بطا الجهاز فكان الحل هو عمل متغير مستقل يزيد بكل لفة او تكرار في اللعبة حتي يضمنوا سلامة سير الاحداث باللعبة ... و يحتوي علي المتغير ElabsedGameTime و هو الذي يحسب الوقت المنقضي منذ اخر loop في اللعبة و هو ليس الوقت الحقيقي لانه يقاس بعدد التكرارات التي تمت في اللعبة و ليس بالوقت الحقيقي ...
كما تحتوي gameTime علي المتغير ElabsedRealTime و هو الذي يحسب الوقت الحقيقي المنقضي منذ اخر loop في اللعبة و هو الوقت الحقيقي لانه يقاس بالوقت الفعلي منذ اخر تكرار او لفة باللعبة و لا يقاس بعدد التكرارات التي تمت ...و يحتوي ايضا علي TotalGameTime و هو الوقت المنقضي منذ بدء اللعبة.
  • دعونا الان نشرح الحدثين Update و Draw:
  • الحدث Update : هو الحدث الذي يبدا اولا قبل Draw و فيه نقوم بتحديث اماكن كائنات اللعبة اي تحريكها بسرعة معينة و بدوران معين و نقوم بحساب التصادمات اي ماذا تفعل اللعبة اذا تصادم كائنين ببعضهما البعض و سنتعرف لاحقا كيف نعرف اذا قام كائنين باللعبة بالتصادم مع بعضهم البعض ... و كذلك نحدث الحالات الخاصة بكل لاعب و نحدث حالة اللعبة و كذلك نحسب ال Score او التهديف لكل لاعب و نفحص ايضا شرط انهاء اللعبة فمثلا نجد هذا الشرط:
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
الذي معناه اذا ضغط اللاعب الذي يستخدم ال Game Pad او ذراع الالعاب علي زر Back فانهي اللعبة ... و طبعا سنضيف نحن ايضا شرط خاص بلوحة المفاتيح ال keyboard مثلا اذا ضغط Escape تنتهي اللعبة ...
  • نأتي للحدث الذي يحدث بعد Update و هو Draw: و في هذا الحدث طبعا كما ذكرنا يتم رسم عناصر اللعبة علي الشاشة و في هذا الحدث نشاهد السطر التالي:
  • GraphicsDevice.Clear(Color.CornflowerBlue);
  • نذكر طبعا لمن نفذ المثال السابق انك حين كونت مشروع لعبة فارغ و ضغطت F5 و شغلت اللعبة ظهرت شاشة زرقاء جميلة ... في هذا الكود السابق و في كل فرام Frame في اللعبة (Frame يعني لفة او تكرار ) يتم مسح كل عناصر الشاشة و ثم رسم هذه الشاشة الزرقاء ثم اعادة رسم كل كائنات اللعبة مرة اخري و طبعا هذه العملية تتم بسرعة رهيبة لا يلاحظها اي احد ... و يمكننا تغيير طبعا لون الشاشة الزرقاء عند طريق اعطاء لون اخر من خلال تغيير ال Color.ConflowerBlue الي اي لون اخري مثل Color.Blue...
و هكذا اخواتي و اخوتي الكرام انتهي الدرس الثاني و الخاص بشرح مفردات و اعضاء اختنا الكريمة Game1.CS
و اعدوا نفسكم الدرس القادم ان شاء الله للشغل الجد لان كل هذا كان مجرد مزاح معكم ...
تطبيق اليوم:
غير لون الشاشة الزرقاء التي تظهر في بداية اللعبة الي اي لون اخر ....

No comments:

Post a Comment