XNA: إن الفيزياء الأساسية من JigLibX
XNA نفسها، لا تقدم دروسا لمساعدتنا في حساب في الفيزياء. على الرغم من أنه من الممكن الكشف عن الاصطدام نفسه، ولكن هذه هي الطريقة التي تتصرف الأجسام عندما تم الكشف عن ذلك، يعتمد فقط على رمز كتبه لنا. ما لم نستخدم الجاهزة المكتبات للموظفين. أخذت خلفية الأكثر شعبية XNA'ową مكتبة مفتوحة المصدر - JigLibX .
ماذا يمكنك تحقيقه؟
في اشارة الى السينما للمؤلفين، واثنين من الأمثلة على ذلك:
... وعلى سبيل المثال التي أنشأتها JigLibX من الكتاب نفسه:
المزيد من أشرطة الفيديو على موقع المشروع .
إنشاء مشروع
أول شيء يجب عليك فعله هو تحميل من قسم تحميل وJigLibX'a مصدر آخر. بعد التفريغ، ونحن إنشاء مشروع جديد (في مشروعي حالة XNA 3.1)، انقر على مستكشف الحلول على الجذر الرئيسي لمشروعنا (محلول NazwaNaszegoProjektu)، انقر بالزر الايمن واختر إضافة> القائمة المشروع

واضاف مشروع موجود إلى القائمة
ثم حدد المجلد حيث قمت تفكيك تحميلها مسبقا على محرك فيزياء: JigLibX> JigLibX.csproj.

واضاف مشروع موجود إلى القائمة
إذا اخترت عند إنشاء المشروع، ومشروع للنسخة XNA 3.1، يجب عليك القيام به الآن الترقية JigLibX مشروع إلى الإصدار 3.1. ونحن نفعل ذلك بالنقر بزر الماوس الأيمن على مشروع الحل الجذري JigLibX ترقية>. ونحن نفعل ذلك ليكون في وقت لاحق قادرا على إضافة المشروع الرئيسي JigLibX'a مراجع المشروع. خلاف ذلك، لم يكن ذلك ممكنا، لأن في الوقت الحاضر فهو مخصص للالإصدار 3.0. التغييرات في الإصدار 3.1 ليست كبيرة بما فيه الكفاية، ومع ذلك، لتصحيح تماما ويتم تشغيل المكتبة تحت هذا الإصدار من XNA.
ثم، انقر على الحق في جذور مشروعنا الرئيسي (في حالتي يطلق عليه FizykaZJigLibX)> إضافة مرجع> المشاريع> JigLibX. في شجرة لمشروعنا، وينبغي أن المراجع المجلد تظهر JigLibX. الآن لدينا الوصول إلى أن مساحة الاسم.
إضافة الفيزياء للنظام
أولا، سيكون من الضروري لإضافة مساحة الاسم المناسب في Game1.cs الخاص.
باستخدام JigLibX.Physics؛ باستخدام JigLibX.Geometry؛ باستخدام JigLibX.Collision؛
يمكننا استخدام ذلك الطبقات مكتوبة من قبل المبدعين من JigLibX'a. بالنسبة للمبتدئين، في منشئ فئة دينا، ونحن خلق كائنين.
Game1 العامة () { رسومات = جديد GraphicsDeviceManager (هذا)؛ Content.RootDirectory = "المحتوى"؛ PhysicsSystem PhysicsSystem العالم = جديدة ()؛ CollisionSystemSAP world.CollisionSystem = جديدة ()؛ }
العالم الكائن، الذي PhysicSystem سبيل المثال، والشروع في جميع المتغيرات اللازمة وحدة تحكم واستشعار الأحداث التي تجري داخل التطبيق الخاص بنا. المتصلة الفيزياء أحداث. في السطر التالي، إلى CollisionSystem العقارات، ونحن تعيين كائن CollisionSystemSAP خلق، وهو أمر ضروري للكشف عن أي اصطدام. هذه الطبقة يستخدم خوارزمية "الاجتياح وتقليم" للكشف عن الاصطدام، والتي في هذا المثال، سوف تكون كافية، ولكن إذا كان يتطلع إلى مجلد في المشروع JigLibX التصادم، ونحن نرى أننا قادرون على الاستفادة من الدروس الجاهزة الأخرى، وذلك باستخدام خوارزميات مختلفة، تستند على سبيل المثال على الشبكة (شبكة). إذا قمت بحذف هذه الخطوة التي لم نتمكن من الرد على حوادث الاصطدام، والتسهيلات سيمر ببساطة من دون أي رد فعل.
يتعين عليك أن تفعل شيئا واحدا، وهي لتحديث بانتظام منشأتنا الذي يخزن منطق الفيزياء. للقيام بذلك، فقط الأسلوب Update، إضافة التعليمات البرمجية التالية:
timeStep = تعويم (تعويم) gameTime.ElapsedGameTime.Ticks / TimeSpan.TicksPerSecond؛ PhysicsSystem.CurrentPhysicsSystem.Integrate (timeStep)؛
لأن PhysicsSystem.CurrentPhysicsSystem هو عنصر من عناصر ثابتة، وهي متوفرة من أي مكان في مشروعنا، مما يزيد مما لا شك فيه راحة من هذا الحل.
خلق طبقة الفاعل
فئة الفاعل، وسوف يخدم في الواقع لإنشاء الكائن، والتي سوف تعيين المعلمات تحديد الكائن في التطبيق الخاص بنا، والتي تكون ضرورية لأية حسابات في اصطدام مع البيئة.
دعونا إنشاء BoxActor.cs فئة بذلك عن طريق الضغط على جذور مشروعنا> الفئة> إضافة ..

إنشاء فئة BoxActor.cs
وضع التعليمات البرمجية التالية داخل BoxActor.cs الملف:
استخدام نظام؛ باستخدام Microsoft.Xna.Framework؛ باستخدام Microsoft.Xna.Framework.Graphics؛ باستخدام JigLibX.Math؛ باستخدام JigLibX.Physics؛ باستخدام JigLibX.Geometry؛ باستخدام JigLibX.Collision؛ مساحة FizykaZJigLibX { الفئة العامة BoxActor: DrawableGameComponent { موقف Vector3 الخاص؛ مقياس Vector3 الخاص؛ _body هيئة خاصة؛ الهيئة العامة الهيئة { الحصول على { _body العودة؛ } } خاصة CollisionSkin _skin؛ جمهور CollisionSkin الجلد { الحصول على { _skin العودة؛ } } BoxActor العامة (لعبة لعبة، Vector3 موقف، Vector3 الحجم): قاعدة (لعبة) { this.position = الموقف؛ this.scale = الحجم؛ } } }
فئة BoxActor يرث من فئة DrawableGameComponent لأن لا بد من وضع الممثل على الشاشة، حتى يمكننا أن نرى ما سيحدث. أول المنطلقين يحمل معلومات حول نقطة مركزية داخل منطقة الجزاء، ومقياس -. أبعادها الجسم يجب أن يفهم على أنه متغير الذي يقوم بتخزين المعلومات عن الحركة والدوران من وجوه لدينا الجلد هو المسؤول عن الكشف عن التصادم.
خلق جسم وCollisionSkin
وسوف تكون الخطوة التالية مضيفا في نهاية منشئ فئة BoxActor، التعليمات البرمجية التالية:
_body = هيئة جديدة ()؛ _skin = جديد CollisionSkin (_body)؛ _body.CollisionSkin = _skin؛
ل_body متغير، تعيين مثيل من الجسم، والذي سيتم تخزين المعلومات الأساسية عن الدولة التي يقع فيها الكائن. _skin هل لديك معلومات عن "قذيفة" من منشأة لدينا، والتي سوف تنشأ على أساس _body السابقة. أخيرا، لا يزال يتم تعيين هذا CollisionSkin عقارات لل_body.
الآن، أن تقرر ما شكل، لن يكون الفاعل لدينا. يعتمد على الكيفية التي سوف تتصرف على المسرح. ابحث عن فئة البدائيون وجدت في البدائيون> JigLibX.
في حالتنا، ونحن نريد وجوه لدينا تتصرف مثل مربع، لذلك نحن نستخدم هذا المربع فئة، وذلك بإضافة التعليمات البرمجية التالية في نهاية الطبقة BoxActor المنشئ.
مربع مربع مربع جديد = (Vector3.Zero، Matrix.Identity، الحجم)؛ _skin.AddPrimitive (مربع، MaterialProperties الجديدة (0.8f، 0.8f، 0.7f))؛
في ما ورد أعلاه، أنشأنا كائن جديد من صندوق الطبقة، التي المعلمات في منشئ الوقوف ل: إن موقف المركز من صندوق لدينا، والتوجه صندوق (هوية مصفوفة يعني عدم وجود تناوب، الخ)، والنطاق الذي سيقام عند بناء BoxActor الكائن.
السطر الثاني، تصادمه مع سطح يضيف إلى منشأتنا بحيث يمكن أن تتفاعل مع الكائنات الأخرى. المعلمة الأولى هو نوع كائن التي نتعامل معها، المعلمة الثانية تحدد سلوك المادة (الاحتكاك ومرونة).
تحديد كتلة الجسم
لتحديد كتلة الجسم، والتي بالإضافة إلى مركز الثقل، وسوف تختلف تبعا لاتجاه القوى التي ستؤثر على هذا الكائن، وخلق الكتاب JigLibX، الطريقة التالية التي تم إضافتها إلى BoxActor فئة.
SetMass خاصة Vector3 (الكتلة تعويم) { PrimitiveProperties primitiveProperties = PrimitiveProperties الجديدة ( PrimitiveProperties.MassDistributionEnum.Solid، PrimitiveProperties.MassTypeEnum.Mass، الشامل)؛ تطفو غير المرغوب فيه؛ Vector3 كوم؛ مصفوفة تكنولوجيا المعلومات؛ مصفوفة itCoM؛ Skin.GetMassProperties (primitiveProperties، من غير المرغوب فيه، خارج كوم، من أنه، خارج itCoM)؛ Body.BodyInertia = itCoM؛ Body.Mass = غير المرغوب فيه؛ عودة كوم؛ }
في نهاية المنشئ من نفس الفئة، علينا أن نحدد الشامل على النحو التالي:
كوم = SetMass Vector3 (1.0f)؛ وذلك عندما يتعلق الأمر باتخاذ أكثر من كتلة الجسم لدينا
. بالطبع، لا شيء يمنع ذلك، وأثناء التطبيق، ويمكن تغيير كتلة الجسم.
وضع Box'aw المكان المناسب
في هذه الخطوة، وضعنا صندوق لدينا حول هذا البند سوف تحصل في منشئ خلال خلق الفاعل لدينا. هذا أمر ضروري لتناسب الجسم من منشأتنا، فضلا عن سطح الاصطدام وفقا لنفس الكائن إلى أن التأثير كان ملائم وواقعي.
في نهاية المنشئ BoxActor، إضافة التعليمات البرمجية التالية:
_body.MoveTo (الموقف، Matrix.Identity)؛ _skin.ApplyLocalTransform (جديد تحويل (كوم، Matrix.Identity))؛ _body.EnableBody ()؛
السطر الأول يتحرك "الهيئة" من الفاعل لدينا على عنصر معين. المعلمة الثانية من أسلوب MoveTo، يدل على التوجه للكائن.
السطر الثاني يحدد منطقة تصادم على التوالي في مركز الثقل للممتلكات.
السطر الأخير، تمكن من محاكاة ل_body وأيضا فاعل. هذا الخط هو ضروري لأنه تم تعطيل محاكاة افتراضيا.
خلق العالم.
وقد تم تعيين كافة الإعدادات المتعلقة الأطر، لذلك يمكنك الذهاب لخلق العالم. في نهاية منشئ في الملف الرئيسي للgame1.cs مشروعنا، إضافة التعليمات البرمجية التالية:
fallingBox = جديد BoxActor (هذا، Vector3 جديد (5، 20، 5)، جديد Vector3 (2، 2، 2))؛ immovableBox = جديد BoxActor (هذا، جديد Vector3 (0، -5، 0)، جديد Vector3 (10، 10، 10))؛ immovableBox.Body.Immovable = صحيح؛ Components.Add (fallingBox)؛ Components.Add (immovableBox)؛
عنصر لا يزال التي يمكن ان تضاف على كل الأساليب في فئة Game1:
BoxActor fallingBox؛ BoxActor immovableBox؛
أول سطرين يشكلون العناصر الفاعلة لدينا. المعلمات في البناء، والوقوف ل: الأول - المثال الذي خلق الفاعل، في هذه الحالة، لدينا التطبيق الرئيسي Game1 فئة، والثاني - وهو موقف، المعلمة الثالث هو حجم هذا البند.
السطر الثالث يعني أن الكائن الثاني هو بلا حراك، وكما رأينا في المعلمات التي تم تمريرها إلى المنشئ، وسيكون أعلى من ذلك بكثير (5X) من الكائن الأول.
والسطر الرابع والخامس التي أوجدتها لنا إضافة كائنات إلى مجموعة من المكونات التي سيتم استخلاصها تلقائيا من قبل فئة لعبة، والذي يرث بعد التطبيق الخاص بك.
رسم
ننتقل الآن إلى المرحلة الأخيرة، وهذا هو، ونبذ النتيجة على الشاشة هو في الواقع عبارة جميلة، ترسمه من مكان الحادث. ولكن أولا، يجب أن نضيف مربع نموذج، والتي نستخدمها في مشروعنا. نموذج عينة من الألعاب المبتكرة ، يمكنك تحميل هنا .
بعد تفريغ الملف ونسخ اثنين من الملفات الموجودة (مع نموذج والملمس) يجب أن تكون في مستكشف الحلول، انقر بالزر الايمن على المجلد المحتوى (في مشروعنا) وحدد إضافة> عنصر موجود ... وحدد الملف نموذج. FBX و كرر الخطوة، واختيار ملف من الملمس.
وBoxActor فئة، وخلق طريقة جديدة من شأنها أن تحميل نموذج لدينا:

محمية LoadContent باطل تجاوز () { نموذج = Game.Content.Load ("boxModel")؛ }
وإضافة على كل الطرق في هذه الفئة، والإعلان عن نموذج متغير:
خاصة نموذج نموذج؛ ثم يضيف نفس الفئة، الأسلوب التالي:
GetWorldMatrix خاصة مصفوفة () {. عودة Matrix.CreateScale (جدول) * _skin.GetPrimitiveLocal (0) Transform.Orientation * _body.Orientation * Matrix.CreateTranslation (_body.Position)؛} تعود مجموعة من عالمنا المعقد، والذي نحصل من خلال ضرب المصفوفات في تسلسل: حجم سطح الاصطدام، وحقا الزاوية التي يقع فيها، و "الجسد" للكائن (الزاوية)، والموقف من "الهيئة" للكائن.
وسوف نحتاج إلى مزيد من الإسقاط والمصفوفات الرأي، والتي سوف تضيف إلى فئة التطبيق الرئيسي (في game1.cs ملف):
خاصة مصفوفة _view؛ جمهور اعرض مصفوفة { الحصول على { _view العودة؛ } } خاصة مصفوفة _projection؛ جمهور مصفوفة الإسقاط { الحصول على { عودة _projection؛ } }
في منشئ فئة Game1، دعونا وضعت في نهاية مصفوفة الإسقاط عن طريق إضافة السطر التالي:
Matrix.CreatePerspectiveFieldOfView _projection = ( MathHelper.ToRadians (45.0f)، (تعويم) graphics.PreferredBackBufferWidth / (تعويم) graphics.PreferredBackBufferHeight، 0.1F، 1000.0f )؛
لن أستطيع أن أصف المعلمات من مصفوفة من الإسقاط، لانني افترض انه في هذه المرحلة أنها واضحة تماما، ولكن إذا لم يكن كذلك، وأنا أدعوكم إلى هذه المادة على msdn'ie .
غادر وضعناها المصفوفة الرأي، وسوف نقوم بذلك في تحديث الأسلوب، Game1.cs ملف عن طريق إضافة السطر التالي من التعليمات البرمجية:
Matrix.CreateLookAt _view = ( جديد Vector3 (0، 10، 20)، fallingBox.Body.Position، Vector3.Up )؛
هذا الخط سوف يتسبب في وسط الشاشة، وسيكون هناك وجوه لدينا السقوط. خلال فصل الخريف، سنرى كيف، وتأتي الى الاصطدام مع كائن التي تم يجمد.
وأخيرا، فإنه لا يزال بالنسبة لنا لإضافة وسيلة لرسم BoxActor، وهو ما يسمى تلقائيا لهذا الكائن إلى رسم.
جمهور تجاوز رسم الفراغ (gameTime GameTime) { BasicWorldGame لعبة = (BasicWorldGame) لعبة؛ مصفوفة [] التحويلات = مصفوفة جديدة [model.Bones.Count]؛ model.CopyAbsoluteBoneTransformsTo (يحول)؛ WorldMatrix = GetWorldMatrix مصفوفة ()؛ foreach (ModelMesh شبكة في model.Meshes) { foreach (BasicEffect تأثير في mesh.Effects) { effect.EnableDefaultLighting ()؛ effect.PreferPerPixelLighting = صحيح؛ effect.World = التحويلات [mesh.ParentBone.Index] * worldMatrix؛ effect.View = game.View؛ effect.Projection = game.Projection؛ } mesh.Draw ()؛ } }
مع السطر الأول، سيكون لديك الوصول إلى رأي والمصفوفات الإسقاط، وخلق اشارة الى الموضوع الرئيسي لطلبنا. ما تبقى من رمز، هو نموذجي لتقديم الكائنات مع فئة BasicEffect. الشيء الوحيد المهم هو استخدام مصفوفة العالم، مصفوفة والذي يحسب في الوقت الحقيقي، وفعلا JigLibX محسوب بالنسبة لنا.
وتستند هذه المادة على وثائق تم العثور عليها هنا ينبغي، ولكن هناك دلائل على أن النص المستنسخ هنا عفا عليه الزمن، وكتبه لي نسخة تعمل على نحو أفضل. ولعل هذا يرجع إلى عدم اكتمال التوافق مع XNA 3.1، ولكن من ما كنت قد بحثت في الطرق، قد انخفض واحد منهم 3-2 المعلمات. JigLibX الإصدار 0.3.1 (كما في 11 سبتمبر، 2009).
الانتهاء من المشروع لتحميل (XNA 3.1) (2.1 MB)
جمعت التجريبي (XNA 3.1) (0.3 MB)
مقالات ذات صلة
3 تعليق / ثانية
إدخال مثيرة جدا للاهتمام، لا يلعب مع الرسم البياني، ولكن قرأته بكل سرور. شكرا!
بعد العرض الخاص بي، والآلاف من الناس في العالم الحصول على قروض شخصية من مختلف الدائنين. وبالتالي، هناك إمكانيات جيدة للعثور على قرض تجاري في كل بلد.




















































حسنا سأقول لك ليست هنا في التعليق، وظيفة على مستوى عال كالمعتاد.