بســم الله الـرحمــن الرحيــم الدرس الثاني أهلا بكم في الدرس الثاني من سلسلة دروس تعلم ال 3D Xna السلسلة الأولى، في هذا الدرس سوف نتحدث عن ملف التأثيرات “Effect File” . أحد الفروق الأساسية بين ال DirectX 9 و ال Xna أنه يلزمنا في ال Xna تأثير “effect” لكل شيئ نرسمه. إذا ماذا نعني بالتأثير بالضبط؟ في برمجة الألعاب ثلاثية الأبعاد، كل العناصر يتم تمثيلها بمثلثات. حتى الكرات بالإمكان تمثيلها بإستخدام المثلثات، إذا إستخدمنا كمية كافية منها. التأثير هو الكود الذي يقوم بإرشاد المكونات الفيزيائية في الجهاز (بطاقة الرسوميات) كيف سوف تقوم بعرض هذه المثلثات. ملف التأثير يحتوي على طريقة (تقنية) “technique” أو عدة طرق، على سبيل المثال الطريقة A و الطريقة B. رسم المثلثات بإستخدام الطريقة A سوف يؤدي إلى رسمهم بشكل نصف شفاف على سبيل المثال، بينما رسمهم بالطريقة B سوف يؤدي إلى رسمهم بالألوان الأزرق- الرمادي فقط، كما هو الحال في بعض أفلام الرعب. لا تقلق كثيرا حيال هذا الموضوع، صحيح أن هذا متقدم قليلا حيث سوف يتم التطرق له في السلسلة الثالثة. بكل الأحوال، ال Xna يلزمه ملف تأثير من أجل رسم أبسط المثلثات، لذلك لقد قمت بكتابة ملف تأثير يحتوي على بعض الطرق البسيطة للرسم. بإمكانك أن تقوم بتنزيله من هنا (أو من الملفات المرفقة). إضغط بالزر الايمن على الرابط و إختر "حفظ بإسم" “Save As”. يجب عليك أن تضع الملف في نفس الموقع إلى جانب ملفات الكود الخاصة بك. إذا كنت لا تعلم أين تتواجد ملفات الكود، إذهب أولا إلى الكود، و من القائمة “File”، و إختر “Save[Project Name] As” لكي تشاهد الموقع المخزن فيه مشروعك. بشكل إفتراضي، فإن ملفات الكود سوف تكون محفوظة في المسار:
Effect effect;
effect = Content.Load<Effect> ("effects");
device.Clear(Color.DarkSlateBlue);
effect.CurrentTechnique = effect.Techniques["Pretransformed"]; effect.Begin();
foreach (EffectPass pass in effect.CurrentTechnique.Passes) { pass.Begin(); pass.End(); } effect.End();
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); } } }