Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Xcode
Code

مقدمة إلى جيم بلاي كيت: الجزء 2

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called An Introduction to GameplayKit.
An Introduction to GameplayKit: Part 1
An Introduction to GameplayKit: Part 3

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

وهذا هو الجزء الثاني ل "مقدمة" لجيم بلاي كيت. إذا لم تكن قد ذهبت بعد الى الجزء الأول،  أنصحك بقراءة ذلك البرنامج التعليمي اولا قبل المتابعة مع هذا 

المقدمة

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

  • العوامل والأهداف والسلوكيات
  • اﻻستطﻻعية

باستخدام العوامل والأهداف والسلوكيات، نحن ذاهبون لبناء بعض الذكاء الاصطناعي الأساسي(AI)  في اللعبة التي بدأناها في الجزء الأول من هذه السلسلة. وسيمكن الذكاء الاصطناعي  نقاطتا العدو الحمراء والصفراء لاستهداف والتحرك نحو نقطة لاعبنا الزرقاء. كذلك نحن ذاهبون لتنفيذ اﻻستطﻻعية لنوسع على هذا الذكاء الاصطناعي  للتنقل حول العقبات.

 بالنسبةلهذا البرنامج التعليمي، يمكنك استخدام نسختك من المشروع الكامل من خلال الجزء الأول من هذه السلسلة أو قم بتنزيل نسخة جديدة من التعليمات البرمجية من المصدر GitHub.

1-العوامل والأهداف والسلوكيات

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

 فئة GKAgentهي فئة فرعية من GKComponent. وهذا يعني أن اللعبة بحاجة إلى استخدام بنية و كينونة وبناء قائمين على اساس المكونات كما بينت لك في البرنامج التعليمي الأول من هذه السلسلة.

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

  • تحرك نحو اداة
  • الابتعاد عن اداة
  • التجمع قريبا من بعضها البعض مع الادوات أخرى
  • التجول في موضع معين

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

افتح المشروع الخاص بك منXcode وانتقل إلى PlayerNode.swift. نحن بحاجة أولاً للتأكد من ان فئة  PlayerNode  تتوافق مع البروتوكول GKAgentDelegate .

بعد ذلك قم بإضافة كتلة التعليمات البرمجية التالية إلى الفئة PlayerNode .

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

يتم استدعاء الأسلوب agentWillUpdate(_:) قبل أن تنظر جيم بلاي كيت  من خلال السلوك وأهداف الاداة للتحديد أين يجب أن تتحرك. وبالمثل، يتم استدعاء الأسلوب agentDidUpdate(_:) مباشرة بعد اكمال  جيم بلاي كيت هذه العملية.

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

بعد ذلك، افتح ContactNode.swift وقم باستبدال محتويات الملف بالتنفيذ التالي:

من خلال تنفيذ البروتوكول GKAgentDelegate   في فئة ContactNode ، نسمح لجميع النقاط الأخرى في مباراتنا لنكون حتى الآن مع GameplayKit ، وكذلك نقطة لاعبنا.

الآن حان الوقت لإعداد الأهداف والسلوكيات. لصنع هذا العمل، نحن بحاجة إلى العناية بثلاثة أشياء:

  • قم بإضافة اداة عقدة اللاعب لكيانها وقم بتعيين مندوبها.
  • تكوين الادوات والسلوكيات، والأهداف لكل نقاط العدو لدينا.
  • تحديث كافة هذه العوامل في الوقت الصحيح.

أولاً، افتح GameScene.swift، وفي نهاية الأسلوب didMoveToView(_:)، قم بإضافة السطرين التاليين من التعليمات البرمجية:

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

بعد ذلك، استبدل تنفيذ الأسلوب initialSpawn بالتنفيذ التالي:

يقع الرمز الأكثر أهمية الذي قمنا بإضافته في جملة ifالتي تلي جملة switch. دعونا نذهب عبر هذه التعليمات البرمجية سطراً بسطر:

  • أولاً نقم بإضافة الاداة للكيان كمكون وتكوين مندوبها.
  • ثم بعد ذلك،نعيين موضع الاداة ونقم بإضافة الاداة إلى صفيف مخزن، ادوات. سنقوم بإضافة هذه الخاصية إلى فئة GameScene  في لحظة.
  • ونحن بعد ذلك ننشئ كائن GKBehavior مع GKGoal  واحد لاستهداف اداة اللاعب الحالي. يتم استخدام متغير الوزن في هذا المهيئ لتحديد الأهداف التي ينبغي أن تأخذ حق الأولوية على الآخرين. على سبيل المثال، تخيل أن لديك هدف لتحديد اداة معينة وهدفا للابتعاد عن اداة آخرى، ولكنك تريد الهدف المستهدف لتأخذ الأفضلية. وفي هذه الحالة، يمكن أن تعطي الهدف المستهدف وزن 1 والهدف الذي يتحرك بعيداً  وزن 0.5. تم تعيين هذا السلوك إلى اداة عقدة العدو.
  • وأخيراً، نحن نكون الكتلة ,maxSpeed ، وخصائص maxAcceleration للاداة وهذه تؤثر على مدى سرعة التحرك والتحويل للكائنات. لا تتردد في اللعب حولها مع هذه القيم وشاهد كيف تؤثر على حركة نقاط العدو.

بعد ذلك،قم  بإضافة اثنين من الخصائص التالية إلى فئة GameScene:

سيتم استخدام الادوات للحفاظ على مرجع إلى ادوات العدو في مكان الحادث. سيتم استخدام الخاصية lastUpdateTime لحساب الوقت الذي انقضى منذ آخر تحديث لموقع الحادث.

وأخيراً، استبدل تنفيذ الأسلوب update(_:) من فئة GameScene مع التنفيذ التالي:

في أسلوب update(_:)، نقوم بحساب الوقت الذي انقضى منذ مشهد آخر تحديث، ثم نقم بتحديث الادوات بتلك القيمة.

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

Targeting enemies

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

2-اﻻستطﻻعية

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

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

  • مساحة مستمرة تتضمن العقبات: يسمح نموذج الرسم البياني لمسارات ناعمة حول العقبات من موقع واحد إلى آخر. لهذا النموذج، يتم استخدام فئة GKObstacleGraph للرسم البياني، وفئة  GKPolygonObstacle للعقبات، وفئة GKGraphNode2D للعقد (مواقع).
  • شبكة 2D بسيطة: في هذه الحالة، مواقع صالحة يمكن فقط ان تكون تلك التي مع إحداثيات عدد صحيح. نموذج الرسم البياني هذا مفيد عندما المشهد الخاص بك يحتوي على تخطيط شبكة متميزة وانت لا تحتاج مسارات ناعمة. عند استخدام هذا النموذج، يمكن فقط الانتقال للكائنات أفقياً أو عمودياً في اتجاه واحد في وقت واحد. لهذا النموذج، يتم استخدام فئة GKGridGraph للرسم البياني والفئه GKGridGraphNode  للعقد.
  • مجموعة من المواقع والاتصالات بينهما: هذا هو نموذج الرسم البياني الأكثر شمولية وينصح للحالات حيث تنتقل الكائنات فيها بين فراغات محددة، ولكن مواقعها المحددة داخل هذا الفضاء ليس ضروري لساحة اللعبة. لهذا النموذج،فئة الGKGraph يتم استخدامها للرسم البياني والفئه GKGraphNode للعقد.

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

يحتوي الصفيف spawnPoints  على بعض مواقع الصغار المختلفة لأغراض هذا البرنامج التعليمي. وهذا لأنه حاليا جيم بلاي كيت فقط يمكنه حساب المسارات بين الكائنات التي نسبيا قريبة من بعضها البعض.

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

بعد ذلك، أضف السطرين التاليين من التعليمات البرمجية في بداية الأسلوب didMoveToView(_:):

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

وأخيراً، قم باستبدال أسلوب initialSpawn  مع التنفيذ التالي:

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

معظم أسلوب initialSpawn لم يتغير. قد أضفت بعض التعليقات لاظهر لك اين يقع جزء التعليمات البرمجية اﻻستطﻻعية في أول جملة if . دعونا نذهب من خلال هذه التعليمات خطوة بخطوة:

  • نقوم بإنشاء مثيل آخر من GKGraphNode2D، و اوصل هذا للرسم البياني.
  • نقوم بإنشاء سلسلة من العقد التي تشكل مسار بواسطة استدعاء الأسلوب findPathFromNode(_:toNode:) في الرسم البياني لدينا.
  •  إذا تم إنشاء سلسلة من عقد المسار بنجاح، نقوم بإنشاء مسار منهم. متغيرنصف القطر يعمل مماثلا للمتغير bufferRadius من قبل ويعرف كم  يمكن للكائن الابتعاد عن المسار الذي تم إنشاؤه.
  • ونحن ننشئ كائنين جكجوال، واحد لاتباع المسار وآخر للبقاء في المسار. يسمح المتغير maxPredictionTime  للهدف لحساب أفضل ما يمكنه امام الوقت ما إذا كان أي شيء سيقاطع الكائن من متابعة/بقاء على تلك الطريق الخاصة.
  • وأخيراً، نقم بإنشاء سلوك جديد مع هذين الهدفين، ونقم بتعيين هذا إلى الاداة.

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

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

Pathfinding enemies

هام!

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

بالنسبة لإنتاج لعبة فعلي، سيكون من الأفضل تنفيذ هذه الوظيفة عن طريق الجمع بين الهدف المستهدف للاعب في وقت سابق من هذا البرنامج التعليمي مع هدف تفادي العقبات التي تم إنشاؤه باستخدام الأسلوب المريح init(toAvoidObstacles:maxPredictionTime:)، ويمكنك قراءة المزيد حوله في  "مرجع الفئة GKGoal".

الاستنتاج

في هذا البرنامج التعليمي، أنا أظهرت لك كيف يمكنك الاستفادة من الادوات، والأهداف، والسلوكيات في الألعاب التي لها هيكل مكون كياني. في حين أنشأنا ثلاثة أهداف فقط في هذا البرنامج التعليمي، هناك العديد من المتاحة لك، التي يمكنك قراءة المزيد حولها في "مرجع الفئة GKGoal".

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

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

كما هو الحال دائماً، يرجى التأكد من ترك التعليقات والملاحظات أدناه.

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.