إنشاء ألعاب ألغاز على Puzzle Script

Puzzle Script هو محرك لعبة أضيق الحدود لإنشاء الألغاز لـ HTML5 ، ولديه مصادر مفتوحة. يمكن العثور على أمثلة للألعاب الجاهزة هنا .

الجزء 1. نقوم بإنشاء اللعبة الأولى على Puzzle Script.


Puzzle Script هو برنامج مجاني عبر الإنترنت يستخدم لإنشاء ألعاب ألغاز. تشتهر بخلق الألغاز مثل بلدي العقدة . في هذا الجزء ، سنقوم بإنشاء لعبة ، بعد دراسة الوظائف الأساسية لـ Puzzle Script ، وفي اليوم التالي سنبدأ البرمجة.


انتقل إلى موقع المحرك. انقر فوق Make a Game لفتح محرر Puzzle Script .

تنزيل الأمثلة


للبدء ، دعنا نلقي نظرة على بعض الأمثلة. في الجزء العلوي من الشاشة ، افتح قائمة "مثال التحميل" وحدد المثال الأول المسمى "أساسي". الآن انقر على "تشغيل".



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


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

جعل اللعبة الأولى


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


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

إنشاء مستوى جديد


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


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

  • 1 صندوق
  • هدف واحد
  • لاعب واحد

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


قم بإضافته إلى قائمة المستويات.


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


يجب عرض رسالة حول التجميع الناجح وشبكة من الشخصيات المضحكة أسفل محرر المستوى ، كما هو موضح أدناه.


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

. = الخلفية
# = الجدار
P = لاعب
* = صندوق
@ = صندوق وهدف
O = الهدف

كل ما يوجد على الجانب الأيسر من الشاشة هو رمز اللعبة ، مقسم إلى أجزاء مختلفة ، مثل OBJECTS أو LEGEND. انتقل إلى المستويات. هنا نرى المستويات المستخدمة في المثال.


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


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

حفظ وتحميل اللعبة


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



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


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

تصدير اللعبة


يمكنك أيضًا تصدير اللعبة كملف html5 ، والذي يمكنك بعد ذلك تحميله على بوابات اللعبة ، مثل itch.io أو Kongregate أو Newgrounds . ما عليك سوى النقر فوق "تصدير" وتحميل ملف html الذي تم تنزيله إلى بوابة اللعبة.

يمكن العثور على مشروع عينة لدينا هنا .

الجزء 2. الشروع في لغز البرنامج النصي


في هذا الجزء ، سوف نتعلم كيفية بدء البرمجة في Puzzle Script .


كود


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

[ > Player | Crate ] -> [ > Player | > Crate ]

هذا الخط يعني أنه إذا كان اللاعب بالقرب من الصندوق وتحرك في اتجاهه ، فإن اللعبة تحرك اللاعب وتدفع الصندوق. لشرح كيفية عمل ذلك ، عليك أن تفهم أن رمز Puzzle Script يتبع هذه البنية:

[ ] -> [ ]

هذا يعني ما يلي:

[ ] -> [ ]

يفحص Puzzle Script الشروط على يمين السهم ، على سبيل المثال ، ما إذا كان كائن اللاعب بجوار كائن المربع. إذا كان الشرط صحيحًا ، فإننا نفعل شيئًا ، على سبيل المثال ، ندفع الصندوق.

أمثلة للظروف


فيما يلي مثال على حالة:

[ object1 | object2 ]

يتحقق هذا الحدث إذا كان الكائن 1 بجوار الكائن 2. يمكنك التحقق من وجود كائنين بجوار بعضهما البعض بوضع | | إدخال | بالضغط على shift + \. يتم دائمًا تضمين الشروط في [ ] .

[ crate | crate ]

يتحقق الرمز أعلاه لمعرفة ما إذا كان مربعا بجوار بعضهما البعض.

[ crate | crate | crate ]

يتحقق هذا الشرط إذا كانت ثلاثة مربعات قريبة.

[ crate target ]

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

نحافظ على المساواة


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

[ player | crate ] -> [ player | ]

هذا السطر من التعليمات البرمجية يدمر المربع إذا كان اللاعب بجانبه. لا يمكنك الكتابة:

[ player | crate ] -> [ player ]

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

[ | ] -> [ | ]

[ player | crate ] -> [ player | ]

وهذا يعني ، حتى المساحات الفارغة في مسألة الرمز. ومع ذلك ، فإن الإدخال التالي صالح:

[ player target ] -> [ player ]

نظرًا لأننا في الحالة نتحدث فقط عن مساحة شبكة واحدة ، فإن الحدث يصف نفس مساحة الشبكة.

كيفية تحريك الصناديق


دعنا نعود إلى السطر الأصلي من التعليمات البرمجية.

[ > Player | Crate ] -> [ > Player | > Crate ]

بعبارة أخرى:

[ | ] -> [ | ]

السهم> يؤكد على الحركة.

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

( )
[ > Player | Crate ] -> [ > Player | > Crate ]

الآن ، تحت رمز دفع الصندوق ، اكتب ما يلي:

( )
[ < Player | Crate ] -> [ < Player | < Crate ]

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

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

( )
([ > Player | Crate ] -> [ > Player | > Crate ])
( )
[ < Player | Crate ] -> [ < Player | < Crate ]

إذا نجح ذلك ، فقم بالتعليق على رمز سحب المربعات وجرب ما يلي:

[ < Player | Crate ] -> [ < Player | > Crate ]

إذا ابتعد اللاعب عن الصندوق ، فسيتحرك اللاعب والصندوق في اتجاهين متعاكسين. تحدد الأسهم في أي اتجاه يتحرك الكائن أو يتحرك. الآن علّق على هذا وجرّب ما يلي:

[ > Player | Crate ] -> [ Player | > Crate ]

يتحرك الصندوق ، لكن اللاعب يبقى في مكانه. جرب ^ و v (الحرف v) لترى كيف ستتحرك الكائنات.

أخطاء


دعنا نكتب عمدا قاعدة خاطئة ونرى ما سيحدث. أدخل السطر التالي:

[ < Player | Crate ] -> [ < Player ]

حاول تشغيل البرنامج. سترى رسالة مثل هذه:

السطر 81: في كل قاعدة ، يجب أن يكون لكل نمط يطابقه على اليسار نمطًا مناظرًا على اليمين بنفس الطول (عدد الخلايا).

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

المزيد من التجارب


جرب التجربة واكتب القواعد بنفسك. فيما يلي بعض الأمثلة.

[ > Player | … | Crate ] -> [ > Player | … | > Crate ]

في المثال أعلاه ، سيدفع اللاعب المربع إذا كان في أي مكان على نفس خط المستوى ، وينتقل اللاعب إلى المربع.

[ > Player | Crate ] -> [ Crate | Player ]

يستبدل هذا الرمز المشغل والمربع.

[ > Player | Crate ] -> [ Player | Target ]

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

الجزء 3. إنشاء كائنات


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


معلومات عامة


افتح مشروع عينة . تتكون عملية إنشاء كائن من الخطوات التالية:

  • قم بإنشائه في قائمة الكائنات
  • إضافة عنصر إلى وسيلة إيضاح
  • إضافة التصادمات إلى طبقة

بعد القيام بكل هذه الخطوات ، يمكنك البدء في استخدام الكائن.

إنشاء كائن


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

Background
LIGHTGREEN GREEN
11111
01111
11101
11111
10111

تشير الأرقام إلى وحدات البكسل في الصورة. كل رقم يتوافق مع لونه. يحتوي اللون الأول على الرقم 0 ، والثاني - 1 ، وهكذا يصل إلى 9. يمكن أن يكون هناك ما يصل إلى عشرة ألوان. في حالتنا ، كل 1 لون البكسل باللون الأخضر الفاتح (الضوء الأخضر) ، و 0 - باللون الأخضر (الأخضر). تبدو النتيجة كالتالي:


يتم إنشاء الكائنات دائمًا على النحو التالي:

  • العنوان
  • الألوان
  • صورة

الاسم موجود دائمًا في السطر العلوي. توجد الألوان دائمًا في السطر الثاني ، وتتخذ الصورة الأسطر الخمسة التالية ، 5 أحرف لكل سطر ، والتي تشكل شبكة 5 × 5. أو يمكنك القيام بما يلي:

Background
LIGHTGREEN

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

أعط أسماء للكائنات


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

الألوان


يجب أن تقوم بتعريف الألوان التي تريد استخدامها للكائن وفصلها بمسافة. يحتوي Puzzle Script على ألوان محددة مسبقًا:

  • أسود
  • أبيض
  • رمادي
  • دارك جراي
  • lightgrey
  • رمادي
  • رمادي غامق
  • رمادي فاتح
  • أحمر
  • مظلمة
  • lightred
  • بني
  • بني غامق
  • فاتح اللون
  • برتقالي
  • أصفر
  • أخضر
  • أخضر غامق
  • فاتح
  • أزرق
  • أزرق فاتح
  • أزرق داكن
  • أرجواني
  • وردي
  • شفاف

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


#51A2BD #ff0000 #ffffff

يسبق رمز اللون دائمًا حرف #.

إضافة كائن إلى وسيلة الإيضاح


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

. = Background
# = Wall
P = Player
* = Crate
@ = Crate and Target
O = Target

يمثل كل رمز كائنًا في مستوى. أي عندما نرى مثل هذه الشبكة من الشخصيات:

#p.*.##
#.**.##
#..#..#
##....#
##...o#
#######

يصف في الواقع مستوانا:


يجب تعيين كل حرف تم إنشاؤه بحرف أو رمز أو رقم يعين هذا الكائن على المستوى. مثل هذا:

P = player

تجميع الكائنات في وسيلة الإيضاح


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

O = OrangeCrate
B = BlueCrate
G = GreenCrate

سيسمح لنا ذلك باستخدام المربعات في مستوى المحرر. ولكن لإنشاء التعليمات البرمجية ، يمكنك تجميعها معًا في Legend ، على النحو التالي:

Crates = OrangeCrate or GreenCrate or BlueCrate

وكلها معًا ستبدو كما يلي:

=======
LEGEND
=======
O = OrangeCrate
B = BlueCrate
G = GreenCrate

Crates = OrangeCrate or GreenCrate or BlueCrate

لماذا تفعل ذلك؟ لأنه بدلاً من ذلك ، بدلاً من إنشاء مثل هذه القواعد:

[ > Player | OrangeCrate ] -> [ > Player | > OrangeCrate ]
[ > Player | BlueCrate] -> [ > Player | > BlueCrate ]
[ > Player | GreenCrate] -> [ > Player | > GreenCrate]

يمكنك ببساطة كتابة:

[ > Player | Crates ] -> [ > Player | > Crates ]

وسوف يعمل هذا الرمز لمجموعة كاملة من الكائنات.

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

طبقات التصادم


بشكل افتراضي ، يكون قسم طبقة التصادم كما يلي:

Background
Target
Player, Wall, Crate

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

[ player wall ] -> [ player wall ]

يمكنك جعل الكائنات في طبقات مختلفة تتفاعل مع بعضها البعض. على سبيل المثال ، يمكنك كتابة:

[ > Player | Target ] -> [ > Player | > Target ]

تجربة


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

الجزء 4. شروط النصر


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

شروط النصر


قم بتنزيل نموذج المشروع وانتقل إلى قسم رمز شروط Win. يجب أن ترى ما يلي:

All Target on Crate

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

All crate on target

ثم يجب أن يكون كل صندوق على الهدف.

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

All Target on Crate
All Target2 on Crate2

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

أنواع مختلفة من شروط النصر


هناك عدة أنواع مختلفة من شروط النصر.

No Object

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

Some Object

تربح عندما يكون هناك كائن واحد على الأقل من النوع المحدد على المستوى.

Some Object1 on Object2

يجب أن يكون أحد كائنات Object1 على الأقل على Object2.

No Object1 On Object2

هذا الشرط هو عكس All Target on Crate . في هذه الحالة ، نحتاج إلى أن تكون كل هذه الكائنات منفصلة عن بعضها البعض ، وليس فوق بعضها البعض. يمكنك أيضًا الجمع بين شروط النصر المختلفة مع بعضها البعض.

تجربة


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

يمكن عرض مشروعي المثال الكامل هنا .

الجزء 5. القيادة المتأخرة


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

لماذا نحتاجها


افتح مشروع مثال ، ثم الصق الكود التالي في اللعبة وقم بتشغيله:

[ player | target ] -> [ player | ]

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

late [ player | target ] -> [ player | ]

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

ترتيب الأحداث


إليك كيفية تنفيذ الرمز في Puzzle Script مع كل خطوة.

  1. يكتشف Puzzle Script أن اللاعب يريد التحرك
  2. كلما أمكن ، تتم قراءة القواعد وتنفيذها من أعلى إلى أسفل.
  3. يتحرك اللاعب إن أمكن
  4. تنطبق القواعد المتأخرة

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

[ player | spikeTrap ] -> [ | spikeTrap ]

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

طرق استخدام متأخر في الممارسة


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

[ player spikeTrap ] -> [ spikeTrap ]

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

late [ player spikeTrap ] -> [ spikeTrap ]

لإعادة المستوى بالكامل عند وفاة الشخصية ، يمكنك القيام بما يلي:

late [ player spikeTrap ] -> restart

وسيستأنف المستوى عندما يقع اللاعب في الفخ مع رهانات.

يمكنك مشاهدة مثال المشروع النهائي هنا .

الجزء 6. العمل مع المؤثرات الصوتية.


لقد صنعنا لعبة رائعة على Puzzle Script ، ولكننا نحتاج الآن إلى إضافة أصوات إليها. كيف تفعل ذلك؟ الآن سأقول لك!

توليد الصوت


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


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

كيفية استخدام الأصوات


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


يمكن استخدام الأصوات بعدة طرق. أسهل طريقة لإنشاء مؤثر صوتي جديد (sfx). يجب أن تكون مرقمة. ننشئ sfx جديدًا ، ونعينه برقم من 0 إلى 10 عند إدخال معرف صوت رقمي. في قائمة الأصوات ، قم بإنشاء sfx جديد يسمى sfx0 وقم بتعيينه الصوت الناتج:

sfx0 36301705

لاستخدام الصوت ، تحتاج إلى إدراجه في القواعد بعد الحدث. دعنا نرفق sfx0 الذي تم إنشاؤه حديثًا بحدث تدمير المربع (الحدث موجود بالفعل في مثال المشروع):

(The player destroys a crate)
[ > Player | CrateVanish ] -> [ Player | ] sfx0

يمكن أيضًا الإعلان عن الأصوات للتشغيل في أحداث معينة ، على سبيل المثال:

Crate MOVE 36772507

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

CratePull MOVE 12735307

يجب الإعلان عن أصوات الأحداث في قسم الأصوات فقط: لا يلزم ذكرها في القواعد.

قائمة طرق استنساخ الصوت


فيما يلي قائمة بأصوات الأحداث المختلفة التي يمكنك استخدامها ، مأخوذة من وثائق Puzzle Script.

Object Action 541566 - يتم تشغيله عند تعريض كائن لإجراء ما أثناء الحركة.

إنشاء كائن 641667 - يتم تشغيله عند إنشاء كائن محدد.

EndGame 5416789 - يلعب عند انتهاء اللعبة.

EndLevel 6417822 - يلعب بعد الانتهاء من المستوى.

Object CantMove 781673 - يتم تشغيله عندما حاول كائن دون جدوى التحرك في أي اتجاه.

Player CantMove Down Left 464674 - يتم تشغيله عندما يحاول كائن تحريكه لأسفل أو لليسار دون جدوى.

CloseMessage 344456 - يتم التشغيل عندما يغلق المشغل صندوق الرسائل.

Object Destroy 187975 - يتم تشغيله عند تدمير كائن.

تحريك الكائن 264567 - يتم تشغيله عندما يتحرك كائن بنجاح في أي اتجاه.

تحريك الكائن لأسفل لليسار 765432 - يتم التشغيل عند تحريك الكائن لأسفل أو لليسار بنجاح.

Object Move Horizontal 345367 - يتم التشغيل عند تحريك الكائن أفقيًا بنجاح. يمكنك أيضًا استخدام Vertical.

إعادة التشغيل 7865435 - يتم التشغيل عندما يضغط اللاعب على زر إعادة التشغيل R.

SFX0 765743 - يمكن أن يكون أي شيء من SFX0 إلى SFX10. هذه أحداث صوتية خاصة يمكن إجراؤها من القواعد.

ShowMessage 478483 - يتم التشغيل عند عرض رسالة.

StartGame 234626 - يلعب في بداية لعبة جديدة.

Startlevel 765436 - يلعب في بداية كل مستوى.

TitleScreen 876543 - يتم التشغيل بعد تحميل شاشة التوقف.

تراجع 436234 - يلعب عندما يضغط اللاعب على مفتاح الإلغاء (Z).

يمكنك تحديد اتجاهات الحركة وعدم الحركة بحيث يتم إنتاج أصوات مختلفة عند التحرك في اتجاهات مختلفة.

مثال نهائي للمشروع هنا .

الجزء 7. تشغيل الموسيقى


لقد تعلمنا كيفية إنشاء ألعاب على Puzzle Script ، ولكن أليس من الرائع إضافة الموسيقى إليها؟ هذا ممكن ، والآن سأخبرك كيف تفعل ذلك.

ملاحظة: يبدو أن هذه الوظيفة في Puzzle Script معطلة في الوقت الحالي ، لذا انتقل إلى الجزء التالي.

ماذا تفعل


افتح المشروع فارغًا . تعمل الموسيقى في Puzzle Script كما يلي: يمكنك إدراج رابط لفيديو واحد من Youtube في اللعبة. سيقوم PuzzleScript بتشغيل جميع أصوات هذا الفيديو تلقائيًا. افتح يوتيوب وحدد أي فيديو ، أو استخدم ما يلي:

youtube.com/watch؟v= CKAc3nYEatw

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


تحت الصفحة الرئيسية للمؤلف في بداية المشروع ، أضف علامة youtube ، وبعدها معرف فيديو فريد ، على سبيل المثال ، مثل:

youtube CKAc3nYEatw

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

مثال المشروع


يمكن العثور على مثال لمشروع Puzzle Script هنا .

الجزء 8. كيفية استخدام الأمر إجراء


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

إمكانيات الإدخال في PuzzleScript محدودة للغاية ، بشكل أساسي مفاتيح الأسهم ، Z للإلغاء ، R لإعادة التشغيل ، ولا يمكننا تغييرها.لكن المحرك يعطينا مفتاح إضافي لل أعمال - الضغط على شريط المسافة ، أو اضغط على X . يتبع

العمل مع فريق العمل التنسيق الموضح أعلاه. استخدمنا تنسيق شفرة PuzzleScript الأساسي:

[ ] -> [ ]

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

[ Action ] -> [ ]

فيما يلي مثال على استخدام الأمر Action:

[ Action Player ] -> [ Crate ]

أولاً ، العمل دائمًا هو الكلمة الأولى للشرط.

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

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

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

يقول الشرط [ إذا ضغطنا على مفتاح الإجراء وكان هناك كائن لاعب على المستوى ] -> ثم [ استبدل كائن المشغل بمربع]

الآن ، فلنجرّب الرمز التالي في مثال المشروع:

[ Action Player | Crate ] -> [ Player | > Crate ]



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

استبدل الرمز بالإصدار المحدث:

[ Action Player | Crate ] -> [ Action Player | > Crate ]


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

الجزء 9. التحقق من شروط متعددة


دعونا نتعلم للتحقق من عدة شروط ، على سبيل المثال ، وجود قنبلة وكتلة قابلة للتدمير.


افتح مشروع عينة . الآن أضف الكود التالي إليها:

late [Player Switch][DoorClosed] -> [Player Switch][DoorOpen]

يتبع الرمز هذا التنسيق:

[ 1 ] [ 2 ] -> [ 1 ] [ 2 ]

إذا كان الشرط 1 صحيحًا والشرط 2 صحيحًا ، يتم تنفيذ الخطوة 1 والخطوة 2. وفي حالتنا ، في الحالة 1 ، يتم التحقق مما إذا كان "المشغل" في وضع التشغيل أم لا. إذا كانت الإجابة بنعم ، يتم التحقق من الشرط 2 ، أي التواجد على مستوى باب مغلق؟ إذا كان الشرط صحيحًا ، فإن كائن DoorClosed يتحول إلى كائن DoorOpen ، لفتح الباب.


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

late [Player | Switch][DoorOpen] -> [Player | Switch][DoorClosed]

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

late [Crate Switch][DoorClosed] -> [Crate Switch][DoorOpen]

الآن سيبقى الباب مفتوحًا عندما يكون الدرج قيد التشغيل.

يمكنك مشاهدة مثال المشروع النهائي هنا .

الجزء 10. إنشاء نقاط التوقف


ربما لديك فكرة جيدة للعب Puzzle Script ، لكنها تحتاج إلى نقاط تحكم (نقاط تفتيش) بحيث يتعافى اللاعب عليها في حالة الوفاة. كيف تفعل ذلك؟ بسيطة جدا ، والآن سأشرح كيف.


إنشاء نقاط توقف


افتح مشروع عينة . الآن نحن بحاجة إلى برمجة نقطة توقف. يكفي سطر واحد فقط من التعليمات البرمجية لهذا:

late [ Player FlagRed ] -> CHECKPOINT

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

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

نقاط تحكم متعددة


إذا كان هناك العديد من نقاط التحكم ، فإن اللعبة تستخدم آخر نقطة تم تنشيطها بواسطة اللاعب.

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

FlagWhite
White Orange
.1…
.00..
.000.
.1…
.1…

أعد كتابة هذا السطر الآن في وسيلة الإيضاح:

Flag = FlagRed or FlagWhite

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

[ > Player | Flag ] -> [ > Player | ]

سيؤثر هذا الرمز على كل من العلم الأحمر والأبيض.

تغيير كائن العلم


فيما يلي كيفية تغيير FlagRed إلى FlagWhite:

late [ Player FlagRed ] -> [ Player FlagWhite ]

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

قم بتغيير العلم الثاني


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

late [ Player FlagRed ][ FlagWhite] -> [ Player FlagRed ][FlagBlack]

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

late [ Player FlagRed ] -> CHECKPOINT
late [ Player FlagRed ][ FlagWhite] -> [ Player FlagRed ][FlagBlack]
late [ Player FlagRed ] -> [ Player FlagWhite ]

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

[ > Player | Crate ] -> [ > Player | > Crate ]
[ > Crate | Flag ] -> [ Crate | Flag ]
late [ Player FlagRed ] -> CHECKPOINT
late [ Player FlagRed ] -> [ Player FlagWhite ]
late [ Player FlagRed ][ FlagWhite] -> [ Player FlagRed ][FlagBlack]

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

الجزء 11. الرسوم المتحركة


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

افتح مشروع عينة . سنصنع قنبلة وسلسلة من طلقات الانفجار ، ثم نحركها.

كائن متحرك


بالنسبة إلى الرسوم المتحركة ثنائية الأبعاد ، تحتاج إلى عدة رسومات لكائن يتحرك من حالة إلى أخرى ، على سبيل المثال ، نقش متحرك من ماريو قيد التشغيل. يحتوي على 4 إطارات للرسوم المتحركة.


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

قنبلة


إنشاء مثل هذا القنبلة.

Bomb
black yellow grey
..1..
..1..
.000.
00020
.000.

تذكر أن تضيفها إلى الطبقات والأسطورة.

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

Explosion1
black yellow grey red
..1..
..1..
.000.
00320
.000.

Explosion2
black yellow grey red
..1..
..1..
.333.
03330
.333.

Explosion3
black yellow grey red
..1..
.333.
33333
33333
.333.

Explosion4
black yellow grey red
.333.
33333
33333
33333
.333.

Explosion5
black yellow grey red
.333.
33333
33.33
33333
.333.

Explosion6
black yellow grey red
.333.
3...3
3...3
3...3
.333.

Explosion7
black yellow grey red
.....
.....
.....
.....
.....

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

[Explosion7] -> []
[Explosion6] -> [Explosion7]
[Explosion5] -> [Explosion6]
[Explosion4] -> [Explosion5]
[Explosion3] -> [Explosion4]
[Explosion2] -> [Explosion3]
[Explosion1] -> [Explosion2]
[Bomb] -> [Explosion1]

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

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

باستخدام مرة أخرى


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

[Explosion7] -> []
[Explosion6] -> [Explosion7] again
[Explosion5] -> [Explosion6] again
[Explosion4] -> [Explosion5] again
[Explosion3] -> [Explosion4] again
[Explosion2] -> [Explosion3] again
[Explosion1] -> [Explosion2] again
[Bomb] -> [Explosion1] again

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

again_interval 0.1

هذا جزء مما يسميه PuzzleScript مقدمة . هذا هو المكان الذي ، قبل بقية الكود ، يمكنك وضع قواعد إضافية تحدد سلوك اللعبة. الآن يجب أن تلعب الرسوم المتحركة بشكل أسرع. حاول تغيير الرقم بعد مرة أخرى_ interval وتحقق من أنه قد تغير.

يمكنك مشاهدة مثال المشروع النهائي هنا .

الجزء 12. الجاذبية


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

مثال المشروع


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

مرحلة الخريف 1


فيما يلي الجزء الأول من الكود الذي سنستخدمه:

down [ Player | no Object ] -> [ | Player ]
down [ Crate | no Object no Player ] -> [ | Crate ]

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

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

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

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

late down [ Player | no Object ] -> [ | Player ]
late down [ Crate | no Object no Player ] -> [ | Crate ]

ولكن كيف تجعلها تسقط تدريجياً ، إطاراً بإطار؟

سقوط المرحلة 2


الآن نستخدم الكلمة الرئيسية العشوائية . نعيد كتابة الرمز على النحو التالي:

random down [ Player | no Object ] -> [ | Player ]
random down [ Crate | no Object no Player ] -> [ | Crate ]

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

مرحلة الخريف 3


الآن سنضيف الكلمة الرئيسية مرة أخرى :

random down [ Player | no Object ] -> [ | Player ] again
random down [ Crate | no Object no Player ] -> [ | Crate ] again

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

المرحلة الأخيرة


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

[moving Player] -> [moving Player] again
random down [ Player | no Object ] -> [ | Player ] again
random down [ Crate | no Object no Player ] -> [ | Crate ] again

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

يمكنك مشاهدة مثال المشروع النهائي هنا .

الجزء 13. التحقق من اتجاه السفر


إشارة الاتجاه


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

مع ذلك ، يمكننا الإشارة إلى أن الأحداث لا تحدث إلا في اتجاهات معينة.

مفتوحة PuzzleScript، وخلق لعبة تقوم على مثال الأساسية واستبدال قوانين مع التعليمات البرمجية التالية:

[ Left Player ] -> [ Crate ]

شغّل اللعبة وشاهد ما سيحدث.

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

لقد اعتدنا بالفعل على التنسيق الذي شرحت فيه رمز PuzzleScript:

[ ] -> [ ]

إذا كان الحدث صحيحًا ، فسيحدث الحدث.

ولكن الآن ، عندما نحتاج إلى التحقق من الاتجاهات ، فإنه سيتبع القواعد الجديدة:

[ Movement Direction Object Affected ] -> [ New State of Object ]

هذا هو رمزنا السابق:

[ Left Player ] -> [ Crate ]

يتحقق مما إذا كان اللاعب يتحرك إلى اليسار ( اليسار ). إذا كان الأمر كذلك ، فإننا نستبدل المشغل بكائن الصندوق.

أنواع الوجهات


يمكنك الاختيار من بين أنواع الوجهات التالية:

  • لأعلى
  • للأسفل
  • غادر
  • حق
  • أفقي (للتحقق من وجود حركة أفقية)
  • عمودي (للتحقق من وجود حركة رأسية)


الجزء 14. إنشاء التحركات المخصصة


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

[ ] -> [ ]

إذا كان الشرط صحيحًا ، فسيحدث حدث. لإنشاء حركة مخصصة ، عليك القيام بما يلي:

[ Condition ] -> [ Movement Direction Object To Move ]

إليك ما سيبدو عليه المثال:

[ Player | Crate ] -> [ Player | Left Crate ]

قم بتنزيل PuzzleScript ، وافتح المثال الأساسي ، والصق هذا الرمز وشاهد ما سيحدث. انتقل إلى المربع الذي لا توجد حوله جدران.

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

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

تذكر هذا الرمز من الجزء السابق؟

[ ] -> [ ]

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

[ ] -> [ ]

التحركات المخصصة المسموح بها


يمكن إنشاء حركات مخصصة بأي من هذه الكلمات:

  • لأعلى
  • للأسفل
  • غادر
  • حق

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

الجزء 15. فحص الخلايا بجانب الكائنات


في بعض الأحيان يكون من الضروري التحقق مما هو بجانب الكائن. هذا سهل جدا. دعونا نلقي نظرة أخرى على تنسيق Code Puzzle:

[ ] -> [ ]

هذا هو

[ ] -> [ ]

للتحقق من جانب الكائن ، نحتاج إلى إضافة عنصر واحد. التنسيق كما يلي:

[ object1 | object2 ] -> [ object1 | object2 ]

قبل الشرط ، نتحقق من أي جانب من الكائن نريد إجراء الفحص.

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

[ ]

[ | | ]

الخلية الأولى هي الكائن الذي نتحقق من جوانبه. الخلية الثانية هي الكائن الذي نتحقق من وجوده. جرب الأمثلة التالية:

Left [ Player | Crate ] -> [ Player | ]

يحذف الرمز الموضح أعلاه المربعات إذا كانت في المربع الموجود على يسار المشغل.

Left [ Crate | Crate ] -> [ Player | Crate ]

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

Left [ Crate | Crate ] -> [ Crate | Player ]

في الكود أعلاه يوجد نفس الاختيار ، ولكن المربع الموجود على اليسار يصبح كائن اللاعب.

Left [ Crate | Crate | Crate ] -> [ Crate | Player | Crate ]

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

Left [ Crate | Crate | Crate ] -> [ Crate | Crate | Player ]

إذا كانت 3 مربعات بجوار بعضها البعض أفقيًا ، فسيصبح المربع الأيسر لاعبًا.

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

الكلمات الرئيسية


  • يصل - يتحقق من كائن
  • أسفل - الشيكات تحت الكائن
  • يسار - يتحقق على يسار الكائن
  • حق - يتحقق على يمين الكائن
  • أفقي - يتحقق من يسار الكائن ويمينه
  • عمودي - يتحقق فوق الكائن وتحته

الصورة

الصورة

الصورة

الصورة

Source: https://habr.com/ru/post/ar428906/


All Articles