فين غادي أنا؟ وفين يسالي الطريــق؟
واش هاد الشي حقيقي ولا خيال؟
كنت كولشي, ودابا حسيت براسي ضيق,
واش أنا غير صورة, ما عندهاش ظل؟

الوجود تقيل, والأسئلة كتخنق.
فين هي النهاية؟ وفين البداية كانت؟
أ العشير, حتى أنا كنقلب على معنى,
غير سد هاد الصفحة, وبركة من الأسئلة.

#5 Godot Side Scroller, أعداء جداد, وبناء المراحل بالـVoxel

مرحبا بكم في Devlog جديد (رقم 5) من رحلة صناعة أول لعبة 3D Action RPG ديالي بـ Godot. من بعد ما قاديت الـUI واللعب بالمانيطة فـ Devlog #4، اليوم قررت نركز على الـ Core Gameplay والتجربة ديال اللعب، حيت اللعبة خاصها تكون ممتعة من الدقة الأولى، وماشي غير “غرافيكس” وصافي.

اللعبة ديالي كانت فالأصل Top-Down (بحال Zelda القديمة)، ولكن مؤخراً طاح ليا واحد البلان فراسي: علاش ما نجربش ندير Godot Side Scroller بحال لعبة Wonder Boy الكلاسيكية (اللي فايت ليا درت ليها تعريب بالعربية وشاركتو معاكم)؟ هاد التجربة خلاتني نزيد بزاف ديال الميكانيزمات جداد، بحال التلاويحة لي تايدير ديال ماريو فلعبة Super Mario 64، ولا السوفل بالـStaminaBar، أعداء جداد بخوارزميات ذكية (AI)، وحتى نظام بناء جديد بـ Voxel Blocks! يلاه نكتاشفو هاد الروينة كاملة وكيفاش خليتها مريݣلة باش تخدم فالمتصفح والبيسي.

تجربة “طريقة” جديدة فاللعب: الـSide Scroller

كيفما كتبت فـ Devlog #3، كنت قاديت الكاميرا باش تبدل الزاوية وتشوفك من الجنب فشي مناطق، ولكن اللعب كان كيبقى عادي بحال Zelda، يعني اللاعب كيقدر يتمشى فـ 3D بحرية (فـ الـ X والـ Z axis).

مؤخراً، قلت مع راسي: علاش ما نجربش نرد اللعبة Side Scroller ديال بصح؟ ماشي غير الكاميرا اللي كتبدل، ولكن حتى طريقة اللعب براسو كيولي محصور فـبلان ثنائي الأبعاد. علاش درت هادشي؟ الصراحة، بغيت نشوف الشخصية ديال اللاعب والأعداء الجداد مزيان وبوضوح. فاش كتشوفهم من الجنب، التفاصيل ديالهم (بحال الحوايج، الأسلحة، والحركات) كيبانو أحسن بكثير، والنتيجة الصراحة عجباتني بزاف وحمقاتني!

شنو درت بالضبط فالكود باش تخدم هاد اللعيبة؟

  1. حبس الحركة فـ العمق (Z-axis Lock): باش اللاعب ما يبقاش يدخل لداخل ديال الشاشة أو يخرج لعندك، درت Lock لـ Z-axis. يعني اللاعب دابا يقدر يتحرك غير فـ X (يمين ويسار) و Y (الفوق والتحت).
  2. تدوير الـ Mesh: دورت الـ 3D Model ديال اللاعب شوية جيهة الـ Camera. حيت إلا خليتو كيشوف نيشان لليمين، غاتولي تشوف غير الجنب ديالو، وهادشي ما كيبانش زوين فالـ 3D. التدوير كيعطيك داك الإحساس ديال الـ 2.5D وكتشوف الشخصية مزيان.
  3. تطبيق نفس النظام على الأعداء: نفس البلان طبقتو على الأعداء. إلا كان هاد الوضع مفعّل، كيوليو حتى هما يتصرفو فـ 2D Plane (كيمشيو غير يمين ويسار).
 تجربة اللعبة في Godot Side Scroller Mode
الوضع الجانبي

الصراحة، هاد البلان جاني ناضي، وممكن اللعبة ديالي تولي Side-Scroller فالمقام الأول حيت كيسهل بزاف ديال الحوايج فالـLevel Design وكيعطي جمالية واعرة. وممكن مستقبلاً نخليهم بجوج ونبدل بيناتهم وسط اللعب باش نهرس الملل.

بناء المراحل بـ Voxel Blocks والـSandbox

كمطور ألعاب بوحدي (Solo Indie Dev)، خاصني نلقى طرق باش نسرع الخدمة وماياخدش ليا وقت طويل فالتصميم ديال كل مرحلة. داكشي علاش زدت Voxel Blocks فـاللعبة.

شنو هما الـ Voxels؟ ببساطة، الـVoxel هو بحال البيكسل ولكن فعالم ثلاثي الأبعاد 3D. يعني عبارة على مكعبات متساوية كنبنيو بيهم العالم ديال اللعبة، تماما بحال الستيل ديال ألعاب Minecraft أو Hytale.

بناء المراحل باستعمال Voxel Blocks

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

هاد الـ 3D Models ديال البلوكات اللي خدام بيهم حاليا خديتهم من Kaykit، وهما ماشي غير Placeholders وصافي! الخطة ديالي هي نستعمل مهاراتي فـ Blender باش نـعدّل فيهم، ونزيد بلوكات جداد ديالي من بعد. ولكن دابا باغي نركز 100% على الكود باش تطلع اللعبة مريݣلة والـ Gameplay يكون ناضي هو الأول.

البلان الواعر هو أنه فالمستقبل، ناوي نرد اللعبة شوية Sandbox. يعني هاد البلوكات يقدرو يوليو يتهرسو، أولا اللاعب يقدر يجمعهم ويبني بيهم حوايج خرين!

ميكانيك الحركة الجديد: الـDive (التلاويح أولا الغوص)

الحركة الأساسية ديال اللاعب كان خاصها شوية ديال “الحلاوة” باش نزيدو الأكشن. كيفما فـ Devlog #1، كنت ديجا قاديت الميكانيك ديال الزحف اللي كيخلي اللاعب يتكا فالأرض باش يتخبى إلا ورك على البوطونة وهو واقف فبلاصتو. دابا، طورت هاد الميكانيك باش تولي ديناميكية كثر:

  • الـ Dive (تلوح راسك): خديت هاد الفكرة من ألعاب بحال Super Mario 64. دابا، إلا استعملتي نفس البوطونة ديال الزحف ولكن هاد المرة ونتا كتجري، اللاعب كيلوح راسو للقدام (كيتلاح) وكيدير غوص فالهوا! هاد اللعيبة واعرة بزاف باش تهرب بالزربة من شي ضربة، أولا باش تنقز لشي مسافة بعيدة اللي النقيز العادي ما كيوصلش ليها. يعني بوطونة وحدة ولات كدير جوج حوايج على حساب الحالة ديال اللاعب.
player diving, اللاعب تايتلاح

ولكن، باش اللاعب ما يبقاش غير يطير ويجري فابور بحال سوبرمان، زدت Stamina Bar (شريط الطاقة لونو خضر فـ الـ UI). دابا إلا جريتي أو تلاحيتي، الـStamina كتهبط وإلا تسالات، ماغاتبقاش تقدر تجري وخاصك ترتاح شوية وتتمشى عادي باش ترجع تعمر. هادشي كيعطي توازن مريݣل كيخليك تفكر إمتى تجري وإمتى تخلي الجهد ديالك.

برمجة ذكاء الأعداء الجداد (AI): الفݣيع والنحلة

السلايم اللي قاديتو فـ Devlog #3 شحال هادي كان مسكين بوحدو. اليوم جبت ليه صحابو، مبرمجين باش يخدمو مزيان فالـGodot Side Scroller:

1. الفݣيع اللي كيتمشى

mushroom enemy idle الفݣيع العدو واقف

هاد العدو عندو رجلين ومبرمج بـ States Machine باش يكون ذكي:

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

2. النحلة اللي كطّير

هاد العدو كيطير وغادي يبرزطك فاش تبغي تنقز من منصة لمنصة:

  • الطيران: كتقدر تبقى طايرة فبلاصتها (Hover)، أولا تحرك عموديا وأفقيا.
  • حركة الموجة (Sine Wave): باش النحلة تبان طبيعية، برمجتها باش تحرك فمسار ديال Sine Wave (موجة جيبية). الكود كيستعمل دالة sin() مع الوقت باش يطلعها ويهبطها بطريقة سلسة. (تقدر تقرا عليها فـ ويكيبيديا).
  • الردار ديال الحيوط: النحلة حتى هي عندها RayCast3D كيشوف للقدام. إلا لقات حيط أو عدو، كدور وجهها وتمشي فالاتجاه المعاكس. و تقدر تريغل فاش كتقرب ليها، كتدخل فـ حالة المطاردة وكتهبط بسرعة باش تلسعك.
bee flying enemies, النحل

العفطة ديال سوبر ماريو و الأشواك القاتلة

كيفاش نقتلو هاد الأعداء الجداد؟ طبعاً تقدر تضربهم بالسيف، ولكن زدت واحد الميكانيزم واعر غادي تعجب لعشاق ديال الـPlatformers!

دابا، اللاعب يقدر ينقز فوق راس الأعداء باش يعفط عليهم (العفطة ديال الماريو)! هادشي قاديتو بـArea3D كاينة تحت رجلين اللاعب كتحسب التصادم. (هاد الميكانيك غادي تولي مربوطة بالصباط اللي خاصك تلبسو باش تخدم، ولكن غانهضرو على الشكارة وكيفاش تلبس الحوايج بالتفصيل فالـ Devlog الجاي، داكشي علاش بقاو متبعين!).

اللاعب تايزطم على سلايم

وباش نكملو التحدي، زدت أشواك فالأرض. هادو ما معاهمش اللعب. أي عدو (ولا حتى اللاعب) قاس هاد الشوك، كياخد 999- فـ الصحة وكيموت فالبلاصة.

-999 spike damage

جرب اللعبة دابا

الهضرة بوحدها ما كافياش، بغيتي تعيش التجربة وتشوف هادشي كامل بعينيك؟ اللعبة واجدة دابا باش تلعبها ديريكت فالمتصفح ديالك، بلا ما تحتاج تيليشارجي تا شي حاجة!

أسئلة

1. كيفاش ندير Lock للـ Z-axis فـ Godot 4 باش نصاوب Side Scroller؟

فـ Godot 4، إلا كنتي خدام بـ Node ديال CharacterBody3D، تقدر تمشي لـ Inspector، تقلب على Axis Lock، وتكوشي على Linear Z. أولا من الأحسن ديرها بالكود فـ Script ديالك: axis_lock_linear_z = true. هكا اللعبة كتمنع الفيزياء باش تحركك فداك الاتجاه.

2. كيفاش نقاد Stamina Bar وتخدم مزيان مع الـ UI؟

كتصاوب TextureProgressBar فالـ UI ديالك. فالـ Script ديال اللاعب، كتديكلاري Variable سميتها stamina. فـ الدالة ديال _process(delta):
– ملي اللاعب كيبرك على بوطونة الجري، كدير stamina -= drain_rate * delta.
– ملي كيحيد صبعو، كدير stamina += recharge_rate * delta باش تعمر.
– فكل إطار (Frame)، كتدير تحديث للـ UI بهاد الكود: stamina_bar.value = stamina.

3. شنو هو الـ RayCast3D وكيفاش كيخدم فالذكاء الاصطناعي (AI)؟

درت منطقة تصادم Area3D صغيرة لاصقة فـ رجلين اللاعب لتحت. ملي هاد الـ Area كتقيس الـ Hitbox ديال شي عدو، كندير جوج شروط:
1. واش اللاعب لابس الصباط فـ الـ Inventory؟
2. واش سرعة اللاعب فـ محور الـ Y سالبة velocity.y < 0 (يعني هابط من السما). إلا تحققو الشروط، كنعطي للعدو Damage، وكنفرض على اللاعب سرعة إيجابية velocity.y = bounce_force باش يعاود ينقز الفوق ديريكت بعد المعيس.

هادشي اللي كاين فهاد التحديث الخوت! اللعبة غادية وكتزيان، وتجربة الـGodot Side Scroller عجباتني بزاف. فـ الـDevlog الجاي (رقم 6)، غانشرح ليكم كيفاش قاديت سيستيم ديال الـ Inventory (الشكارة) والـ Equipment بالدارجة المغربية، وكيفاش زدت واحد اللعيبة سميبPaper Doll باش نقدرو نلبسو الصباط والطربوش!

خليو ليا رأيكم فـ لي كومونطير، واش نكملو فـ الـ Side-Scroller ولا نرجعو لـ Top-Down؟ العز، وتهلاو! خوكم Bou33ou.