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

الدرس الأخير -الثالث عشر- من سلسلة دروس تعلم 3d Xna

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

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

الدرس الثالث عشر و الأخير

أهلا بكم في الدرس الثالث عشر من سلسلة دروس تعلم ال3D Xna السلسلة الأولى، في هذا الدرس سوف نقوم بتحسين الأداء من خلال إستخدام ذاكرة الرؤوس و ذاكرة الفهارس.

في هذه اللحظة التضاريس تعمل بشكل جيد، مرة أخرى، في كل إطار “Frame” للعبة يتم إرسال جميع الرؤوس و الفهارس إلى بطاقة الرسوميات. هذا يعني أننا في كل إطار نقوم بإرسال نفس البيانات. من الواضح جدا أنه من الممكن تحسين ذلك.

نحن بحاجة إلى إرسال البيانات إلى بطاقة الرسوميات مرة واحدة فقط، بعدها يجب على بطاقة الرسوميات تخزين هذه البيانات في الذاكرة الخاصة به (التي تتميز بالسرعة العالية). يمكن عمل ذلك من خلال تخزين الرؤوس في ذاكرة للرؤوس “VertexBuffer”، و تخزين الفهارس في ذاكرة للفهارس “IndexBuffer”.

إبدأ بتعريف المتغييرن التاليين في أعلى الكود:

 VertexBuffer myVertexBuffer;
 IndexBuffer myIndexBuffer;

سوف نقوم بتجهيز و تعبئة المتغيرات في الدالة جديدة، CopyToBuffers. الكود التالي يؤدي المهمة بالنسبة لذاكرة الرؤوس:

 private void CopyToBuffers()
 {
	 myVertexBuffer = new VertexBuffer(device, vertices.Length * VertexPositionNormalColored.SizeInBytes, BufferUsage.WriteOnly);
	 myVertexBuffer.SetData(vertices);
 }

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

السطر الثاني يقوم بنسخ البيانات من مصفوفة الرؤوس إلى الذاكرة في بطاقة الرسوميات.

نحتاج أيضا لعمل نفس الشي للفهارس، لذا ضع الكود التالي في نهاية الدالة:

 myIndexBuffer = new IndexBuffer(device, typeof(int), indices.Length, BufferUsage.WriteOnly);
 myIndexBuffer.SetData(indices);

لإيجاد كم بايت يلزمنا حجزه، قمنا بتمرير نوع كل فهرس، إضافة إلى عدد الفهارس التي سوف نقوم بتخزينها. السطر الثاني يقوم عمليا بنسخ الفهارس إلى ذاكرة بطاقة الرسوميات.

لا تنسى أن تستدعي هذه الدالة من داخل الدالة LoadContent:

 CopyToBuffers();

بعد إنهاء ذلك، كل ما عليك عمليه هو أن ترشد بطاقة الرسوميات أن تقوم بالرسم من داخل الذاكرة الخاصة بها بإستخدام الدالة DrawIndexedPrimitive بدلا من الدالة DrawUserIndexedPrimitive. قبل إستدعائنا لهذه الدالة، نحتاج أن نطلب من بطاقة الرسوميات أن تقرأ البيانات من الذاكرة الخاصة بها، في داخل الدالة Draw:

 device.VertexDeclaration = myVertexDeclaration;
 device.Indices = myIndexBuffer;
 device.Vertices[0].SetSource(myVertexBuffer, 0, VertexPositionNormalColored.SizeInBytes);
 device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertices.Length, 0, indices.Length / 3);

قمنا بتحديد المكان الذي سوف تقوم بطاقة الرسوميات بقراءة الرؤوس و الفهارس منه، ثم طلبنا منها رسم المثلثات.

تشغيل هذا الكود سوف يعطيك نفس النتيجة في الدرس السابق، ولكن في هذه المرة لا يوجد هناك نقل بيانات على بطاقة الرسوميات!

post-133895-1249897194_thumb.jpg

بإمكانك محاولة حل التمرين التالي، لممارسة ما قد تعلمته:

• في هذا الكود، ما زلنا نحتفظ بمصفوفات الرؤوس و الفهارس كمتغيرات عامة “Global”، فقط لأننا بحاجة لأن نعرف أطوالها في إستدعاء الدالة DrawIndexesPrimitivesلذا إذا كنت تتذكر أطوالها بإمكانك أن تتخلص منها و تحرر بعض من الذاكرة.

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

Learn3D_Xna_S1L13.pdf

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

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

المترجم : خلدون خالد

الفريق العربي للبرمجة : /

بالتوفيق للجميع :wub: ، دعواتكم ..

الكود النهائي للسلسلة:

 using System;

 using System.[color= #202020;]Collections.[color= #202020;]Generic;

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

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

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

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

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

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

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

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

 

 namespace XNAtutorial

 [color= #009900;]{

     public class Game1 [color= #339933;]: Microsoft.[color= #202020;]Xna.[color= #202020;]Framework.[color= #202020;]Game

     [color= #009900;]{

         public [color= #993333;]struct VertexPositionNormalColored

         [color= #009900;]{

             public Vector3 Position;

             public Color Color;

             public Vector3 Normal;

 

             public [color= #993333;]static [color= #993333;]int SizeInBytes [color= #339933;]= [color= #cc66cc;]7 [color= #339933;]* [color= #cc66cc;]4;

             public [color= #993333;]static VertexElement[color= #009900;][[color= #009900;]] VertexElements [color= #339933;]= new VertexElement[color= #009900;][[color= #009900;]]

              [color= #009900;]{

                  new VertexElement[color= #009900;]( [color= #cc66cc;]0, [color= #cc66cc;]0, VertexElementFormat.[color= #202020;]Vector3, VertexElementMethod.[color= #202020;]Def
ault, VertexElementUsage.[color= #202020;]Position, [color= #cc66cc;]0 [color= #009900;]),

                  new VertexElement[color= #009900;]( [color= #cc66cc;]0, [color= #993333;]sizeof[color= #009900;]([color= #993333;]float[color= #009900;]) [color= #339933;]* [color= #cc66cc;]3, VertexElementFormat.[color= #202020;]Color, VertexEle
mentMethod.[color= #b1b100;]Default, VertexElementUsage.[color= #202020;]Color, [color= #cc66cc;]0 [color= #009900;]),

                  new VertexElement[color= #009900;]( [color= #cc66cc;]0, [color= #993333;]sizeof[color= #009900;]([color= #993333;]float[color= #009900;]) [color= #339933;]* [color= #cc66cc;]4, VertexElementFormat.[color= #202020;]Vector3, VertexE
lementMethod.[color= #b1b100;]Default, VertexElementUsage.[color= #202020;]Normal, [color= #cc66cc;]0 [color= #009900;]),

              [color= #009900;]};

         [color= #009900;]}

 

         GraphicsDeviceManager graphics;

         SpriteBatch spriteBatch;

         GraphicsDevice device;

         Effect effect;

 

         VertexPositionNormalColored[color= #009900;][[color= #009900;]] vertices;

         VertexBuffer myVertexBuffer;

 

         VertexDeclaration myVertexDeclaration;

         [color= #993333;]int[color= #009900;][[color= #009900;]] indices;

         IndexBuffer myIndexBuffer;

 

         Matrix viewMatrix;

         Matrix projectionMatrix;

 

         private [color= #993333;]int terrainWidth;

         private [color= #993333;]int terrainHeight;

         private [color= #993333;]float[color= #009900;][,[color= #009900;]] heightData;

 

         [color= #993333;]float angle [color= #339933;]= [color= #cc66cc;]0;

 

         public Game1[color= #009900;]([color= #009900;])

         [color= #009900;]{

             graphics [color= #339933;]= new GraphicsDeviceManager[color= #009900;](this[color= #009900;]);

             Content.[color= #202020;]RootDirectory [color= #339933;]= [color= #ff0000;]"Content";

         [color= #009900;]}

 

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

         [color= #009900;]{

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

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

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

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

             Window.[color= #202020;]Title [color= #339933;]= [color= #ff0000;]"Riemer's XNA Tutorials -- Series 1";

 

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

         [color= #009900;]}

 

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

         [color= #009900;]{

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

             spriteBatch [color= #339933;]= new SpriteBatch[color= #009900;](GraphicsDevice[color= #009900;]);

 

            effect [color= #339933;]= Content.[color= #202020;]Load<Effect> [color= #009900;]([color= #ff0000;]"effects"[color= #009900;]);

 

            Texture2D heightMap [color= #339933;]= Content.[color= #202020;]Load<Texture2D> [color= #009900;]([color= #ff0000;]"heightmap"[color= #009900;]);            LoadHeightD
ata[color= #009900;](heightMap[color= #009900;]);

 

            SetUpIndices[color= #009900;]([color= #009900;]);

            SetUpVertices[color= #009900;]([color= #009900;]);

            SetUpCamera[color= #009900;]([color= #009900;]);

            CalculateNormals[color= #009900;]([color= #009900;]);

 

             CopyToBuffers[color= #009900;]([color= #009900;]);

         [color= #009900;]}

 

         private [color= #993333;]void SetUpVertices[color= #009900;]([color= #009900;])

         [color= #009900;]{

             [color= #993333;]float minHeight [color= #339933;]= [color= #993333;]float.[color= #202020;]MaxValue;

             [color= #993333;]float maxHeight [color= #339933;]= [color= #993333;]float.[color= #202020;]MinValue;

             [color= #b1b100;]for [color= #009900;]([color= #993333;]int x [color= #339933;]= [color= #cc66cc;]0; x < terrainWidth; x[color= #339933;]++[color= #009900;])

             [color= #009900;]{

                 [color= #b1b100;]for [color= #009900;]([color= #993333;]int y [color= #339933;]= [color= #cc66cc;]0; y < terrainHeight; y[color= #339933;]++[color= #009900;])

                 [color= #009900;]{

                     [color= #b1b100;]if [color= #009900;](heightData[color= #009900;][x, y[color= #009900;]] < minHeight[color= #009900;])

                         minHeight [color= #339933;]= heightData[color= #009900;][x, y[color= #009900;]];

                     [color= #b1b100;]if [color= #009900;](heightData[color= #009900;][x, y[color= #009900;]] > maxHeight[color= #009900;])

                         maxHeight [color= #339933;]= heightData[color= #009900;][x, y[color= #009900;]];

                 [color= #009900;]}

             [color= #009900;]}

 

             vertices [color= #339933;]= new VertexPositionNormalColored[color= #009900;][terrainWidth [color= #339933;]* terrainHeight[color= #009900;]];

             [color= #b1b100;]for [color= #009900;]([color= #993333;]int x [color= #339933;]= [color= #cc66cc;]0; x < terrainWidth; x[color= #339933;]++[color= #009900;])

             [color= #009900;]{

                 [color= #b1b100;]for [color= #009900;]([color= #993333;]int y [color= #339933;]= [color= #cc66cc;]0; y < terrainHeight; y[color= #339933;]++[color= #009900;])

                 [color= #009900;]{

                     vertices[color= #009900;][x [color= #339933;]+ y [color= #339933;]* terrainWidth[color= #009900;]].[color= #202020;]Position [color= #339933;]= new Vector3[color= #009900;](x, heightData[color= #009900;][x, y[color= #009900;]],
 [color= #339933;]-y[color= #009900;]);

 

                     [color= #b1b100;]if [color= #009900;](heightData[color= #009900;][x, y[color= #009900;]] < minHeight [color= #339933;]+ [color= #009900;](maxHeight [color= #339933;]- minHeight[color= #009900;]) [color= #339933;]/ [color= #cc66cc;]4[color= #009900;])

                         vertices[color= #009900;][x [color= #339933;]+ y [color= #339933;]* terrainWidth[color= #009900;]].[color= #202020;]Color [color= #339933;]= Color.[color= #202020;]Blue;

                     [color= #b1b100;]else [color= #b1b100;]if [color= #009900;](heightData[color= #009900;][x, y[color= #009900;]] < minHeight [color= #339933;]+ [color= #009900;](maxHeight [color= #339933;]- minHeight[color= #009900;]) [color= #339933;]* [color= #cc66cc;]2 [color= #339933;]/ [color= #cc66cc;]4[color= #009900;])

                         vertices[color= #009900;][x [color= #339933;]+ y [color= #339933;]* terrainWidth[color= #009900;]].[color= #202020;]Color [color= #339933;]= Color.[color= #202020;]Green;

                     [color= #b1b100;]else [color= #b1b100;]if [color= #009900;](heightData[color= #009900;][x, y[color= #009900;]] < minHeight [color= #339933;]+ [color= #009900;](maxHeight [color= #339933;]- minHeight[color= #009900;]) [color= #339933;]* [color= #cc66cc;]3 [color= #339933;]/ [color= #cc66cc;]4[color= #009900;])

                         vertices[color= #009900;][x [color= #339933;]+ y [color= #339933;]* terrainWidth[color= #009900;]].[color= #202020;]Color [color= #339933;]= Color.[color= #202020;]Brown;

                     [color= #b1b100;]else

                         vertices[color= #009900;][x [color= #339933;]+ y [color= #339933;]* terrainWidth[color= #009900;]].[color= #202020;]Color [color= #339933;]= Color.[color= #202020;]White;

                 [color= #009900;]}

             [color= #009900;]}

 

             myVertexDeclaration [color= #339933;]= new VertexDeclaration[color= #009900;](device, VertexPositionNormalColored.[color= #202020;]Ve
rtexElements[color= #009900;]);

         [color= #009900;]}

 

         private [color= #993333;]void SetUpIndices[color= #009900;]([color= #009900;])

         [color= #009900;]{

             indices [color= #339933;]= new [color= #993333;]int[color= #009900;][[color= #009900;](terrainWidth [color= #339933;]- [color= #cc66cc;]1[color= #009900;]) [color= #339933;]* [color= #009900;](terrainHeight [color= #339933;]- [color= #cc66cc;]1[color= #009900;]) [color= #339933;]* [color= #cc66cc;]6[color= #009900;]];

             [color= #993333;]int counter [color= #339933;]= [color= #cc66cc;]0;

             [color= #b1b100;]for [color= #009900;]([color= #993333;]int y [color= #339933;]= [color= #cc66cc;]0; y < terrainHeight [color= #339933;]- [color= #cc66cc;]1; y[color= #339933;]++[color= #009900;])

             [color= #009900;]{

                 [color= #b1b100;]for [color= #009900;]([color= #993333;]int x [color= #339933;]= [color= #cc66cc;]0; x < terrainWidth [color= #339933;]- [color= #cc66cc;]1; x[color= #339933;]++[color= #009900;])

                 [color= #009900;]{

                     [color= #993333;]int lowerLeft [color= #339933;]= x [color= #339933;]+ y[color= #339933;]*terrainWidth;

                     [color= #993333;]int lowerRight [color= #339933;]= [color= #009900;](x [color= #339933;]+ [color= #cc66cc;]1[color= #009900;]) [color= #339933;]+ y[color= #339933;]*terrainWidth;

                     [color= #993333;]int topLeft [color= #339933;]= x [color= #339933;]+ [color= #009900;](y [color= #339933;]+ [color= #cc66cc;]1[color= #009900;]) [color= #339933;]* terrainWidth;

                     [color= #993333;]int topRight [color= #339933;]= [color= #009900;](x [color= #339933;]+ [color= #cc66cc;]1[color= #009900;]) [color= #339933;]+ [color= #009900;](y [color= #339933;]+ [color= #cc66cc;]1[color= #009900;]) [color= #339933;]* terrainWidth;

 

                     indices[color= #009900;][counter[color= #339933;]++[color= #009900;]] [color= #339933;]= topLeft;

                     indices[color= #009900;][counter[color= #339933;]++[color= #009900;]] [color= #339933;]= lowerRight;

                     indices[color= #009900;][counter[color= #339933;]++[color= #009900;]] [color= #339933;]= lowerLeft;

 

                     indices[color= #009900;][counter[color= #339933;]++[color= #009900;]] [color= #339933;]= topLeft;

                     indices[color= #009900;][counter[color= #339933;]++[color= #009900;]] [color= #339933;]= topRight;

                     indices[color= #009900;][counter[color= #339933;]++[color= #009900;]] [color= #339933;]= lowerRight;

                 [color= #009900;]}

             [color= #009900;]}

         [color= #009900;]}

 

         private [color= #993333;]void CalculateNormals[color= #009900;]([color= #009900;])

         [color= #009900;]{

             [color= #b1b100;]for [color= #009900;]([color= #993333;]int i [color= #339933;]= [color= #cc66cc;]0; i < vertices.[color= #202020;]Length; i[color= #339933;]++[color= #009900;])

                 vertices[color= #009900;][i[color= #009900;]].[color= #202020;]Normal [color= #339933;]= new Vector3[color= #009900;]([color= #cc66cc;]0, [color= #cc66cc;]0, [color= #cc66cc;]0[color= #009900;]);

 

             [color= #b1b100;]for [color= #009900;]([color= #993333;]int i [color= #339933;]= [color= #cc66cc;]0; i < indices.[color= #202020;]Length [color= #339933;]/ [color= #cc66cc;]3; i[color= #339933;]++[color= #009900;])

             [color= #009900;]{

                 [color= #993333;]int index1 [color= #339933;]= indices[color= #009900;][i [color= #339933;]* [color= #cc66cc;]3[color= #009900;]];

                 [color= #993333;]int index2 [color= #339933;]= indices[color= #009900;][i [color= #339933;]* [color= #cc66cc;]3 [color= #339933;]+ [color= #cc66cc;]1[color= #009900;]];

                 [color= #993333;]int index3 [color= #339933;]= indices[color= #009900;][i [color= #339933;]* [color= #cc66cc;]3 [color= #339933;]+ [color= #cc66cc;]2[color= #009900;]];

 

                 Vector3 side1 [color= #339933;]= vertices[color= #009900;][index1[color= #009900;]].[color= #202020;]Position [color= #339933;]- vertices[color= #009900;][index3[color= #009900;]].[color= #202020;]Position;

                 Vector3 side2 [color= #339933;]= vertices[color= #009900;][index1[color= #009900;]].[color= #202020;]Position [color= #339933;]- vertices[color= #009900;][index2[color= #009900;]].[color= #202020;]Position;

                 Vector3 normal [color= #339933;]= Vector3.[color= #202020;]Cross[color= #009900;](side1, side2[color= #009900;]);

 

                 vertices[color= #009900;][index1[color= #009900;]].[color= #202020;]Normal [color= #339933;]+= normal;

                 vertices[color= #009900;][index2[color= #009900;]].[color= #202020;]Normal [color= #339933;]+= normal;

                 vertices[color= #009900;][index3[color= #009900;]].[color= #202020;]Normal [color= #339933;]+= normal;                

             [color= #009900;]}

 

             [color= #b1b100;]for [color= #009900;]([color= #993333;]int i [color= #339933;]= [color= #cc66cc;]0; i < vertices.[color= #202020;]Length; i[color= #339933;]++[color= #009900;])

                 vertices[color= #009900;][i[color= #009900;]].[color= #202020;]Normal.[color= #202020;]Normalize[color= #009900;]([color= #009900;]);

         [color= #009900;]}

 

         private [color= #993333;]void CopyToBuffers[color= #009900;]([color= #009900;])

         [color= #009900;]{

             myVertexBuffer [color= #339933;]= new VertexBuffer[color= #009900;](device, vertices.[color= #202020;]Length [color= #339933;]* VertexPositionNormalCo
lored.[color= #202020;]SizeInBytes, BufferUsage.[color= #202020;]WriteOnly[color= #009900;]);

             myVertexBuffer.[color= #202020;]SetData[color= #009900;](vertices[color= #009900;]);

 

             myIndexBuffer [color= #339933;]= new IndexBuffer[color= #009900;](device, typeof[color= #009900;]([color= #993333;]int[color= #009900;]), indices.[color= #202020;]Length, BufferUsage.[color= #202020;]W
riteOnly[color= #009900;]);

             myIndexBuffer.[color= #202020;]SetData[color= #009900;](indices[color= #009900;]);

         [color= #009900;]}

 

         private [color= #993333;]void SetUpCamera[color= #009900;]([color= #009900;])

         [color= #009900;]{

             viewMatrix [color= #339933;]= Matrix.[color= #202020;]CreateLookAt[color= #009900;](new Vector3[color= #009900;]([color= #cc66cc;]0, [color= #cc66cc;]100, [color= #cc66cc;]100[color= #009900;]), new Vector3[color= #009900;]([color= #cc66cc;]0, [color= #cc66cc;]0, [color= #cc66cc;]0[color= #009900;]), n
ew Vector3[color= #009900;]([color= #cc66cc;]0, [color= #cc66cc;]1, [color= #cc66cc;]0[color= #009900;])[color= #009900;]);

             projectionMatrix [color= #339933;]= Matrix.[color= #202020;]CreatePerspectiveFieldOfView[color= #009900;](MathHelper.[color= #202020;]PiOver4, device.[color= #202020;]
Viewport.[color= #202020;]AspectRatio, [color= #cc66cc;]1.0f, [color= #cc66cc;]300.0f[color= #009900;]);

         [color= #009900;]}

 

         private [color= #993333;]void LoadHeightData[color= #009900;](Texture2D heightMap[color= #009900;])

         [color= #009900;]{

             terrainWidth [color= #339933;]= heightMap.[color= #202020;]Width;

             terrainHeight [color= #339933;]= heightMap.[color= #202020;]Height;

 

             Color[color= #009900;][[color= #009900;]] heightMapColors [color= #339933;]= new Color[color= #009900;][terrainWidth [color= #339933;]* terrainHeight[color= #009900;]];

             heightMap.[color= #202020;]GetData[color= #009900;](heightMapColors[color= #009900;]);

 

             heightData [color= #339933;]= new [color= #993333;]float[color= #009900;][terrainWidth, terrainHeight[color= #009900;]];

             [color= #b1b100;]for [color= #009900;]([color= #993333;]int x [color= #339933;]= [color= #cc66cc;]0; x < terrainWidth; x[color= #339933;]++[color= #009900;])

                 [color= #b1b100;]for [color= #009900;]([color= #993333;]int y [color= #339933;]= [color= #cc66cc;]0; y < terrainHeight; y[color= #339933;]++[color= #009900;])

                     heightData[color= #009900;][x, y[color= #009900;]] [color= #339933;]= heightMapColors[color= #009900;][x [color= #339933;]+ y [color= #339933;]* terrainWidth[color= #009900;]].[color= #202020;]R [color= #339933;]/ [color= #cc66cc;]5.0f;

         [color= #009900;]}

 

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

         [color= #009900;]{

         [color= #009900;]}

 

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

         [color= #009900;]{

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

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

 

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

             [color= #b1b100;]if [color= #009900;](keyState.[color= #202020;]IsKeyDown[color= #009900;](Keys.[color= #202020;]Delete[color= #009900;])[color= #009900;])

                 angle [color= #339933;]+= [color= #cc66cc;]0.05f;

             [color= #b1b100;]if [color= #009900;](keyState.[color= #202020;]IsKeyDown[color= #009900;](Keys.[color= #202020;]PageDown[color= #009900;])[color= #009900;])

                 angle [color= #339933;]-= [color= #cc66cc;]0.05f;

 

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

         [color= #009900;]}

 

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

         [color= #009900;]{

             device.[color= #202020;]Clear[color= #009900;](ClearOptions.[color= #202020;]Target | ClearOptions.[color= #202020;]DepthBuffer, Color.[color= #202020;]Black, [color= #cc66cc;]1.0f, [color= #cc66cc;]0[color= #009900;])
;

             device.[color= #202020;]RenderState.[color= #202020;]CullMode [color= #339933;]= CullMode.[color= #202020;]None;

 

             Matrix worldMatrix [color= #339933;]= Matrix.[color= #202020;]CreateTranslation[color= #009900;]([color= #339933;]-terrainWidth [color= #339933;]/ [color= #cc66cc;]2.0f, [color= #cc66cc;]0, terrainHeig
ht [color= #339933;]/ [color= #cc66cc;]2.0f[color= #009900;]) [color= #339933;]* Matrix.[color= #202020;]CreateRotationY[color= #009900;](angle[color= #009900;]);

             effect.[color= #202020;]CurrentTechnique [color= #339933;]= effect.[color= #202020;]Techniques[color= #009900;][[color= #ff0000;]"Colored"[color= #009900;]];

             effect.[color= #202020;]Parameters[color= #009900;][[color= #ff0000;]"xView"[color= #009900;]].[color= #202020;]SetValue[color= #009900;](viewMatrix[color= #009900;]);

             effect.[color= #202020;]Parameters[color= #009900;][[color= #ff0000;]"xProjection"[color= #009900;]].[color= #202020;]SetValue[color= #009900;](projectionMatrix[color= #009900;]);

             effect.[color= #202020;]Parameters[color= #009900;][[color= #ff0000;]"xWorld"[color= #009900;]].[color= #202020;]SetValue[color= #009900;](worldMatrix[color= #009900;]);

 

             effect.[color= #202020;]Parameters[color= #009900;][[color= #ff0000;]"xEnableLighting"[color= #009900;]].[color= #202020;]SetValue[color= #009900;]([color= #000000; font-weight: bold;]true[color= #009900;]);

             Vector3 lightDirection [color= #339933;]= new Vector3[color= #009900;]([color= #cc66cc;]1.0f, [color= #cc66cc;]-1.0f, [color= #cc66cc;]-1.0f[color= #009900;]);

             lightDirection.[color= #202020;]Normalize[color= #009900;]([color= #009900;]);

             effect.[color= #202020;]Parameters[color= #009900;][[color= #ff0000;]"xLightDirection"[color= #009900;]].[color= #202020;]SetValue[color= #009900;](lightDirection[color= #009900;]);

             effect.[color= #202020;]Parameters[color= #009900;][[color= #ff0000;]"xAmbient"[color= #009900;]].[color= #202020;]SetValue[color= #009900;]([color= #cc66cc;]0.1f[color= #009900;]);

 

 

             effect.[color= #202020;]Begin[color= #009900;]([color= #009900;]);

             foreach [color= #009900;](EffectPass pass in effect.[color= #202020;]CurrentTechnique.[color= #202020;]Passes[color= #009900;])

             [color= #009900;]{

                 pass.[color= #202020;]Begin[color= #009900;]([color= #009900;]);

 

                 device.[color= #202020;]VertexDeclaration [color= #339933;]= myVertexDeclaration;

                 device.[color= #202020;]Indices [color= #339933;]= myIndexBuffer;

                 device.[color= #202020;]Vertices[color= #009900;][[color= #cc66cc;]0[color= #009900;]].[color= #202020;]SetSource[color= #009900;](myVertexBuffer, [color= #cc66cc;]0, VertexPositionNormalColored.[color= #202020;]Si
zeInBytes[color= #009900;]);

                 device.[color= #202020;]DrawIndexedPrimitives[color= #009900;](PrimitiveType.[color= #202020;]TriangleList, [color= #cc66cc;]0, [color= #cc66cc;]0, vertices.[color= #202020;]Length
, [color= #cc66cc;]0, indices.[color= #202020;]Length [color= #339933;]/ [color= #cc66cc;]3[color= #009900;]);

 

                 pass.[color= #202020;]End[color= #009900;]([color= #009900;]);

             [color= #009900;]}

             effect.[color= #202020;]End[color= #009900;]([color= #009900;]);

 

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

         [color= #009900;]}

     [color= #009900;]}

 [color= #009900;]}

هل من مهتم بترجمة الأجزاء التاليه ؟؟ :)

1
#2

بارك الله فيك حبيبي ..

اقتباس
هل من مهتم بترجمة الأجزاء التاليه ؟؟

مهتم باعادة صفّها وتنظيمها ونشرها بشكل اخر .. لايعني هذا أن التنسيق ليس جيد ... ولكن جمال المقالات عندما تكون في موقع ليسهل قراءتها والاستفادة منها .. ويكون لها رابط خاص أيضا .. مثل :

www.test.com/xna3d

هل لديك اهتمام مماثل :D .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3
الشمري كتب:
بارك الله فيك حبيبي ..

مهتم باعادة صفّها وتنظيمها ونشرها بشكل اخر .. لايعني هذا أن التنسيق ليس جيد ... ولكن جمال المقالات عندما تكون في موقع ليسهل قراءتها والاستفادة منها .. ويكون لها رابط خاص أيضا .. مثل :

www.test.com/xna3d

هل لديك اهتمام مماثل :D .

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

إذا كان في بالك شيئ آخر خبرني :happy: ؟؟

#4
اقتباس
إذا كان في بالك شيئ آخر خبرني

قريباً ان شاء الله .. لكن .. ادع الله أن تسير الامور على مايرام .. حتى ذلك الحين :D

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#5

و الله يا أخي انت من المبدعين ...

بارك الله لك ... و منتظرين باقي السلاسل :)

أجمل شيء الان هو ترجمة العلوم للعربية ليسهل علي الناس التطلع اليه و لو ليس بغرض التعلم ...

انا ادرس ال XNA منذ فترة وجيزة وبدأت بدروس 3DBUzz و لم انهيها حتي الان (فوق ال 100 ساعة من الفيديوهات ) و اتطلع الي البدء في سلسلتك

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

#6

ماشاء الله عليك .. اخي هل بتترجم السللاسل القادمة؟؟؟

#7

أهلا بيك أخي و بكل الأخوة

اقتباس
اخي هل بتترجم السللاسل القادمة؟؟؟

حاليا متوقف بسبب الإنشغال، ولكن سوف أقوم بالعمل على السلاسل القادمة في أقرب فرصة إن شاء الله

#8

حبيبي خلدون :)

لا اله الا الله محمد رسول الله

شبكة شباب IT

http://www.shababit.net

shababit.gif

#9

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

مجهود رااااائع

تحيتي

wzm52va7ft2w.jpg

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