kldoon

[جديد] الدرس الثاني من سلسلة دروس تعلم ال Xna

11 ردود في هذا الموضوع

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

الدرس الثاني

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

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

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

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

بداية يجب علينا تنزيل الصور من خلال الروابط التالية هناو الرابط هنا(أو من خلال المرفقات).

الآن إذهب إلى المشروع الذي قمنا بإنشائه في الدرس السابق, و إذهب إلى “Solution Explorer” مربع صغير في الركن العلوي الأيسر من الشاشة, يحتوي على كل ملفات المشروع. بعدها ابحث عن مجلد ال “Content” و بعدها إضغط بالزر اليمين على المجلد و إختر Add->Existing Item , كما هو موضح في الصورة التالية:

post-133895-1235743792_thumb.jpg

من خلال الشاشة المفتوحة قم بالتصفح حتى تصل إلى موقع الصورتان اللتان قمت بتنزيلهما سابقا. إختر ملفات الصوره و بعدها إضغط إضافة "Add" .

هكذا سوف يتم نسخ الملف إلى مجلد ال “Content” في مشروعك. يجب أن يظهر الملف اسفل مجلد ال “Content” كما في الصورة:

post-133895-1235743869_thumb.jpg

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

قم بإضافة المتغير في أعلى الكود , فوق الدالة “Game1()” .

 Texture2D backgroundTexture;

قمنا بتعريف المتغير بحيث يكون النوع “Texture2D” . في برمجة الألعاب تدعى الصور بالخامات “Textures” او اشباح “Sprite” , لهذا سميت بهذا الأسم.

المتغير من نوع “Textuere2D” يستخدم للربط مع الصورة , كما أنه يستخدم من اجل عملية التصيير للصورة , او الوصول إلى معلومات الألوان في الصورة (كما سنفعل لاحقا في أحد الدروس القادمة).

بشكل واضخ, نحتاج الآن لكي نربط المتغير مع ملف الصورة التي قمنا بإستيرادها لمشروع ال Xna. يتم ذلك من خلال وضع الكود التالي في الدالة “LoadContent” .

backgroundTexture = Content.Load<Texture2D> ("background");

في هذا السطر يتم ربط المتغير مع الصورة. الوسيط “background” يمثل اسم الملف الذي تم إستيراده, وهو “background.jpg”. طبعا لا يهم إذا كانت صورتك تحمل الإمتداد JPG او BMP أو PNG أو حتى اي تنسيق للصور. فقط قم بإستيراد ملف الصورة إلى المشروع و قم بربط الملف مع المتغير.

بعدما قمنا بربط المتغير مع الصوره نحن الآن جاهزين لرسم الصورة على الشاشة. يزودنا الXna بأداة سهلة جدا و فعالة جدا من أجل ذلك: SpriteBatch . يمثل أيضا متغير موجود فعليا بشكل مسبق في الكود , حيث يتم إنشائه عند إنشاء مشروع Xna جديد. بإمكانك البحث عنه في الكود : فهو معرف في اعلى الكود و تم إستهلاله في دالة “LoadContent” .

ال SpriteBatch هي ما يعنيه إسمها فعليا : فهي تتيح لنا القيام بعملية تصيير لحزم من الأشباح “sprites” (الصور ثنائية البعد) . حتى الآن سوف نقوم بعمل تصيير لمره واحدة , لكن بالإمكان إستخدام SpriteBatch واحد لعمل تصيير لكمية كبيرة من الصور. الجيد ان كل ذلك يتم بإستخدام اجزاء التسريع في كرت الشاشة.

بما أن ال SpriteBatch قد تم تجهزيه مسبقا, نستطيع الآن رسم المتغيرات. يجب ان تتم هذه العملية في دالة ال “Draw”, لكننا سوف نقوم بعمل دالة صغيرة للقيام بذلك. السبب الوحيد لعمل ذلك هو أن الدالة “Draw” سوف يصبح شكلها فوضوي في نهاية سلسلة الدروس , لأننا سوف نقوم برسم عدد كبير من الصور.

إذن قم بإضافة دالة جديدة في نهاية الكود, بعد دالة ال “Draw()” مباشرة:

 private void DrawScenery()
{
}

عندما نريد أن نرسم صورة ثنائية البعد على الشاشة, بشكل أساسي لدينا خيارين:

• نقوم بتحديد الموقع العلوي الأيسر لزاوية الصورة.

• أو بإمكاننا تحديد مستطيل على الشاشة يمثل المكان الذي نريد أن نرسم الصورة فيه.

بما أننا نريد ان تغطي صورة الخلفية لدينا كامل الشاشة, سوف نختار الخيار الثاني.

سوف نستخدم الخيار الأول في الدرس التالي.

عندما نريد تحديد المستطيل المرتبط بكامل الشاشة سوف نحتاج أن نعرف عرض وطول الشاشة. بشكل واضح بما أننا قمنا بتحديد حجم الشاشة ب 500 * 500 بكسل, نحن نعرف حجم الشاشه فعليا. لكن بالتأكيد نحن نريد ان تقوم لعبتنا بضبط نفسها بشكل تلقائي مهما تغير حجم الشاشة لاحقا.

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

 int screenWidth;
int screenHeight;

إضافة إلى ذلك ضع الكود التالي في نهاية الدالة “LoadContent” , حيث سوف يتم تخزين قيم هذه المتغيرات:

 screenWidth = device.PresentationParameters.BackBufferWidth;
screenHeight = device.PresentationParameters.BackBufferHeight;

بما أننا حصلنا الآن على حجم الشاشة, نستطيع العودة الآن إلى الدالة DrawScenery و تعريف المستطيل الذي يغطي كامل الشاشة:

Rectangle screenRectangle = new Rectangle(0, 0, screenWidth, screenHeight);
spriteBatch.Draw(backgroundTexture, screenRectangle, Color.White);

السطر الأول يقوم بإنشاء المستطيل, زاويته العليا اليسرى في الإحداثيات (0,0) و له العرض و الطول المساوي للشاشة.

ملاحظة هامة:

في برمجة الألعاب , الإحداثي (0,0) يمثل الزاوية العلوية اليسرى للشاشة. المحور X الموجب يمثل الإتجاه لليمين, إضافة إلى أن المحور Y الموجب يمثل الإتجاه للأسفل.

السطر الأخير يطلب من ال SpriteBatch أن يقوم برسم الصورة ! السطر يطلب من ال SpriteBatch أن يرسم ال backgroundTexture , ممتدة على كامل الشاشة. سوف نقوم بمناقشة الوسيط الأخير في الدرس القادم بإذن الله, لكن بشكل عام يمكنك ان تفترض أن Color.White تعني ان الصورة يجب ان يتم تصييرها بإستخدام ألوانها الأصلية. هذا السطر من الكود يقوم بإضافة صورة الخلفية إلى قائمة التي يجب على ال SpriteBatch ان يقوم برسمها (حتى الآن صورة واحدة).

هذا يقوم (بشكل غير مباشر) برسم الصورة على الشاشة. و لكن يجب أولا أن نقوم بتشغيل “Start” لل SpriteBatch , بعد ذلك عليك عليك إضافة الصور إلى قائمة الصور الخاصة بها, بعدها عليك أن تصدر أمر التصيير لل SpriteBatch.

إذن إذهب إلى دالة الرسم “Draw”, و تأكد أن الكود لديك مشابه للتالي:

 protected override void Draw(GameTime gameTime)
{
graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

spriteBatch.Begin();
DrawScenery();
spriteBatch.End();

base.Draw(gameTime);
}

السطر الأول يقوم بمسح الشاشة بلون من إختيارنا. بعدها , قمنا ببدء ال SpriteBatch, إذن نستطيع أن نقوم بإضافة الصور إلى القائمة الخاصه بها من أجل الرسم. بعدها نقوم بإستدعاء الدالة DrawScenery, التي تضيف صورة واحدة إلى القائمة الخاصة بال SpriteBatch . في النهاية , نقوم بإنهاء “End” ال SpriteBatch , التي تقوم بشكل فعلي بالطلب من ال SpriteBatch أن يقوم بعملية الرسم لقائمة الصور على الشاشة. السطر الأخير يقوم بإستدعاء دالة الرسم لأي من عناصر اللعبة “GameComponents”الأخرى المرفقه للعبة.

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

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

1) قم بإستيراد الصورة “foreground.png” إلي مجلد ال “Content” في ال “Solution Explorer”

2) أضف المتغير في أعلى الكود

 Texture2D foregroundTexture;

3) قم بتجهيز المتغير في الدالة “LoadContent” :

foregroundTexture = Content.Load<Texture2D> ("foreground");

لتصيير هذه الصورة فوق صورة الأرضية الخلفية, ببساطة قم بإضافة السطر التالي إلى نهاية كود الدالة DrawScencery:

 spriteBatch.Draw(foregroundTexture, screenRectangle, Color.White);

الذي يطلب من ال SpriteBatch ان يرسم ال foregroundTexture , بحيث أنها تغطي كامل الشاشة, بألوانها الأصلية.

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

عندما تقوم بفتح الملف foreground.png في الويندوز , تستطيع ان تلاحظ ان الجزء فوق التضاريس شفاف. لهذا قمت بإختيار ملفات ال PNG بدلا من تنسيق ال JPG لأنه لا يستطيع تخزين معلومات المناطق الشفافة. بما أننا قمنا بإضافة صورة الأرضية الخلفية إلى قائمة ال SpriteBatch, و بعدها قمنا بإضافة صورة الأرضية الأمامية, تم رسم صورة الأرضية الخلفية اولا.

عند التنفيذ يجب أن يكون لديك النتيجة التالية:

post-133895-1235744695_thumb.jpg

الكود النهائي الذي وصل إليه المشروع هو :

انسخ الكود
  1.  
  2. using System;
  3. using System.[color= #202020;]Collections[/color].[color= #202020;]Generic[/color];
  4. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color];
  5. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Audio[/color];
  6. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Content[/color];
  7. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]GamerServices[/color];
  8. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Graphics[/color];
  9. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Input[/color];
  10. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Net[/color];
  11. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Storage[/color];
  12.  
  13. namespace XNAtutorial
  14. [color= #009900;]{[/color]
  15. public class Game1 [color= #339933;]:[/color] Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Game[/color]
  16. [color= #009900;]{[/color]
  17. GraphicsDeviceManager graphics;
  18. SpriteBatch spriteBatch;
  19. GraphicsDevice device;
  20.  
  21. Texture2D backgroundTexture;
  22. Texture2D foregroundTexture;
  23.  
  24. [color= #993333;]int[/color] screenWidth;
  25. [color= #993333;]int[/color] screenHeight;
  26.  
  27. public Game1[color= #009900;]([/color][color= #009900;])[/color]
  28. [color= #009900;]{[/color]
  29. graphics [color= #339933;]=[/color] new GraphicsDeviceManager[color= #009900;]([/color]this[color= #009900;])[/color];
  30. Content.[color= #202020;]RootDirectory[/color] [color= #339933;]=[/color] [color= #ff0000;]"Content"[/color];
  31. [color= #009900;]}[/color]
  32.  
  33. protected override [color= #993333;]void[/color] Initialize[color= #009900;]([/color][color= #009900;])[/color]
  34. [color= #009900;]{[/color]
  35. graphics.[color= #202020;]PreferredBackBufferWidth[/color] [color= #339933;]=[/color] [color= #cc66cc;]500[/color];
  36. graphics.[color= #202020;]PreferredBackBufferHeight[/color] [color= #339933;]=[/color] [color= #cc66cc;]500[/color];
  37. graphics.[color= #202020;]IsFullScreen[/color] [color= #339933;]=[/color] [color= #000000; font-weight: bold;]false[/color];
  38. graphics.[color= #202020;]ApplyChanges[/color][color= #009900;]([/color][color= #009900;])[/color];
  39. Window.[color= #202020;]Title[/color] [color= #339933;]=[/color] [color= #ff0000;]"Riemer's 2D XNA Tutorial"[/color];
  40.  
  41. base.[color= #202020;]Initialize[/color][color= #009900;]([/color][color= #009900;])[/color];
  42. [color= #009900;]}[/color]
  43.  
  44. protected override [color= #993333;]void[/color] LoadContent[color= #009900;]([/color][color= #009900;])[/color]
  45. [color= #009900;]{[/color]
  46. device [color= #339933;]=[/color] graphics.[color= #202020;]GraphicsDevice[/color];
  47. spriteBatch [color= #339933;]=[/color] new SpriteBatch[color= #009900;]([/color]device[color= #009900;])[/color];
  48.  
  49.  
  50. backgroundTexture [color= #339933;]=[/color] Content.[color= #202020;]Load[/color]<Texture2D> [color= #009900;]([/color][color= #ff0000;]"background"[/color][color= #009900;])[/color];
  51. foregroundTexture [color= #339933;]=[/color] Content.[color= #202020;]Load[/color]<Texture2D> [color= #009900;]([/color][color= #ff0000;]"foreground"[/color][color= #009900;])[/color];
  52. screenWidth [color= #339933;]=[/color] device.[color= #202020;]PresentationParameters[/color].[color= #202020;]BackBufferWidth[/color];
  53. screenHeight [color= #339933;]=[/color] device.[color= #202020;]PresentationParameters[/color].[color= #202020;]BackBufferHeight[/color];
  54.  
  55. [color= #009900;]}[/color]
  56.  
  57. protected override [color= #993333;]void[/color] UnloadContent[color= #009900;]([/color][color= #009900;])[/color]
  58. [color= #009900;]{[/color]
  59. [color= #009900;]}[/color]
  60.  
  61. protected override [color= #993333;]void[/color] Update[color= #009900;]([/color]GameTime gameTime[color= #009900;])[/color]
  62. [color= #009900;]{[/color]
  63. [color= #b1b100;]if[/color] [color= #009900;]([/color]GamePad.[color= #202020;]GetState[/color][color= #009900;]([/color]PlayerIndex.[color= #202020;]One[/color][color= #009900;])[/color].[color= #202020;]Buttons[/color].[color= #202020;]Back[/color] [color= #339933;]==[/color] ButtonState.[color= #202020;]Pressed[/color][color= #009900;])[/color]
  64. this.[color= #202020;]Exit[/color][color= #009900;]([/color][color= #009900;])[/color];
  65.  
  66. base.[color= #202020;]Update[/color][color= #009900;]([/color]gameTime[color= #009900;])[/color];
  67. [color= #009900;]}[/color]
  68.  
  69. protected override [color= #993333;]void[/color] Draw[color= #009900;]([/color]GameTime gameTime[color= #009900;])[/color]
  70. [color= #009900;]{[/color]
  71. graphics.[color= #202020;]GraphicsDevice[/color].[color= #202020;]Clear[/color][color= #009900;]([/color]Color.[color= #202020;]CornflowerBlue[/color][color= #009900;])[/color];
  72.  
  73. spriteBatch.[color= #202020;]Begin[/color][color= #009900;]([/color][color= #009900;])[/color];
  74. DrawScenery[color= #009900;]([/color][color= #009900;])[/color];
  75. spriteBatch.[color= #202020;]End[/color][color= #009900;]([/color][color= #009900;])[/color];
  76.  
  77. base.[color= #202020;]Draw[/color][color= #009900;]([/color]gameTime[color= #009900;])[/color];
  78. [color= #009900;]}[/color]
  79.  
  80. private [color= #993333;]void[/color] DrawScenery[color= #009900;]([/color][color= #009900;])[/color]
  81. [color= #009900;]{[/color]
  82. Rectangle screenRectangle [color= #339933;]=[/color] new Rectangle[color= #009900;]([/color][color= #cc66cc;]0[/color], [color= #cc66cc;]0[/color], screenWidth, screenHeight[color= #009900;])[/color];
  83. spriteBatch.[color= #202020;]Draw[/color][color= #009900;]([/color]backgroundTexture, screenRectangle, Color.[color= #202020;]White[/color][color= #009900;])[/color];
  84. spriteBatch.[color= #202020;]Draw[/color][color= #009900;]([/color]foregroundTexture, screenRectangle, Color.[color= #202020;]White[/color][color= #009900;])[/color];
  85. [color= #009900;]}[/color]
  86. [color= #009900;]}[/color]
  87. [color= #009900;]}[/color]
  88.  
  89.  

الملفات الآزمة لتنفيذ الدرس

L2.zip

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

Learn_Xna2.pdf

تحياتي :wub:

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الله يعطيك العافية

ويجزيك الخير

وسأتابع الدروس ان شاء الله

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
الله يعطيك العافية

ويجزيك الخير

وسأتابع الدروس ان شاء الله

يا هلا بيك أمجد :)

ولكني أجد التفاعل شحيح بعض الشيئ , يبدو أننا بحاجة لبعض الدعاية :lol:

تم تعديل بواسطه خلدون خالد2
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ورحمة الله

ممتاز الدرس اكمل اخي بارك الله فيك ,لو كان فيه شوية مسائل للحل تساعد على التفكير على العموم درس ممتاز نتمنى المزيد

تعديل:

نسيت اسألك بخصوص المتغيرات لماذا لا تضيف عليها private

تم تعديل بواسطه اسد الاسود
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الدروس واضحة ولا أشعر أبدا أنها مترجمة :D ,

لم أظن أن XNA بهذه السهولة .. !

ولكني أجد التفاعل شحيح بعض الشيئ , يبدو أننا بحاجة لبعض الدعاية

قد يكون بسبب نوم المنتدى الطويل .. نحتاج لمزيد من هذه المواضيع ..

لو كان فيه شوية مسائل للحل تساعد على التفكير

أوافقك الرأي , اضافة بعض التمارين هي المحك الرئيسي في قياس مدى الاهتمام بالموضوع .

ولكني الان مستمتع فعلا بالموضوع كما هو .

هناك سؤال بصراحة . . لم أفهمه من الدرس الماضي ( ولم أبحث أيضا ) ..

base.Draw(gameTime);

ولكن يجب أن أبحث أكثر .. عن Microsoft.Xna.Framework.Game حتى أفهم ,,

تم تعديل بواسطه الشمري
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

وعليكــم السـلام ورحمة الله وبركاتـه..

السلام عليكم ورحمة الله

ممتاز الدرس اكمل اخي بارك الله فيك ,لو كان فيه شوية مسائل للحل تساعد على التفكير على العموم درس ممتاز نتمنى المزيد

تعديل:

نسيت اسألك بخصوص المتغيرات لماذا لا تضيف عليها private

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

بالنسبة لل private فكما قلت لك أن الكود كما ورد في المصدر (للتذكير فقط :) ) و لكن السبب حسب فهمي لل OOP فنحن في هذه الفئة "Class" الرئيسية

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

هذا حسب علمي و الله أعلم

هناك سؤال بصراحة . . لم أفهمه من الدرس الماضي ( ولم أبحث أيضا ) ..

base.Draw(gameTime);

بالنسبة لل gameTime الغالب أنها تستخدم لقياس الزمن بين كل إستدعائين للدالة Update و ذلك يلزم لمراقبة ال Frame Rate للعبة.

الدرس الثالث اليوم إن شاء الله :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

بخصوص المتغيرات لماذا لا تضيف عليها private

وذلك لانها by default private

فوضعها او تركها لن يؤثر فى شئ

لى تعليق على هذا الدرس فلقد اضفت هذا الكود

			Window.AllowUserResizing = true;

فى Initialize()

فاتاح لى تغير حجم الشاشه فعند تغيرى حجمها وجدت ان الصوره تظهر هكذا

untitled.JPG

فقمت بالتعديل فى الكود وذلك بحذف هذين السطرين

			screenHeight = device.PresentationParameters.BackBufferHeight;
screenWidth = device.PresentationParameters.BackBufferWidth;

من LoadContent()

ووضعتهم فى DrawScenery()

فاصبحت اغير فى حجم الشاشه اثناء التشغيل بدرون مشكله

تم تعديل بواسطه SomeOne83
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جيد جدا , و للمزيد من تفاصيل حجم الشاشه و دقتها وعلاقتها مع اللعبه

قام المؤلف بتخصيص الدرس الأخير كاملا للحديث عن الموضوع ,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

براك الله فيك تم التطبيق على الدرس وهو سهل جدا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

متابع معاك هنا من فترة لكن كنت توقفت وتابعت برده فى الثرى دى , جزاك الله كل خير

كان عندى مشكلة انه مش بيشتعل فى كل الشاشة حتى وانا عامل

graphics.IsFullScreen = true;

بس لما غيرت الدقة لـ 1780 * 720 اتظبط مع الكل

علما بأن الشاشة بتاعتى Wide-Screen و كانت الدقة 1780 * 800

بس معظم الالعاب مكنتش بتفتح فى كل الشاشة وبيظهر مساحة سودة ع الجانبين مع الدقة 1780 * 800

تمام جداا وتم التطبيق ,

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكراً شكراً شكراً

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .