Advertisement
  1. Game Development
  2. Programming

كيف يمكن تحقيق إنجازات غير قابلة للشفرة في لعبتك (أسلوب بسيط)

Scroll to top
Read Time: 9 min

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

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

ملاحظة: على الرغم من كتابة هذا البرنامج التعليمي باستخدام AS3 و Flash ، يجب أن تكون قادرًا على استخدام نفس الأساليب والمفاهيم في أي بيئة تطوير ألعاب تقريبًا.

يمكنك تنزيل أو شفر الشفرة النهائية من ريبو GitHub: https://github.com/Dovyski/Achieve


رمز الإنجازات: خدعة أم علاج؟

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

يتم إلغاء أحد الإنجازات إذا كانت تلك العدادات تطابق اختبارات محددة:

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


فكرة أفضل

يعتمد تقاربي أيضًا على العدادات ، ولكن يتم التحكم فيها بواسطة قواعد بسيطة:


الانجازات على أساس الخصائص. المستطيلات الرمادية هي خصائص / إنجازات نشطة.

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

هذه هي الفكرة:

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

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

المقاطع التالية تقدم تنفيذ لتلك الفكرة.


وصف الخصائص والإنجازات

خطوة التنفيذ الأولى هي تمثيل الممتلكات والإنجازات. يمكن أن تكون الخاصية فئة ما يلي:

الخاصية لها اسم (mName) ، وقيمة (mValue ، والتي هي العداد) ، وقيمة التنشيط (mActivationValue) وقاعدة التنشيط (mActivation).

قاعدة التنشيط شيء مثل 'نشط إذا كان أكبر من' ويتحكم في ما إذا كانت الخاصية نشطة (أكثر على ذلك لاحقًا). ويقال أن الخاصية تكون نشطة عند مقارنة قيمتها بقيمة التنشيط والنتيجة تفي بقاعدة التنشيط.

يمكن وصف الإنجاز على النحو التالي:

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


إدارة العقارات والإنجازات

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

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

من أجل معالجة إضافة الخصائص والإنجازات ، نقوم بإنشاء الطرق defineProperty () و defineAchievement ():

كلتا الطريقتين ببساطة إضافة إدخال إلى الخاصية أو قاموس الإنجاز.


تحديث خصائص

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

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

من المفيد أيضًا أن يكون لديك طريقة لإضافة قيمة إلى مجموعة من الخصائص ، وهو شيء مثل زيادة / تقليل الدُفعة:


التحقق من الإنجازات

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

لتنفيذ هذا التكرار ، نحتاج أولاً إلى طريقة للتحقق مما إذا كان الموقع نشطًا أم لا:

الآن دعنا ننفذ أسلوب checkAchievements () في فئة الإنجاز:

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

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


يحتوي هيكل العناصر على قيم مضافة من التعديل والنص.

حتى الآن لا توجد أية قيود على العقارات ، مما يعني أن أي قيمة يتم تمريرها من خلال setValue () ستقوم بتحديث العقار. تخيل خاصية باسم killWithASingleBomb ، والتي تخزن عدد الأعداء لاعب قتل باستخدام قنبلة واحدة.

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

سيؤدي هذا التغيير إلى فقدان اللاعب لهذا الإنجاز. لإصلاح ذلك ، يمكننا استخدام قاعدة تنشيط الخاصية كقيد. يعني أنه سيتم تحديث خاصية 'إذا كان أكبر من 5' فقط إذا كانت القيمة الجديدة أكبر من القيمة الحالية:


إعادة تعيين وعلامات خصائص

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

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

نتيجة لذلك ، من الممكن التحقق من الإنجازات وإعادة تعيين الخصائص بناءً على العلامات:

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


استخدام الإيضاح

في ما يلي مقتطف شفرة يوضح كيفية استخدام تنفيذ هذا التنفيذ:


استنتاج

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

يمكنك تنزيل أو شفر الشفرة من GitHub repo: https://github.com/Dovyski/Achieve

آمل أن يساعدك هذا النهج في تنفيذ الإنجازات بطريقة أبسط وأفضل. شكرا لقرائتك! لا تنسَ الاطلاع على آخر الأخبار من خلال متابعتنا على Twitter أو Facebook أو Google+.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Game Development tutorials. Never miss out on learning about the next big thing.
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.