كيفية وضع رمز سري للأبواب والأقفال.
Arabic (العربية/عربي) translation by osamagaradh (you can also view the original English article)
في الالعاب المصنوعة من غرف متصلة مثل أسطورة زيلدا،الأكثر حداثةً -ملزمة إسحاق-، أو أي نوع من روجويلايك أو حتى مثل مترويدفانيا، تلعب الأبواب جزءا أساسيا في الملاحة وتقدم محرز للاعب.
الابواب تسمح للاعب بالسفر من غرفة واحدة أو من مستوى إلى آخر، حتى يحتل مكاناً هاما في الملاحة والاتصال لمختلف الغرف واحدة إلى آخرى، وفي تعريف الخريطة بانها عالم مفتوح أو أرضية زنزانة. قد تعمل أيضا كحواجز مؤقتة التي على اللاعب فك قفلها عن طريق ميكانيكية محددة (مثل الحصول على مفتاح، أو تنشيط مفتاح تبديل).
في هذا البرنامج التعليمي، سوف اظهر عدة ميكانيكيات اقفال ، واقتراح السبل لتزويدها في الألعاب الخاصة بك. هذه ليست بأي شكل من الأشكال قصدت لأن تكون التزويدات الوحيدة او الافضل؛ هي أمثلة عملية.
العروض التفاعلية في هذا البرنامج التعليمي قدمت مع أداةHTML5 2 لصنع اللعب كونستركت5 وينبغي أن تكون متوافقة مع اصدارها المجاني. (ملفات كاب اكس متوفرة في تحميل المصدر). ومع ذلك، هذا البرنامج التعليمي يجب أن يساعدك على تعلم كيفية تنفيذ منطق الأبواب والأقفال في أي محرك تهوى. حالما تحصل على الفكرة وراء هذا المنطق، كل شيء سيعتمد على المعرفة ل اداة /لغة الترميز الخاصة بك والطريقة التي تريد أن تكيفها مع اللعبة التي تصنعها حاليا.
دعنا نغوص في الموضوع !
الميكانيكية الأساسية
الباب هو أساسا كتلة من الديكور التي لا يمكن مرورها، تمنع اللاعب من المرور خلالها حتى يكون غير مقفل. يمكن أن يكون الباب في حالات مختلفة: مؤمن أو غير مؤمن، مغلق او مفتوح.
يجب أن يكون هناك تمثيل واضح لما سبق؛ يجب أن يكون اللاعب قادراً على أن يميز أن الباب هو باب فعلا وما إذا كان في حالة مؤمن أو غير مؤمن.
في العروض التالية، الابواب ممثلة من خلال اثنتين من الرسومات:


لقد استعملت أيضا ألوان مختلفة لتمثيل مختلف المواد التي قد تكون الأبواب صنعت منها – ولكن، لنكون صادقين، الجانب المتعلق بالرسوم البيانية متروك لك ولللعبة الخاصة بك،الجزء الأكثر أهمية هو أن الباب ينبغي أن يكون محدد بوضوح بأنه باب، وينبغي أن يكون واضحا ما إذا كان سيعرقل تقدم اللاعب أو سيفتحه وسيقود بقية العالم أو المستوى.
عندما تكون مغلقة أو مقفلة، ينبغي أن يكون الباب كتلة من حالة الصلابة. عند فتحه، يجب تعطيل الحالة الصلبة، مما يسمح للاعبين المرور من خلاله. تأكد من أنه اي محرك اصطدام مستخدم، فإنه يسمح لك بتعديل هذه الحالة على الطاير بسهولة جداً.
من وجهة نظر برمجية، يجب أن يحتوي الباب او يكون مرتبط إلى المتغير المنطقي is_locked
. استناداً إلى قيمة هذا المتغير، يمكنك تحديد ما هي الحالة للعرض، وعما إذا كان ينبغي الكتلة أن تكون صلبة أم لا.
لفتح الباب، اللاعب يجب أن يحتوي المتغير المنطقي has_key
نفسه عند اللاعب عندما التقطت المفتاح: true
إذا كان لديهم، false
إذا لم يكن
في هذه الميكانيكية الأساسية، المفتاح يشكل جزء من قائمة مخزون اللاعب، ومفتاح واحد يفتح جميع الأبواب. استخدام المفتاح على باب لا يستهلكه؛ يبقى المفتاح في المخزون للاعب.
لتصور ذلك، نحن ببساطة ستطيع ان نعرض صورة للمفتاح في -ال هود- للسماح للاعب بان يعرف أنه "يملك" مفتاح الذي يمكن أن يفتح الأبواب بمجرد ان اللاعب التقطه (عن طريق تحرك اللاعب نحو المفتاح في الغرفة).
انظر في المثال الأساسي التالي:
انقر فوق العرض التوضيحي للتركيزعليه، ثم سيطر على اللاعب باستخدام مفاتيح الأسهم في لوحة المفاتيح وتنفيذ الاجراءات بالمسطرة. (في هذا المثال، الاجراء هو "فتح باب").
الجدران هي كتل صلبة لا تسمح للاعب المرور من خلالها عند الاصطدام بها. الأبواب المغلقة أيضا صلبة.
لفتح باب، يجب على اللاعب ان يكون داخل 64 بكسل من الباب ويمتلك مفتاح (أي، المنطق المتغيرhas_key
التي تحدد ما إذا كان اللاعب لديه المفتاح في قائمة الادوات الخاصة به يجب أن يكون true
).
مع هذه الظروف، عندما يضغط اللاعب على مسطرة لوحة المفاتيح، يتم تغيير حالة الباب المناسبة. يتم تعيين المنطق المتغير له locked
إلى false
، وحالته "الصلبة" تتعطل.
في حالة ، هذا قد يبدو شيئا مثل:
1 |
Door.Locked = True |
2 |
Door.AnimationFrame = 0 |
3 |
//The animation frame that displays the door as locked
|
4 |
Door.Solid = Enabled |
5 |
//The solid state of the door is enabled
|
6 |
|
7 |
Door.Locked = False |
8 |
Door.AnimationFrame = 1 |
9 |
//The animation frame that displays the door as opened
|
10 |
Door.Solid = Disabled |
11 |
//The solid state of the door is disabled
|
12 |
|
13 |
Keyboard Key "Space" is pressed |
14 |
and Distance(Character,Door) <= 64px |
15 |
and Door.Locked = True |
16 |
and Character.Has_Key = True |
17 |
//The player has a key
|
18 |
Door.Locked = False |
19 |
|
20 |
Keyboard Key "Space" is pressed |
21 |
and Distance(Character,Door) <= 64px |
22 |
and Door.Locked = True |
23 |
and Character.Has_Key = False |
24 |
//The player does not have a key
|
25 |
Text.text = "You don't have a key for that door" |
تذكير: هذه التعليمات البرمجية لا تمثل لغة معينة؛ يجب أن تكون قادرعلى تنفيذها في أي لغة تريد.
يمكنك أيضا ملاحظة أننا نقوم بعملية تدقيق عندما اللاعب لا يكون يملك المفتاح المتوقع، وعرض رسالة توضيحية تشرح لماذا لم يكن الباب غير مقفل. يمكنك التعامل شيكات مثل هذه التي بيد أن تناسب اللعبة الخاصة بك — فقط ادرك أنه من الجميل دائماً إعطاء توضيح للاعب أنه تم تسجيل اجراءه، وشرح السبب لماذا لم يتم إكماله.
هذا هو منطق الباب والقفل الأساسي جداً، وكيفية تنفيذه. في بقية البرنامج التعليمي، سوف ننظر في أنظمة تأمين أخرى تختلف عن هذا النظام الأساسي.
نظم تأمين مختلفة
لقد شهدنا النظام الأساسي الذي فيه المفتاح جزء كامل من قائمة ادوات اللاعب ومفتاح واحد يفتح جميع الأبواب، ويمكن إعادة استخدامه لفتح أبواب عدة. دعونا نبني على هذا.
مثال: كومة المفاتيح
في المثال التالي، سيكون للاعب كومة من المفاتيح في قائمة ادواته. على الرغم من أن هناك عدة ألوان مختلفة من الباب، والفرق رسوميا بحتاً هنا – الباب المستخدم هو نفسه كما في المثال الأساسي، ونوع واحد من المفاتيح يمكنه فتح أي منها. لكن هذه المرة، كلما قمت باستخدام مفتاح لفتح باب، تتم إزالة هذا المفتاح من الكومة.
على قدر ما هو الترميزمهم، هذا التعديل غالبا على مستوى الشخصية للاعب. بدلاً من المنطق المتغير has_key
، سوف تحتاج لأن يكون لديك متغير عددي يحمل عدد المفاتيح للاعب "في رصيده".
في كل مرة اللاعب يلتقط مفتاح، اضف 1
إلى هذا المتغير ليمثل الصعود في الرصيد . في كل مرة اللاعب يفتح باب، اطرح 1
من هذا المتغير ليمثل استخدام مفتاح. (في لعبة فيديوالأرض، والمفاتيح يتم تدميرهم حالما يتم استخدامهم مرة واحدة.)
تعديل آخر يكون عندما يضغط اللاعب على المسطرة للوحة المفاتيح: بدلاً من التحقق من أن المنطق المتغير has_key
هو true
،نريد فعلا أن تحقق من أن قيمة KeyStack
أكبر من الصفر، بذلك يمكننا أن نستهلك مفتاح بعد فتح الباب.
في الكود الزائف، هذا يبدو شيئا مثل:
1 |
Doors mechanics = same as in the basic example above. |
2 |
|
3 |
Keyboard Key "Space" is pressed |
4 |
and Character.KeyStack > 0 |
5 |
and Distance(Character, Door) <= 64 |
6 |
and Door.Locked = True |
7 |
Character.KeyStack = Character.KeyStack - 1 |
8 |
Door.Locked = False |
مثال ويتش كيي-اي مفتاح-
في هذا المثال الجديد، سوف نفترض سيناريو حيث يتطلب كل نوع مختلف من الأبواب نوع مختلف من المفاتيح إلى أن يفتح قفله .
هنا، كما هو الحال في المثال الأساسي الأول، المفاتيح سوف تكون جزءا من قائمة ادوات اللاعب. وسوف نعود إلى استخدام المتغيرات المنطقية لتحديد ما إذا كان اللاعب قد التقطت المفاتيح المطلوبة. وبما انه سيكون لدينا مفاتيح مختلفة، سيكون لدينا أيضا أنواع مختلفة من الأبواب (باب اسود، وباب أحمر، باب ذهبي) الذين سيتطلبوا أيضا مفتاح مناسب للسماح لهم بالفتح (مفتاح أسود ، مفتاح أحمر، مفتاح ذهبي، على التوالي).
الابواب سوف يستخدموا رسوم حاسوبية مختلفة لإظهارموادهم، وسوف تحتوي على متغير رقمي ,المسمى WhichKey
الذي سوف يشير إلى نوع المفتاح المتوقع ونوع الرسم الذي ينبغي ان يعرضه. القيم الرئيسية المختلفة للمتغيرات ثابتة، لتحسين إمكانية القراءة.
في الكود الزائف هذا :
1 |
CONSTANT BLACK_KEY = 0 |
2 |
CONSTANT RED_KEY = 1 |
3 |
CONSTANT GOLD_KEY = 2 |
4 |
|
5 |
Door mechanics are the same as in the basic example. |
6 |
|
7 |
Keyboard Key "Space" is pressed |
8 |
//The door requires a black key but the character doesn't have one
|
9 |
If Door.Locked = True |
10 |
and Door.WhichKey = BLACK_KEY |
11 |
and Character.Has_Black_Key = False |
12 |
and Distance(Door,Character) <= 64 |
13 |
Text.text="You need a black key for this door" |
14 |
|
15 |
//The door requires a red key but the character doesn't have one
|
16 |
Else If Door.Locked = True |
17 |
and Door.WhichKey = RED_KEY |
18 |
and Character.Has_Red_Key = False |
19 |
and Distance(Door,Character) <= 64 |
20 |
Text.text="You need a red key for this door" |
21 |
|
22 |
//The door requires a gold key but the character doesn't have one
|
23 |
Else If Door.Locked = True |
24 |
and Door.WhichKey = GOLD_KEY |
25 |
and Character.Has_Gold_Key = False |
26 |
and Distance(Door,Character) <= 64 |
27 |
Text.text="You need a red key for this door" |
28 |
|
29 |
//The door requires a black key and the character has one
|
30 |
Else If Door.Locked = True |
31 |
and Door.WhichKey = BLACK_KEY |
32 |
and Character.Has_Black_Key = True |
33 |
and Distance(Door,Character) <= 64 |
34 |
Door.Locked = False |
35 |
|
36 |
//The door requires a red key and the character has one
|
37 |
Else If Door.Locked = True |
38 |
and Door.WhichKey = RED_KEY |
39 |
and Character.Has_Red_Key = True |
40 |
and Distance(Door,Character) <= 64 |
41 |
Door.Locked = False |
42 |
|
43 |
//The door requires a gold key and the character has one
|
44 |
Else If Door.Locked = True |
45 |
and Door.WhichKey = GOLD_KEY |
46 |
and Character.Has_Gold_Key = True |
47 |
and Distance(Door,Character) <= 64 |
48 |
Door.Locked = False |
وهذا تغيير على المثال الأساسي الذي يسمح بعدة أنواع من المفاتيح والأبواب والذي لا يستهلك مفاتيح لفتح الأبواب. بمجرد امتلاك المفتاح، سيعتبر جزء من قائمة الادوات الخاصة بك — جزء من "احصاءات اللاعب".
مثال التبديل
هذه المرة، بدلاً من التطبيق المباشر على الأبواب، اللاعب يجب عليه تنشيط مفتاح تبديل معين لفتح أو إغلاق باب معين.
الأبواب هنا ضرورية للعمل عليها كما هوالحال في المثال الأساسي. يمكنها أن تعرض رسومات مختلفة، ولكن المنطق للباب لا يزال هو نفسه. لكن هناك اضافة : نقوم بإضافة اثنين من المتغيرات الرقمية DoorID
و SwitchID
، التي نستخدمها لمعرفة رمز التبديل الذي يرتبط فيه كل باب.
رموز التبديل هي نوع جديد من المستخدمات التي قد اخترتها لاضافة الصلابة (ولكن لا يجب عليك استخدامها). انها تحتوي على المتغير المنطقي , Activated
والمتغيرات الرقمية DoorID
و SwitchID
التي، كما يمكنك التخمين، سنستخدمها لتحديد رمز التبديل الذي يرتبط فيه كل باب.
اذا عندما يكون رمز التبديل Activated: True
، الباب "المرتبط" سيكونLocked: False
. عملنا مع شريط المسافة في لوحة المفاتيح سوف يحدث عندما نكون بجوار مفتاح تبديل، بدلاً من جوار باب. لاحظ عدم وجود مفتاح في هذا المثال، نظراً لان رموز التبديل بمثابة مفاتيح:
نحن فقط يمكننا استخدام الرموز البسيطة التي تتحقق من روابط تبديل الباب في نفس الغرفة (حيث يعرض هذا المثال ثلاثة أبواب ومفاتيح تبديل في نفس الغرفة)، ولكن في وقت لاحق، سوف نرى أننا قد نجد مفاتيح تعمل على الأبواب وفي غرفة أخرى ، وحيث ان عملها لن يحدث في نفس اللحظة التي يقوم بها اللاعب بتنشيط رمز التبديل؛ سيحدث في وقت لاحق، سيحدث عندما يتم تحميل الغرفة الجديدة.
لهذا السبب، نحن بحاجة إلى استمرارية. خيار واحد لذلك وهو استخدام صفائف لتعقب البيانات مثل في حالة مفاتيح التبديل (وهذا، إذا كان كل رمزتبديل منشط أم لا).
في صيغة الكود الزائف:
1 |
CONSTANT SWITCH_DOORID = 0 |
2 |
CONSTANT SWITCH_ACTIVATION = 1 |
3 |
//Those constants will allow us to keep a readable reminder of the array coordinates
|
4 |
<br>//Define some array |
5 |
//The X coordinate of the array will correspond to the SwitchID value
|
6 |
//The Y-0 coordinate will be the DoorID
|
7 |
//The Y-1 coordinate will be the activation state
|
8 |
aSwitch(number of switches,2) |
9 |
//2 is the height (Y) number, often 0-based.
|
10 |
<br>Run some association of the SwitchIDs with DoorIDs |
11 |
|
12 |
Door mechanic is still the same as in the basic example. |
13 |
|
14 |
//Displaying the correct switch graphic according to their activation state
|
15 |
Switch.Activated = True |
16 |
Display the animation frame Switch_ON |
17 |
Switch.Activated = False |
18 |
Display the animation frame Switch_OFF |
19 |
|
20 |
Keyboard Key "Space" is pressed |
21 |
and Distance(Character, Switch) <= 64 |
22 |
Switch.Toggle(Activated) |
23 |
//A function that will set the value to either True or False)
|
24 |
aSwitch(Switch.SwitchID,SWITCH_ACTIVATION) = Switch.Activated |
25 |
//It can depend on your coding language, but the idea is to set the value in the array where X is the SwitchID and where Y is the state of activation of the switch. The value itself is supposed to be the equivalent of the Switch.Activated boolean value.
|
26 |
|
27 |
Door.DoorID = aSwitch(Switch.SwitchID,SWITCH.DOORID) |
28 |
//Allows us to make sure we're applying/selecting the correct door instance
|
29 |
//Now according to the activation value, we lock or unlock the door
|
30 |
aSwitch(Switch.SwitchID,SWITCH.ACTIVATION) = True |
31 |
Door.Locked = False |
32 |
aSwitch(Switch.SwitchID,SWITCH.ACTIVATION) = False |
33 |
Door.Locked = True |
لهذا المثال المحدد، حيث تكون المفاتيح في نفس غرفة الأبواب المرتبطة بها، استخدام تقنية المصفوفة يعتبرإفراط. إذا تم إعداد اللعبة الخاصة بك في مثل هذه الطريقة أن كل رمز تبديل لكل باب سوف يوضع في نفس الغرفة، اذا انتقل بكل الوسائل لأسلوب أبسط، وتخلص من المصفوفة، وتحقق من المعروضات التي على الشاشة فقط.
مثال لوحة مفتاح التبديل
تتشابه لوحة مفاتيح التبديل برموز التبديل، بمعنى أنهم أما ان يكونوا منشطين او لا، وبامكانية ربطهم بالأبواب لقفلهم أو إلغاء قفلهم. الفرق يكمن في كيفية تنشيط لوحة مفتاح التبديل، الذي يتم عن طريق الضغط.
في المثال المعروض من أعلى إلى أسفل ، سيتم تنشيط لوحة مفتاح التبديل كلما كان اللاعب يتداخلها ويضغطها. يمكنك الضغط على شريط المسافة لإسقاط صخرة على لوحة مفتاح التبديل، وتركها في حالة منشطة حتى عندما اللاعب لا يكون واقفا عليها.
تنفيذ هذه مشابه للمثال السابق، مع تعديلين صغيرين:
- يجب عليك تنشيط لوحة مفتاح التبديل عندما اللاعب أو الصخور فوقها.
- عليك جعل شريط المسافة يسقط صخرة (من قائمة الادوات) على لوحة مفتاح التبديل.
1 |
//Most of the implementation is the same as the previous example replace the Switch object with PlateSwitch object
|
2 |
|
3 |
//Plate-Switch Mechanic
|
4 |
Character OR Rock is NOT overlapping PlateSwitch |
5 |
PlateSwitch.Activated = False |
6 |
aSwitch(PlateSwitch.SwitchID,SWITCH_ACTIVATION) = PlateSwitch.Activated |
7 |
|
8 |
Door.DoorID = aSwitch(PlateSwitch.SwitchID,SWITCH.DOORID) |
9 |
//Allows us to make sure we're applying/selecting the correct door instance
|
10 |
Door.Locked = True |
11 |
|
12 |
Character OR Rock is overlapping PlateSwitch |
13 |
PlateSwitch.Activated = True |
14 |
aSwitch(PlateSwitch.SwitchID,SWITCH_ACTIVATION) = PlateSwitch.Activated |
15 |
|
16 |
Door.DoorID = aSwitch(PlateSwitch.SwitchID,SWITCH.DOORID) |
17 |
//Allows us to make sure we're applying/selecting the correct door instance
|
18 |
Door.Locked = False |
19 |
|
20 |
Keyboard Key "Space" is pressed |
21 |
And Character is overlapping PlateSwitch |
22 |
Spawn Rock at PlateSwitch.position |
23 |
مثال الغوغاء-موبس-
ميكانيكية قفل اخرى ممكنة تتطلب من اللاعب التخلص من جميع الأعداء (تعرف أيضا باسم الغوغاء) في غرفة أو منطقة لتحفيز فتح الأبواب.
على سبيل المثال، لقد صنعت بعض من المناطق في غرفة واحدة؛ كل منطقة لها باب وعدة اعداء (على الرغم من أن هؤلاء الأعداء لا تتحرك ولا تتعامل مع الضرر).
كل منطقة لها اللون الخاص بها.
شريط المسافة سيجعل اللاعب يطلق بعض المقذوفات؛ سوف يقتلغوغاء بثلاثة قذائف .
هذا النوع من الميكانيكية يستخدم في أسطورة زيلدا وربط إسحاق، وتدور حول وظيفة التحقق التحقق من عدد الأعداء الذين يعيشون في الغرفة أو في المنطقة. في هذا المثال، تحمل كل منطقة ملونة عدد من الغوغاء الذين يعيشون، تحفزت عند تحميل الغرفة، وهي مرتبطة بالباب. وفاة كل غوغاء ينقص 1
من هذا العداد؛ بمجرد أنه يصل إلى 0
، يتم تغيير حالة الباب Locked
إلى False
.
1 |
//On start of the game
|
2 |
For each Area |
3 |
For each Mob overlapping Area |
4 |
Area.AliveMobs = Area.AliveMobs + 1 |
5 |
<br>Door mechanic is the same as in the basic example<br> |
6 |
Keyboard Key "Space" is pressed |
7 |
Spawn a Projectile from Character's position |
8 |
|
9 |
Projectile collides with Mob
|
10 |
Mob.HP = Mob.HP - 1
|
11 |
Destroy Projectile
|
12 |
|
13 |
Mob.HP <=0 //Mob is dead
|
14 |
and Mob is overlapping Area
|
15 |
Destroy Mob
|
16 |
Area.AliveMobs = Area.AliveMobs - 1
|
17 |
|
18 |
Area.AliveMobs <= 0
|
19 |
and Door is linked to Area //By means of an ID, a pointer or whatever
|
20 |
Door.Locked = False
|
في هذا المثال، Area
هي رسم حاسوبي ملون مع متغير رقمي مرتبطة بها، AliveMobs
، التي تحسب عدد الغوغاء التي تتداخل للمنطقة. عندهزم جميع الغوغاء في المنطقة ,الباب المقابل يفتح (باستخدام نفس الميكانيكية كما شاهدنا في المثال الأساسي).
مثال التنقل
كما ذكرت في المقدمة، الأبواب يمكن أن تعمل كعوائق حظر، ولكن يمكن استخدامها أيضا للسماح للاعب للانتقال من غرفة إلى أخرى.
في هذا المثال، تكون الأبواب مفتوحة بشكل افتراضي بما انّا مهتمون أكثر بالجانب المتعلق بالملاحة-التنقل- .
الميكانيكية هذه تعتمد كثيرا على اللعبة التي تصنعها، فضلا عن الطريقة التي تتعامل بها مع بنية البيانات للأرضيات الخاصة بك. لن أخوض في تفاصيل كيفية عمل جهاز التنفيذ هنا، لانها خاصة ب كونستركت 2-بناء2-، ولكن يمكنك العثور عليها في ملفات المصدر إذا كنت ترغب.
الخلاصة
خلال هذه المقالة، شاهدنا كيف ان الأبواب هي عقبات مؤقتة تتطلب مفاتيح أو ميكانيكية فتح مثل مفاتيح أو لوحة مفاتيح أو حتى الموت للغوغاء. كما شاهدنا كيف يمكن ان تكون بمثابة "جسور"، تتيح التنقل عبر مناطق مختلفة من العالم للعبة.
كتذكرة سريعة، إليك بعض ميكانيكات قفل ممكنة:
- مفتاح واحد لجميع الأبواب، كجزء من قائمة الادوات.
- مفاتيح قابلة للاستهلاك: في كل مرة تقوم بفتح باب، يذهب مفتاح واحد بعيداً عن الكومة الرئيسية الخاصة بك.
- الأبواب المختلفة تتطلب مفاتيح مختلفة.
- رموز التبديل، أو لوحات مفاتيح التبديل، حيث كنت لا تعمل مباشرة على الباب لفتحه ولكن عن طريق جهاز مستقل مرتبط.
- قتل جميع الغوغاء في المنطقة تلقائياً يفتح باب.
إذا تم خلط جميع تلك الميكانيكات في لعبة، يمكن أن ينتهي بك الأمر مع شيء من هذا القبيل:
هنا لدينا مجموعة لطيفة من مختلف الأبواب و ميكانيكات قفل، التي تتطلب من اللاعب الذهاب عديد من الغرف لفتح الأبواب المختلفة. لأغراض تعليمية، قد تحتاج إلى إعادة إنتاج هذا في بيئة البرمجة الخاصة بك، مستخدما جميع التطبيقات السابقة التي انتقلنا خلالها.
يحدوني الأمل بانك تمتعت بهذه المقالة، وأنها كانت مفيدة لك، وأود أن أذكر أنه يمكنك العثور على المصدر لجميع العروض في جيت هب. يمكنك فتحها وتحريرها في الإصدار المجاني كونترست2 -بناء 2 (الإصدار r164.2 أو أعلاه).
المراجع
- معاينة الصورة: القفل صُمم ب جواو ميراندا من "مشروعه نون"