kldoon

الدرس التاسع من سلسلة دروس تعلم 3d Xna

1 مشاركة في هذا الموضوع

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

الدرس التاسع

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

بإستخدام ال Xna، من السهل جدا قراءة حالة لوحة المفاتيح الحالية. المكتبة الصحيحة، Microsoft.Xna.Framework.Input، قد تم ربطها مباشرة بالبرنامج عندما قمت ببدء مشروع Xna، لذا بإستطاعتنا مباشرة التوجه لكتابة الكود الذي يقرأ مدخلات لوحة المفاتيح.

قم بإضافة الكود الصغير التالي إلى الدالة Update، التي يتم إستدعائها 60 مره في الثانية:

 KeyboardState keyState = Keyboard.GetState();
if (keyState.IsKeyDown(Keys.Delete))
angle += 0.05f;
if (keyState.IsKeyDown(Keys.PageDown))
angle -= 0.05f;

هنا يتم وضع الحالة الحالية للوحة المفاتيح في المتغير ‘KeyState’. بإستخدام هذا المتغير، بإمكانك القراءة مباشرة ما هي المفاتيح المضغوطة! عندما يقوم المستخدم بضغط الزر Delete أو الزر PageDown، سوف يتم تغير قيمة المتغير angle.

في الدالة Draw، يجب علينا التأكد أن هذا التدوير يتم أخذه بالحسبان في مصفوفة العالم:

 Matrix worldMatrix = Matrix.CreateTranslation(-terrainWidth / 2.0f, 0, terrainHeight / 2.0f) * Matrix.CreateRotationY(angle);

التضاريس يتم تدويرها حول محور Y المتجه للأعلى بعد نقله إلى إحداثي نقطة الأصل (0,0,0).

هذا كل شيئ! عند قيامك بتشغيل الكود، بإمكانك تدوير التضاريس ببساطه عن طريق ضغط زر Delete و زر PageDown!

حاول حل التمرين التالي، من أجل ممارسة ما قد تعلمته:

• قم بإضافة بعض الكود بحيث يتم قراءة الأسهم. و قم بتعديل مصفوفة العالم بحيث يتم تحريك التضاريس بإتجاهات الأسهم المضغوطة.

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

Learn3D_Xna_S1L9.pdf

الكود حتى اللحظة:

انسخ الكود
  1. using System;
  2. using System.[color= #202020;]Collections[/color].[color= #202020;]Generic[/color];
  3. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color];
  4. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Audio[/color];
  5. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Content[/color];
  6. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]GamerServices[/color];
  7. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Graphics[/color];
  8. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Input[/color];
  9. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Net[/color];
  10. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Storage[/color];
  11.  
  12. namespace XNAtutorial
  13. [color= #009900;]{[/color]
  14. public class Game1 [color= #339933;]:[/color] Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Game[/color]
  15. [color= #009900;]{[/color]
  16. GraphicsDeviceManager graphics;
  17. SpriteBatch spriteBatch;
  18. GraphicsDevice device;
  19. Effect effect;
  20. VertexPositionColor[color= #009900;][[/color][color= #009900;]][/color] vertices;
  21. VertexDeclaration myVertexDeclaration;
  22. [color= #993333;]int[/color][color= #009900;][[/color][color= #009900;]][/color] indices;
  23.  
  24. Matrix viewMatrix;
  25. Matrix projectionMatrix;
  26.  
  27. private [color= #993333;]int[/color] terrainWidth;
  28. private [color= #993333;]int[/color] terrainHeight;
  29. private [color= #993333;]float[/color][color= #009900;][[/color],[color= #009900;]][/color] heightData;
  30.  
  31. [color= #993333;]float[/color] angle [color= #339933;]=[/color] [color= #cc66cc;]0[/color];
  32.  
  33. public Game1[color= #009900;]([/color][color= #009900;])[/color]
  34. [color= #009900;]{[/color]
  35. graphics [color= #339933;]=[/color] new GraphicsDeviceManager[color= #009900;]([/color]this[color= #009900;])[/color];
  36. Content.[color= #202020;]RootDirectory[/color] [color= #339933;]=[/color] [color= #ff0000;]"Content"[/color];
  37. [color= #009900;]}[/color]
  38.  
  39. protected override [color= #993333;]void[/color] Initialize[color= #009900;]([/color][color= #009900;])[/color]
  40. [color= #009900;]{[/color]
  41. graphics.[color= #202020;]PreferredBackBufferWidth[/color] [color= #339933;]=[/color] [color= #cc66cc;]500[/color];
  42. graphics.[color= #202020;]PreferredBackBufferHeight[/color] [color= #339933;]=[/color] [color= #cc66cc;]500[/color];
  43. graphics.[color= #202020;]IsFullScreen[/color] [color= #339933;]=[/color] [color= #000000; font-weight: bold;]false[/color];
  44. graphics.[color= #202020;]ApplyChanges[/color][color= #009900;]([/color][color= #009900;])[/color];
  45. Window.[color= #202020;]Title[/color] [color= #339933;]=[/color] [color= #ff0000;]"Riemer's XNA Tutorials -- Series 1"[/color];
  46.  
  47. base.[color= #202020;]Initialize[/color][color= #009900;]([/color][color= #009900;])[/color];
  48. [color= #009900;]}[/color]
  49.  
  50. protected override [color= #993333;]void[/color] LoadContent[color= #009900;]([/color][color= #009900;])[/color]
  51. [color= #009900;]{[/color]
  52. device [color= #339933;]=[/color] graphics.[color= #202020;]GraphicsDevice[/color];
  53. spriteBatch [color= #339933;]=[/color] new SpriteBatch[color= #009900;]([/color]GraphicsDevice[color= #009900;])[/color];
  54.  
  55. effect [color= #339933;]=[/color] Content.[color= #202020;]Load[/color]<Effect> [color= #009900;]([/color][color= #ff0000;]"effects"[/color][color= #009900;])[/color];
  56.  
  57. Texture2D heightMap [color= #339933;]=[/color] Content.[color= #202020;]Load[/color]<Texture2D> [color= #009900;]([/color][color= #ff0000;]"heightmap"[/color][color= #009900;])[/color];
  58. LoadHeightData[color= #009900;]([/color]heightMap[color= #009900;])[/color];
  59.  
  60. SetUpVertices[color= #009900;]([/color][color= #009900;])[/color];
  61. SetUpCamera[color= #009900;]([/color][color= #009900;])[/color];
  62. SetUpIndices[color= #009900;]([/color][color= #009900;])[/color];
  63. [color= #009900;]}[/color]
  64.  
  65. private [color= #993333;]void[/color] SetUpVertices[color= #009900;]([/color][color= #009900;])[/color]
  66. [color= #009900;]{[/color]
  67. vertices [color= #339933;]=[/color] new VertexPositionColor[color= #009900;][[/color]terrainWidth [color= #339933;]*[/color] terrainHeight[color= #009900;]][/color];
  68. [color= #b1b100;]for[/color] [color= #009900;]([/color][color= #993333;]int[/color] x [color= #339933;]=[/color] [color= #cc66cc;]0[/color]; x < terrainWidth; x[color= #339933;]++[/color][color= #009900;])[/color]
  69. [color= #009900;]{[/color]
  70. [color= #b1b100;]for[/color] [color= #009900;]([/color][color= #993333;]int[/color] y [color= #339933;]=[/color] [color= #cc66cc;]0[/color]; y < terrainHeight; y[color= #339933;]++[/color][color= #009900;])[/color]
  71. [color= #009900;]{[/color]
  72. vertices[color= #009900;][[/color]x [color= #339933;]+[/color] y [color= #339933;]*[/color] terrainWidth[color= #009900;]][/color].[color= #202020;]Position[/color] [color= #339933;]=[/color] new Vector3[color= #009900;]([/color]x, heightData[color= #009900;][[/color]x, y[color= #009900;]][/color],
    [color= #339933;]-[/color]y[color= #009900;])[/color];
  73. vertices[color= #009900;][[/color]x [color= #339933;]+[/color] y [color= #339933;]*[/color] terrainWidth[color= #009900;]][/color].[color= #202020;]Color[/color] [color= #339933;]=[/color] Color.[color= #202020;]White[/color];
  74. [color= #009900;]}[/color]
  75. [color= #009900;]}[/color]
  76.  
  77. myVertexDeclaration [color= #339933;]=[/color] new VertexDeclaration[color= #009900;]([/color]device, VertexPositionColor.[color= #202020;]VertexEleme
    nts[/color][color= #009900;])[/color];
  78. [color= #009900;]}[/color]
  79.  
  80. private [color= #993333;]void[/color] SetUpIndices[color= #009900;]([/color][color= #009900;])[/color]
  81. [color= #009900;]{[/color]
  82. indices [color= #339933;]=[/color] new [color= #993333;]int[/color][color= #009900;][[/color][color= #009900;]([/color]terrainWidth [color= #339933;]-[/color] [color= #cc66cc;]1[/color][color= #009900;])[/color] [color= #339933;]*[/color] [color= #009900;]([/color]terrainHeight [color= #339933;]-[/color] [color= #cc66cc;]1[/color][color= #009900;])[/color] [color= #339933;]*[/color] [color= #cc66cc;]6[/color][color= #009900;]][/color];
  83. [color= #993333;]int[/color] counter [color= #339933;]=[/color] [color= #cc66cc;]0[/color];
  84. [color= #b1b100;]for[/color] [color= #009900;]([/color][color= #993333;]int[/color] y [color= #339933;]=[/color] [color= #cc66cc;]0[/color]; y < terrainHeight [color= #339933;]-[/color] [color= #cc66cc;]1[/color]; y[color= #339933;]++[/color][color= #009900;])[/color]
  85. [color= #009900;]{[/color]
  86. [color= #b1b100;]for[/color] [color= #009900;]([/color][color= #993333;]int[/color] x [color= #339933;]=[/color] [color= #cc66cc;]0[/color]; x < terrainWidth [color= #339933;]-[/color] [color= #cc66cc;]1[/color]; x[color= #339933;]++[/color][color= #009900;])[/color]
  87. [color= #009900;]{[/color]
  88. [color= #993333;]int[/color] lowerLeft [color= #339933;]=[/color] x [color= #339933;]+[/color] y[color= #339933;]*[/color]terrainWidth;
  89. [color= #993333;]int[/color] lowerRight [color= #339933;]=[/color] [color= #009900;]([/color]x [color= #339933;]+[/color] [color= #cc66cc;]1[/color][color= #009900;])[/color] [color= #339933;]+[/color] y[color= #339933;]*[/color]terrainWidth;
  90. [color= #993333;]int[/color] topLeft [color= #339933;]=[/color] x [color= #339933;]+[/color] [color= #009900;]([/color]y [color= #339933;]+[/color] [color= #cc66cc;]1[/color][color= #009900;])[/color] [color= #339933;]*[/color] terrainWidth;
  91. [color= #993333;]int[/color] topRight [color= #339933;]=[/color] [color= #009900;]([/color]x [color= #339933;]+[/color] [color= #cc66cc;]1[/color][color= #009900;])[/color] [color= #339933;]+[/color] [color= #009900;]([/color]y [color= #339933;]+[/color] [color= #cc66cc;]1[/color][color= #009900;])[/color] [color= #339933;]*[/color] terrainWidth;
  92.  
  93. indices[color= #009900;][[/color]counter[color= #339933;]++[/color][color= #009900;]][/color] [color= #339933;]=[/color] topLeft;
  94. indices[color= #009900;][[/color]counter[color= #339933;]++[/color][color= #009900;]][/color] [color= #339933;]=[/color] lowerRight;
  95. indices[color= #009900;][[/color]counter[color= #339933;]++[/color][color= #009900;]][/color] [color= #339933;]=[/color] lowerLeft;
  96.  
  97. indices[color= #009900;][[/color]counter[color= #339933;]++[/color][color= #009900;]][/color] [color= #339933;]=[/color] topLeft;
  98. indices[color= #009900;][[/color]counter[color= #339933;]++[/color][color= #009900;]][/color] [color= #339933;]=[/color] topRight;
  99. indices[color= #009900;][[/color]counter[color= #339933;]++[/color][color= #009900;]][/color] [color= #339933;]=[/color] lowerRight;
  100. [color= #009900;]}[/color]
  101. [color= #009900;]}[/color]
  102. [color= #009900;]}[/color]
  103.  
  104. private [color= #993333;]void[/color] SetUpCamera[color= #009900;]([/color][color= #009900;])[/color]
  105. [color= #009900;]{[/color]
  106. viewMatrix [color= #339933;]=[/color] Matrix.[color= #202020;]CreateLookAt[/color][color= #009900;]([/color]new Vector3[color= #009900;]([/color][color= #cc66cc;]60[/color], [color= #cc66cc;]80[/color], [color= #cc66cc;]-80[/color][color= #009900;])[/color], new Vector3[color= #009900;]([/color][color= #cc66cc;]0[/color], [color= #cc66cc;]0[/color], [color= #cc66cc;]0[/color][color= #009900;])[/color], ne
    w Vector3[color= #009900;]([/color][color= #cc66cc;]0[/color], [color= #cc66cc;]1[/color], [color= #cc66cc;]0[/color][color= #009900;])[/color][color= #009900;])[/color];
  107. projectionMatrix [color= #339933;]=[/color] Matrix.[color= #202020;]CreatePerspectiveFieldOfView[/color][color= #009900;]([/color]MathHelper.[color= #202020;]PiOver4[/color], device.[color= #202020;]V
    iewport[/color].[color= #202020;]AspectRatio[/color], [color= #cc66cc;]1[/color].0f, [color= #cc66cc;]300[/color].0f[color= #009900;])[/color];
  108. [color= #009900;]}[/color]
  109.  
  110. private [color= #993333;]void[/color] LoadHeightData[color= #009900;]([/color]Texture2D heightMap[color= #009900;])[/color]
  111. [color= #009900;]{[/color]
  112. terrainWidth [color= #339933;]=[/color] heightMap.[color= #202020;]Width[/color];
  113. terrainHeight [color= #339933;]=[/color] heightMap.[color= #202020;]Height[/color];
  114.  
  115. Color[color= #009900;][[/color][color= #009900;]][/color] heightMapColors [color= #339933;]=[/color] new Color[color= #009900;][[/color]terrainWidth [color= #339933;]*[/color] terrainHeight[color= #009900;]][/color];
  116. heightMap.[color= #202020;]GetData[/color][color= #009900;]([/color]heightMapColors[color= #009900;])[/color];
  117.  
  118. heightData [color= #339933;]=[/color] new [color= #993333;]float[/color][color= #009900;][[/color]terrainWidth, terrainHeight[color= #009900;]][/color];
  119. [color= #b1b100;]for[/color] [color= #009900;]([/color][color= #993333;]int[/color] x [color= #339933;]=[/color] [color= #cc66cc;]0[/color]; x < terrainWidth; x[color= #339933;]++[/color][color= #009900;])[/color]
  120. [color= #b1b100;]for[/color] [color= #009900;]([/color][color= #993333;]int[/color] y [color= #339933;]=[/color] [color= #cc66cc;]0[/color]; y < terrainHeight; y[color= #339933;]++[/color][color= #009900;])[/color]
  121. heightData[color= #009900;][[/color]x, y[color= #009900;]][/color] [color= #339933;]=[/color] heightMapColors[color= #009900;][[/color]x [color= #339933;]+[/color] y [color= #339933;]*[/color] terrainWidth[color= #009900;]][/color].[color= #202020;]R[/color] [color= #339933;]/[/color] [color= #cc66cc;]5[/color].0f;
  122. [color= #009900;]}[/color]
  123.  
  124. protected override [color= #993333;]void[/color] UnloadContent[color= #009900;]([/color][color= #009900;])[/color]
  125. [color= #009900;]{[/color]
  126. [color= #009900;]}[/color]
  127.  
  128. protected override [color= #993333;]void[/color] Update[color= #009900;]([/color]GameTime gameTime[color= #009900;])[/color]
  129. [color= #009900;]{[/color]
  130. [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]
  131. this.[color= #202020;]Exit[/color][color= #009900;]([/color][color= #009900;])[/color];
  132.  
  133.  
  134. KeyboardState keyState [color= #339933;]=[/color] Keyboard.[color= #202020;]GetState[/color][color= #009900;]([/color][color= #009900;])[/color];
  135. [color= #b1b100;]if[/color] [color= #009900;]([/color]keyState.[color= #202020;]IsKeyDown[/color][color= #009900;]([/color]Keys.[color= #202020;]Delete[/color][color= #009900;])[/color][color= #009900;])[/color]
  136. angle [color= #339933;]+=[/color] [color= #cc66cc;]0[/color].05f;
  137. [color= #b1b100;]if[/color] [color= #009900;]([/color]keyState.[color= #202020;]IsKeyDown[/color][color= #009900;]([/color]Keys.[color= #202020;]PageDown[/color][color= #009900;])[/color][color= #009900;])[/color]
  138. angle [color= #339933;]-=[/color] [color= #cc66cc;]0[/color].05f;
  139.  
  140. base.[color= #202020;]Update[/color][color= #009900;]([/color]gameTime[color= #009900;])[/color];
  141. [color= #009900;]}[/color]
  142.  
  143. protected override [color= #993333;]void[/color] Draw[color= #009900;]([/color]GameTime gameTime[color= #009900;])[/color]
  144. [color= #009900;]{[/color]
  145. device.[color= #202020;]Clear[/color][color= #009900;]([/color]Color.[color= #202020;]Black[/color][color= #009900;])[/color];
  146. device.[color= #202020;]RenderState[/color].[color= #202020;]CullMode[/color] [color= #339933;]=[/color] CullMode.[color= #202020;]None[/color];
  147. device.[color= #202020;]RenderState[/color].[color= #202020;]FillMode[/color] [color= #339933;]=[/color] FillMode.[color= #202020;]WireFrame[/color];
  148.  
  149. Matrix worldMatrix [color= #339933;]=[/color] Matrix.[color= #202020;]CreateTranslation[/color][color= #009900;]([/color][color= #339933;]-[/color]terrainWidth [color= #339933;]/[/color] [color= #cc66cc;]2[/color].0f, [color= #cc66cc;]0[/color], terrainHeig
    ht [color= #339933;]/[/color] [color= #cc66cc;]2[/color].0f[color= #009900;])[/color] [color= #339933;]*[/color] Matrix.[color= #202020;]CreateRotationY[/color][color= #009900;]([/color]angle[color= #009900;])[/color];
  150. effect.[color= #202020;]CurrentTechnique[/color] [color= #339933;]=[/color] effect.[color= #202020;]Techniques[/color][color= #009900;][[/color][color= #ff0000;]"Colored"[/color][color= #009900;]][/color];
  151. effect.[color= #202020;]Parameters[/color][color= #009900;][[/color][color= #ff0000;]"xView"[/color][color= #009900;]][/color].[color= #202020;]SetValue[/color][color= #009900;]([/color]viewMatrix[color= #009900;])[/color];
  152. effect.[color= #202020;]Parameters[/color][color= #009900;][[/color][color= #ff0000;]"xProjection"[/color][color= #009900;]][/color].[color= #202020;]SetValue[/color][color= #009900;]([/color]projectionMatrix[color= #009900;])[/color];
  153. effect.[color= #202020;]Parameters[/color][color= #009900;][[/color][color= #ff0000;]"xWorld"[/color][color= #009900;]][/color].[color= #202020;]SetValue[/color][color= #009900;]([/color]worldMatrix[color= #009900;])[/color];
  154.  
  155. effect.[color= #202020;]Begin[/color][color= #009900;]([/color][color= #009900;])[/color];
  156. foreach [color= #009900;]([/color]EffectPass pass in effect.[color= #202020;]CurrentTechnique[/color].[color= #202020;]Passes[/color][color= #009900;])[/color]
  157. [color= #009900;]{[/color]
  158. pass.[color= #202020;]Begin[/color][color= #009900;]([/color][color= #009900;])[/color];
  159.  
  160. device.[color= #202020;]VertexDeclaration[/color] [color= #339933;]=[/color] myVertexDeclaration;
  161. device.[color= #202020;]DrawUserIndexedPrimitives[/color][color= #009900;]([/color]PrimitiveType.[color= #202020;]TriangleList[/color], vertices, [color= #cc66cc;]0[/color], vert
    ices.[color= #202020;]Length[/color], indices, [color= #cc66cc;]0[/color], indices.[color= #202020;]Length[/color] [color= #339933;]/[/color] [color= #cc66cc;]3[/color][color= #009900;])[/color];
  162.  
  163. pass.[color= #202020;]End[/color][color= #009900;]([/color][color= #009900;])[/color];
  164. [color= #009900;]}[/color]
  165. effect.[color= #202020;]End[/color][color= #009900;]([/color][color= #009900;])[/color];
  166.  
  167. base.[color= #202020;]Draw[/color][color= #009900;]([/color]gameTime[color= #009900;])[/color];
  168. [color= #009900;]}[/color]
  169. [color= #009900;]}[/color]
  170. [color= #009900;]}[/color]
  171.  

1

شارك هذا الرد


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

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

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



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

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

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