يمكنك تحقيق هذا التأثير البصري المذهل ببساطة عن طريق تحريك الأشياء بسرعات مختلفة.

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

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

إعداد لعبة جودو

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

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

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

extends CharacterBody2D

var speed = 200

func _physics_process(delta):
var velocity = Vector2()

if Input.is_action_pressed('ui_right'):
velocity.x += 1

if Input.is_action_pressed('ui_left'):
velocity.x -= 1

if Input.is_action_pressed('ui_down'):
velocity.y += 1

if Input.is_action_pressed('ui_up'):
velocity.y -= 1

instagram viewer

velocity = velocity.normalized() * speed
move_and_collide(velocity * delta)

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

إنشاء طبقات مختلفة مع عقد طبقة المنظر

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

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

إليك رمز GDScript لإنشاء طبقات المنظر بأشياء قابلة للتصادم:

extends ParallaxBackground

func _ready():
# Create the first parallax layer
var layer1 = ParallaxLayer.new()
layer1.motion_scale = Vector2(0.2, 0.2)
add_child(layer1)

# Add a StaticBody2D with CollisionShape2D to the first layer
var static_body1 = StaticBody2D.new()
layer1.add_child(static_body1)

var collision_shape1 = CollisionShape2D.new()
var shape1 = RectangleShape2D.new()
shape1.extents = Vector2(32, 32)
collision_shape1.shape = shape1
static_body1.add_child(collision_shape1)

# Create the second parallax layer
var layer2 = ParallaxLayer.new()
layer2.motion_scale = Vector2(0.5, 0.5)
add_child(layer2)

# Add a StaticBody2D with CollisionShape2D to the second layer
var static_body2 = StaticBody2D.new()
layer2.add_child(static_body2)

var collision_shape2 = CollisionShape2D.new()
var shape2 = RectangleShape2D.new()
shape2.extents = Vector2(64, 64)
collision_shape2.shape = shape2
static_body2.add_child(collision_shape2)

# Create the third parallax layer
var layer3 = ParallaxLayer.new()
layer3.motion_scale = Vector2(1.0, 1.0)
add_child(layer3)

# Add a StaticBody2D with CollisionShape2D to the third layer
var static_body3 = StaticBody2D.new()
layer3.add_child(static_body3)

var collision_shape3 = CollisionShape2D.new()
var shape3 = RectangleShape2D.new()
shape3.extents = Vector2(128, 128)
collision_shape3.shape = shape3
static_body3.add_child(collision_shape3)

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

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

تحريك طبقات مختلفة بسرعة مختلفة

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

أضف كود GDScript التالي إلى مشهد المشغل:

extends CharacterBody2D

func _physics_process(delta):
...
move_and_collide(velocity * delta)

# Update parallax layers based on player movement
var parallax_background = get_parent()
var motion = -velocity * delta
parallax_background.set_scroll_offset(parallax_background.scroll_offset + motion)

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

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

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

extends ParallaxBackground

const MAX_LAYERS = 5
const MIN_SCALE = 0.2
const MAX_SCALE = 1.5
const MIN_SPEED = 0.01
const MAX_SPEED = 0.03
const MIN_X_POSITION = -500
const MAX_X_POSITION = 500
const MIN_Y_POSITION = -300
const MAX_Y_POSITION = 300

func _ready():
for i in range(MAX_LAYERS):
create_random_layer()

func create_random_layer():
# Add a new parallax layer with a random motion scale
var layer = ParallaxLayer.new()
var scale = lerp(MIN_SCALE, MAX_SCALE, randf())
layer.motion_scale = Vector2(scale, scale)

var x_position = randf_range(MIN_X_POSITION, MAX_X_POSITION)
var y_position = randf_range(MIN_Y_POSITION, MAX_Y_POSITION)
layer.global_transform.origin.x = x_position
layer.global_transform.origin.y = y_position

add_child(layer)

# Add a StaticBody2D with CollisionShape2D to the new layer
var static_body = StaticBody2D.new()
layer.add_child(static_body)

var collision_shape = CollisionShape2D.new()
var shape = RectangleShape2D.new()
shape.extents = Vector2(32, 32)
collision_shape.shape = shape
static_body.add_child(collision_shape)

func remove_random_layer():
# Remove a random parallax layer
if get_child_count() > 0:
var random_index = randi() % get_child_count()
var layer_to_remove = get_child(random_index)
remove_child(layer_to_remove)

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

Variant lerp ( Variant from, Variant to, float weight )

تمرير النتيجة من راندف () حيث يتيح لك الوزن إنشاء طبقات بمقياس عشوائي.

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

var x_position = randf_range(MIN_X_POSITION, MAX_X_POSITION)

يجب أن تبدو لعبتك التجريبية الآن كما يلي:

بما في ذلك الميزات الإضافية

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

كائنات الخلفية

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

الإضاءة الديناميكية

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

تأثيرات الجسيمات

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

دورة الليل والنهار

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

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

تحسين الأداء

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

ترتيب الطبقة

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

حدود الكاميرا

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

الاختبار والتعديل والتبديل

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

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

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