العاب المنصات (Platformer) هي أحد أشهر تصنيفات الألعاب ثنائية الأبعاد، ليس فقط من الناحية التجارية، بل حتى من ناحية قبلوها لدى مطوري الألعاب المستقلين، وذلك لما فيها من متعة لعب وسهولة التطوير.
والعديد من المطورين دائما ما يصنعونها في مسابقات تطوير الألعاب – game jams، ولكن كثيرا ما يتواجد بها عدة مشاكل، ومن أهم تلك المشاكل، هي الكاميرا وتأثيراتها.
فلا يكفي أن تضع كاميرا تتبع اللاعب وكفى، فقد تتحول الكاميرا إلى مُعيق بدلا من مُساعد للمستخدم، فلا يستطيع رؤية الاعداء لصغر مجال الرؤية، او لا يستطيع رؤية المنصة التي يجب القفز عليها نظرا لان الكاميرا مُرتفعة!
لذلك وجب التحدث عن بعض تأثيرات وانظمة الكاميرا التي من شانها تحسين جودة لعبتك كثيرا، فيمكن تطبيق تلك التأثيرات على اي لعبة ثنائية الابعاد ، مثل العاب المنظور الجانبي – side view كألعاب المنصات platformer أو المنظور علوى – top down.
ومن أهم تأثيرات الكاميرا :
- تتبع حركة اللاعب بسلاسة
- النظر في اتجاه اللاعب
- الاهتزاز
- النظر لأعلى وأسفل (خاص بألعاب المنصات)
- نظام التركيز وغلق التتبع
- حدود حركتها/تتبعها
ولن اكتفي فقط بالتحدث عن تلك التقنيات، بل ايضا سأعطيك التعليمات (code) الذي يطبق هذه التقنية، ولكن سيكون في محرك غودو- godot، نظرا لسهولة فهم أوامره البرمجية.
وايضا سيكون للعبة منظور جانبي (بسبب احد التأثيرات المحددة)، كما سُيقسم هذا المقال لجزئين، ففي المقال القادم اتحدث عن نظام التركيز وايضا مبدأ الحدود والاهتزاز. والبقية اتحدث عنها هنا.
عناصر المقال
سكربت خاص بالكاميرا
في بُنية مُحرك غودو، يمكنك إضافة كائنات داخل كائنات اخرى، وهذه هي افضل طريقة لجعل الكاميرا تتبع اللاعب في تحركاته، حيث تقوم بإنشاء اللاعب، ثم اضافة الكاميرا له. وهكذا دائما ستتبعه
وفي نفس الوقت تضيف شيفرة-script خاص باللاعب ليكون هو العقل المدبر لكل شيء. فتكتب فيه تعليماتك البرمجية التي من شأنها التحكم في اللاعب وأبنائه.
ولكن نظرا لان الكاميرا سيكون لها عدة تأثيرات مختلفة، فمن الأفضل وجود شيفرة خاصة بها، وفي تلك الشيفرة اضع كل التعليمات البرمجية الخاصة بالتأثيرات، ثم استدعيها في الوقت المناسب أن احتجت إلى ذلك.
بهذا يكون مشروعك مُنظما ويمكن تعديلها بسهولة.
وعلى هذا الاساس، فان جميع التعليمات المكتوبة في هذا المقال هي بداخل الكاميرا نفسها، فعند ذكر خاصية مثل خاصية الموضع- position، ووضع قيمة لها، فذلك يعني وضع قيمة لموضع الكاميرا في حد ذاته
التحرك بسلاسة
عندما يقفز اللاعب أو يتحرك حركة سريعة أو يُضرب من قِبل العدو فيتراجع للوراء، فتتحرك الكاميرا معه مباشرة، فذلك من اسوء سلوكيات بالكاميرا. لأنه تسبب ازعاجا للاعب لأنه يريد التركيز على أمر محدد والكاميرا لا تساعده في ذلك.
الافضل هو استخدام “السلاسة” ويسمى بالـ smooth Position، والذي يجعل سرعة حركة الكاميرا ليست بنفس سرعة اللاعب، بل بسرعة خاصة تُحددها انت، فهكذا “تتبع” اللاعب.
المحرك بالفعل يوفر هذه الخاصية داخل الكاميرا، ويكفي تشغيلها من الخصائص ووضع السرعة بنفسك حتى تبدأ الكاميرا في تتبع اللاعب بسلاسة على حسب السرعة التي وضعتها.
ولكن ذلك قد يتسبب بعدة مشاكل وفي نفس الوقت عدة مزايا، فهل من الافضل انشاء نظام السلاسة خاصتك؟ الإجابة باختصار هي [يعتمد]، حيث يعتمد الأمر على نظام لعبتك، أن كانت مُعقدة، فربما من الافضل انشاء نظامك الخاص.
غير ذلك يكفي استعمال هذا النظام لما فيه من جودة و ومميزات ستنفع فيما بعد.
النظر لليمين واليسار
أن لاحظت في التأثير الماضي أن الكاميرا دائما لا تتبع اللاعب بشكل مثالي، بل هي مُتأخرة عنه قليلا، فلو تحرك لليمين او اليسار تجد الكاميرا دائما تنظر خلفه، وذلك لان سرعتها ابطئ منه.
ومن أهم المشاكل التي قد تحدث بسبب ذلك، هو عدم رؤية الأعداء والعقبات التي ستأتي أمامه، وفي هذه الحالة يجب عليك حل المشكلة بنفسك عن طريق التعليمات البرمجية.
وفي هذا الشأن، فإن الحل يكمن في جعل الكاميرا في موضع أمام اللاعب قليلا، فلو قلنا أن اللاعب يتحرك لليمين، اذا يجب أن يكون موضع الكاميرا امامه بقرابة الـ25 او 30 بكسل، لتكون التعليمات هكذا :
func _process(delta):
# الضغط على زر التحرك لليسار
if Input.is_action_just_pressed("left_button"):
position.x = -30
# الضغط على زر التحرك لليمين
elif Input.is_action_just_pressed("right_button"):
position.x = 30
يمكن تنظيم هذه التعليمات اكثر ، ولكن الهدف هنا هو المبدأ الأساسي، والذي ينص على جعل الكاميرا في موضع أمام اللاعب، فلو اتجه لليمين تكون على 30 بكسل، ولو تحرك لليسار، تكون على سالب 30 بكسل.
بالطبع هذا الرقم قد يختلف بالنسبة لك، لذلك جد ما يناسبك.
الوقوف على الحافة
عندما تبني مرحلة وتطلب من اللاعب القفز إلى منصة ادنى منه، فمن الواجب عليك اظهار تلك المنصة، أن لم يرها، فكيف له أن يعرف اين يقفز؟
وحل المشكلة كفكرة أمر سهل، فكل ما عليك هو جعل الكاميرا تنظر لاسفل فقط، او على الاقل تغير موضعها للاسفل قليلا، ولكن تلك ايضا مشكلة، فهكذا طوال الوقت سيشعر اللاعب أنه ينظر لأسفل بدون حاجة.
الافضل هو جعل الكاميرا تنظر للأسفل، او بالاصح تتحرك لاسفل قليلا، عندما يكون اللاعب على حافة، هكذا تتغير الكاميرا وتظهر كأنها تساعد اللاعب بالفعل وليست ضده، ويمكنه اخيرا معرفة المنصات الادنى منه.
وللأنشاء هذا التأثير، يجب الاستعانة بعقدة الشعاع – RayCast، والتي تحدد إذا ما كانت تتصادم مع كائن ما، فلو كان ذلك الكائن هو الأرض، فعندها لا تفعل شيئ وتكون الكاميرا على وضعها الطبيعي.
وفي حالة كان ذلك الشعاع لا يتقابل مع الأرض، ذلك يعني أنه على حافة، أي يجب تغيير موضع الكاميرا لتكون في الاسفل. وفي نفس الوقت يجب الحذر من قفزة اللاعب، اي أن قفز، فالاكيد أن الشعاع لا يلامس الأرض. ليكون المنطق البرمجي كالتالي :
func _process(delta):
# التأكد من عدم تغير موضع الشعاع الأفقي ليبقى مع اللاعب وليس موضع الكاميرا
ray.position.y = -position.y + 10
# في حالة كان اللاعب على الأرض ولا يلامس
if (not ray.is_colliding()) and player.is_on_floor():
position.y = 30 # الحالة العادية للكاميرا
# في حالة كان اللاعب على حافة
else:
position.y = -30 # الكاميرا تنظر لأسفل
ملحوظة هامة 1 : يجب تشغيل خاصية hit from inside من خصائص عقدة الشعاع RayCast2D حتى تعمل هذه الخاصية بكفاءة
ملحوظة هامة 2 : الشعاع هو إبن للكاميرا، وذلك كي يتبعها في النظر لليمين واليسار بدلا من استعمال شعاعين.
لا اظن انه يوجد حاجة لشرح هذه التعليمات بما اني ذكرت المنطق، مع ذلك وضعت عدة تعليقات يسيرة لفهم فكرتها، للمتغيرين player وray، فالاول به اللاعب، والثاني به عقدة الشعاع.
المشكلة الحقيقية التي قد تواجهك هي متعلقة بالحركة الرأسية لموضع الكاميرا، فحتى أن فعلت تقنية السلاسة – smoothing، فقد تواجه مشكلة مع سرعة الانتقال الرأسي. والذي قد تريده بسرعة خاصة بك.
بالتالي استعملت الوسيط-tween، للتغير سرعة الحركة الراسية بما أراه مناسبا بهذا الشكل :
var tween = get_tree().create_tween()
tween.tween_property(self, "position:y", 30, 1.0)
يوجد المزيد!
يكفي استعمال هذه التقنيات لتحسين لعبتك ورفع تقيمها في مسابقات تطوير الالعاب، بل ستجعل اللاعبين انفسهم يشكرونك لانك تساعدهم في اللعب ولست تقف ضدهم !
هذه التقنيات ما هي الا تقنيات يسيرة ومع ذلك تؤثر بشكل كبير على جودة اللعبة، وفي نفس الوقت، تظل هناك العديد من التقنيات الاخرى مثل نظام التركيز والاهتزاز والحدود.
ولكن لا أريد الاطالة في المقال، لذلك المقال القادم اتحدث عن تلك الـ3 تقنيات وكيفية اضافتهم للعبتك بشكل مناسب. وإلى ذلك الوقت، اخبرني برايك في هذه التقنيات، وهل تنوي استعملها؟