Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Programming
Gamedevelopment

جعل مطلق النار النيون النيون في XNA: آثار الجسيمات

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Cross-Platform Vector Shooter: XNA.
Make a Neon Vector Shooter in XNA: Bloom and Black Holes
Make a Neon Vector Shooter in XNA: The Warping Grid

Arabic (العربية/عربي) translation by Wasmia Mia (you can also view the original English article)

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


نظرة عامة

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

تحذير: بصوت عال!

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

الفئة بارتيكليماناجير

سوف نبدأ بإنشاء فئة بارتيكليماناجير التي سيتم تخزين وتحديث ورسم جميع الجسيمات. ونحن سوف تجعل هذه الفئة العامة كافية فإنه يمكن استخدامها بسهولة في مشاريع أخرى. للحفاظ على بارتيكليماناجير العامة، لن يكون مسؤولاً عن كيف تبدو الجسيمات أو نقلها؛ سيكون علينا التعامل مع ذلك في أماكن أخرى.

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

سنجعل من الجسيمات. فئة عامة. سيسمح لنا هذا بتخزين معلومات الحالة المخصصة للجسيمات دون تشفيرها بجد في ParticleManager نفسه. سنقوم أيضا بإنشاء فئة الجسيمات المتداخلة.

فئة الجسيمات بجميع المعلومات اللازمة لعرض جسيمات وإدارة حياتها. معلمة عامة، "تي الدولة"، هناك إجراء أية بيانات إضافية قد نحتاج للجسيمات لدينا. ما هي البيانات مطلوب سوف تختلف تبعاً للجسيمات آثار المطلوب؛ ويمكن استخدامه لتخزين السرعة، والتسارع، وسرعة دوران، أو أي شيء آخر قد تحتاج.

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

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

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

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

بعد ذلك نضيف الأسلوب CreateParticle () ، الذي يخلق جسيمًا جديدًا باستخدام الجسيم التالي غير المستخدم في البركة ، أو أقدم جسيم إذا لم تكن هناك جسيمات غير مستخدمة.

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

ودمرت المقابض ParticleManager.Update() تحديث كل الجسيمات وإزالة الجسيمات من القائمة.

والشيء الأخير الذي يجب تنفيذه في ParticleManager هو رسم الجسيمات.

البنية بارتيكليستاتي

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

الآن نحن على استعداد لكتابة طريقة تحديث الجسيمات. إنها لفكرة جيدة أن نجعل هذه الطريقة سريعة لأنه قد يلزم استدعائها لعدد كبير من الجسيمات.

سنبدأ بسيط. أضف الطريقة التالية إلى ParticleState.

انفجارات العدو

ونحن سوف أعود وتحسين هذا الأسلوب في لحظة. أولاً، لنقم بإنشاء بعض الجسيمات آثار حتى يمكننا في الواقع اختبار التغييرات لدينا. في جاميروت، تعلن بارتيكليماناجير جديدة واستدعاء أساليب update () و Draw().

كذلك ، قم بالإعلان عن Texture2D جديد يسمى LineParticle لنسيج الجسيم في فصل Art ، وقم بتحميل المادة كما فعلنا مع النقوش المتحركة الأخرى.

الآن دعونا نجعل الأعداء تنفجر. تعديل أسلوب Enemy.WasShot () كما يلي.

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

يمكنك الآن تشغيل اللعبة ومشاهدة الأعداء تنفجر. ومع ذلك، لا تزال هناك بعض التحسينات التي يتعين بذلها لآثار الجسيمات.

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

تعديل أسلوب ParticleState.UpdateParticle() على النحو التالي (يتم تمييز التغييرات).

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

الآن يمكن أن نقوم بتعديل Enemy.WasShot() لاستخدام ألوان عشوائية. لجعل لون الانفجار أقل رتابة، سنقوم باختيار لونين الرئيسية القريبة لكل تفجير واقحم خطيا بينهما بمقدار عشوائي لكل الجسيمات.

يجب أن تبدو الانفجارات مثل الرسوم المتحركة أدناه.

Enemy Explosion

يمكنك اللعب مع جيل الألوان ليناسب تفضيلاتك. تقنية بديلة تعمل بشكل جيد هي اختيار عدد من أنماط الألوان للتفجيرات واختيار عشوائيًا بين مخططات الألوان التي اخترتها مسبقًا.

انفجارات رصاصة

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

إضافة عضو عشوائي ثابت إلى فئة رصاصة.

ثم قم بتعديل Bullet.Update() كما يلي.

قد تلاحظ أن إعطاء الجزيئات باتجاه عشوائي الإسراف، لأنه على الأقل نصف الجسيمات سيتوجه مباشرة خارج الشاشة (أكثر إذا كان الرمز النقطي ينفجر في زاوية). يمكننا القيام ببعض العمل الإضافي لضمان أن الجسيمات تعطى سرعات مقابل الجدار الذي تواجهه فقط. بدلاً من ذلك، رغم ذلك، سوف نتخذ جديلة من "الهندسة الحروب" وجعل جميع الجزيئات ترتد الجدران. وسوف ارتدت الجسيمات أي عنوان قبالة الشاشة مرة أخرى.

أضف الأسطر التالية إلى ParticleState.UpdateParticle () في أي مكان بين السطور الأول والأخير.

انفجار السفينة لاعب

ونحن سوف تجعل انفجار كبير حقاً عندما يتم قتل اللاعب. تعديل PlayerShip.Kill() كالتالي:

هذا يشبه تفجيرات العدو ، لكننا نستخدم المزيد من الجسيمات ونستخدم دائماً نفس نظام الألوان. يتم تعيين نوع الجسيمات أيضا إلى ParticleType.None.

في العرض، تبطئ الجسيمات من انفجارات العدو أسرع من الجسيمات من انفجار السفينة اللاعب. وهذا يجعل الانفجار اللاعب تستمر لفترة أطول قليلاً وتبدو أكثر قليلاً من الملحمة.


إعادة النظر في الثقوب السوداء

الآن أن لدينا الجسيمات آثار، دعونا النظر في الثقوب السوداء وجعلها تتفاعل مع الجسيمات.

تأثير على الجسيمات

يجب أن تؤثر الثقوب السوداء على الجسيمات بالإضافة إلى الكيانات الأخرى ، لذلك نحن بحاجة إلى تعديل ParticleState.UpdateParticle (). أضف السطور التالية.

هنا، هو n متجه الوحدة مشيراً إلى اتجاه ثقب أسود. قوة جاذبية نسخة معدلة من الدالة العكسية للدالة مربعة. التعديل الأول أن القاسم المشترك \ (نصف القطر ^ 2 + 10، 000\). يؤدي هذا قوة جذابة الاقتراب من قيمة الحد أقصى بدلاً من تميل نحو اللانهاية المسافة يصبح صغير جداً. عندما تكون المسافة أكبر من 100 بكسل ، تصبح \ (المسافة ^ 2 \) أكبر بكثير من 10000. لذلك ، إضافة 10،000 إلى \ (مسافة ^ 2 \) له تأثير صغير جداً ، وتقريب الدالة دالة مربعة معكوس عادية. ومع ذلك ، عندما تكون المسافة أصغر من 100 بكسل ، يكون للمسافة تأثير صغير على قيمة المقام ، وتكون المعادلة مساوية تقريبًا لما يلي:

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

نصيحة: لتدوير متجه ، V ، 90 درجة في اتجاه عقارب الساعة ، خذ (V.Y، -V.X). وبالمثل ، لتدوير 90 درجة عكس عقارب الساعة ، خذ (-V.Y ، V.X).

إنتاج جزيئات

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

أضف التعليمات البرمجية التالية إلى الأسلوب BlackHole.WasShot().

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

بالنسبة لرذاذ الجسيمات المداري ، نحتاج إلى إضافة متغير إلى فئة BlackHole لتتبع الاتجاه الذي نقوم حاليًا برش الجسيمات فيه.

الآن، أضف التالي إلى الأسلوب BlackHole.Update().

سيتسبب هذا في الثقوب السوداء لرش طفرات جسيمات الأرجوانية التي ستشكل حلقة متوهجة باردة أن مدارات حول الثقب الأسود، مثل ذلك:



عادم سفينة حريق

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

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

ShapeBlaster Exhaust Fire

جعل النار توهج الألوان الزاهية أكثر مما لو كان من لوم وحدها، سيكون لدينا السفينة تنبعث جزيئات إضافية التي تبدو مثل هذا:

Glow Particle

وسوف ملون هذه الجسيمات والمخلوطة مع الجسيمات العادية. فيما يلي التعليمة البرمجية للتأثير الكامل.

لا يوجد شيء متستر يحدث في هذا الرمز. نحن نستخدم وظيفة جيبية لإنتاج تأثير الدوران في المجاري الجانبية من خلال تغيير السرعة الجانبية مع مرور الوقت. لكل تيار ، نصنع جسيمتين متداخلتين لكل إطار: جسيم واحد أبيض شبه شفاف وجسيم توهج ملون خلفه. استدعاء MakeExhaustFire () في نهاية PlayerShip.Update () ، مباشرة قبل تعيين سرعة السفينة إلى الصفر.


استنتاج

مع كل هذه التأثيرات الجسيمية ، بدأت Blaster Blaster تبدو رائعة. في الجزء الأخير من هذه السلسلة ، سنضيف تأثيرًا واحدًا أكثر روعة: شبكة الخلفية المتشابكة.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.