بســم الله الـرحمــن الرحيــم الدرس الثالث أهلا بكم في الدرس الثالث من سلسلة دروس تعلم ال3D Xna السلسلة الأولى، في هذا الدرس سوف نقوم برسم المثلث الأول. هذا الدرس سوف يغطي الأساسيات في الرسم. في البداية هناك بضعة اشياء يجب عليك معرفتها. كل عنصر يتم رسمه في العالم الثلاثي الأبعاد، يتم رسمه بإستخدام المثلثات. حتى الكرات يمكن وصفها بإستخدام المثلثات، إذا كان هناك ما يكفي منهم. مباشرة، يتم وصف المثلث بإستخدام ثلاث رؤوس. كل رأس معرفة بإستخدام متجه “Vector”، كل متجه يتم وصفه بإستخدام ثلاث إحداثيات هي X,Y و Z. مع ذلك مجرد معرفة إحداثيات الرأس قد لايكون كافيا. على سبيل المثال، ربما يلزمك أن تقوم بتحديد لون معين لرأس. في هذه الحالة يمكن وصف الرأس “Vertex” (الرؤوس “Vertices”) بـ: مجموعة من الخصائص لرأس معين بما فيها الموقع “Position”، اللون و ما إلى ذلك. ال Xna لديها تركيب “Structure” يلائم تماما الحاجة لتخزين معلومات الرأس: التركيب VertexPositionColor. رأس من هذا النوع بإمكانه تخزين موقع و لون نقطة، و هي الأفضل لكي نبدأ بها. من أجل تعريف مثلث، سوف نحتاج إلى ثلاثة من هذه الرؤوس، الذين سوف نقوم بتخزينهم في مصفوفة. لذا دعنا نقوم بتعريف هذا المتغير في أعلى الصنف “Class”:
VertexPositionColor[] vertices;
private void SetUpVertices() { vertices = new VertexPositionColor[3]; vertices[0].Position = new Vector3(-0.5f, -0.5f, 0f); vertices[0].Color = Color.Red; vertices[1].Position = new Vector3(0f, 0.5f, 0f); vertices[1].Color = Color.Green; vertices[2].Position = new Vector3(0.5f, -0.5f, 0f); vertices[2].Color = Color.Yellow; }
myVertexDeclaration = new VertexDeclaration(device, VertexPositionColor.VertexElements);
SetUpVertices();
device.VertexDeclaration = myVertexDeclaration; device.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, 1);
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; VertexPositionColor vertices; VertexDeclaration myVertexDeclaration; 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(); } private void SetUpVertices() { vertices = new VertexPositionColor[3]; vertices[0].Position = new Vector3(-0.5f, -0.5f, 0f); vertices[0].Color = Color.Red; vertices[1].Position = new Vector3(0, 0.5f, 0f); vertices[1].Color = Color.Green; vertices[2].Position = new Vector3(0.5f, -0.5f, 0f); vertices[2].Color = Color.Yellow; myVertexDeclaration = new VertexDeclaration(device, VertexPositionColor.VertexElements); } protected override void LoadContent() { device = graphics.GraphicsDevice; spriteBatch = new SpriteBatch(GraphicsDevice); effect = Content.Load ("effects"); SetUpVertices(); } 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(); device.VertexDeclaration = myVertexDeclaration; device.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, 1); pass.End(); } effect.End(); base.Draw(gameTime); } } }