تشخیص برخورد بر بیشتر قسمتهای بازی شما تأثیر میگذارد، از نحوه ایستادن بازیکن روی یک پلتفرم گرفته تا نحوه نابودی دشمنان.
تشخیص برخورد یکی از جنبه های حیاتی توسعه بازی است که به طور قابل توجهی بر تجربه بازیکن تأثیر می گذارد. تشخیص دقیق برخورد تضمین می کند که شخصیت های بازی به طور یکپارچه با محیط خود تعامل دارند و حس غوطه وری و واقع گرایی را ایجاد می کنند.
Godot، یک موتور بازی محبوب منبع باز، ابزارهای قدرتمندی برای پیاده سازی تشخیص برخورد کارآمد ارائه می دهد که منجر به یک گیم پلی روان و جذاب می شود.
راه اندازی بازی گودو
قبل از شروع، یک بازی پلتفرمر دو بعدی ساده در Godot 4 ایجاد کنید. با تنظیم صحنه بازی با یک شخصیت بازیکن و پلتفرم شروع کنید.
کد استفاده شده در این مقاله در این مخزن GitHub موجود است و برای استفاده شما تحت مجوز MIT رایگان است.
یک صحنه جدید ایجاد کنید و یک گره CharacterBody2D را به عنوان گره اصلی اضافه کنید. یک گره Sprite2D به عنوان فرزند CharacterBody2D اضافه کنید تا شخصیت بازیکن را به صورت بصری نشان دهد.
سپس با استفاده از GDScript حرکت را به کاراکتر بازیکن اضافه کنید:
extends CharacterBody2D
var speed = 300
func _physics_process(delta):
var input_dir = Vector2.ZERO
if Input.is_action_pressed("ui_left"):
input_dir.x -= 1
if Input.is_action_pressed("ui_right"):
input_dir.x += 1
if Input.is_action_pressed("ui_up"):
input_dir.y -= 1
if Input.is_action_pressed("ui_down"):
input_dir.y += 1
velocity = input_dir.normalized() * speed
move_and_collide(velocity * delta)
در نهایت، پلتفرمها را با استفاده از گرههای StaticBody2D برای تکمیل تنظیمات اولیه به صحنه اضافه کنید.
اشکال مختلف برخورد
گودو انواع مختلفی از اشکال برخورد را ارائه می دهد که انواع مختلفی از اشیاء بازی را تامین می کند. این اشکال برخورد به تعیین دقیق منطقه ای که در آن تشخیص برخورد انجام می شود کمک می کند.
قبل از فرو رفتن در اشکال مختلف برخورد، مهم است که توجه داشته باشید که می توانید یکی را مستقیماً به شخصیت بازیکن متصل کنید تا منطقه برخورد آن را مشخص کنید. این به شما امکان می دهد منطقه دقیق را برای تشخیص برخورد کنترل کنید.
شکل برخورد دایره ای
شکل برخورد دایره ای به ویژه برای شخصیت هایی که نیاز به تعامل شعاعی با محیط دارند مفید است. شما می توانید از این شکل برای کاراکترهایی با جعبه ورودی دایره ای یا کروی استفاده کنید. برای افزودن شکل برخورد دایره ای به شخصیت بازیکن خود:
# Inside the player character's script
var collision_shape = CollisionShape2D.new()
var circle_shape = CircleShape2D.new()
circle_shape.radius = 32
collision_shape.shape = circle_shape
add_child(collision_shape)
مستطیل شکل برخورد
اشکال برخورد مستطیلی برای شخصیت هایی با فرم جعبه ای یا مستطیلی بیشتر مناسب است. در اینجا نحوه اضافه کردن یک شکل برخورد مستطیل آمده است:
# Inside the player character's script
var collision_shape = CollisionShape2D.new()
var rect_shape = RectangleShape2D.new()
rect_shape.extents = Vector2(32, 64)
collision_shape.shape = rect_shape
add_child(collision_shape)
شکل برخورد چند ضلعی محدب
اشکال برخورد چند ضلعی محدب انعطاف پذیری زیادی را برای شخصیت هایی با فرم های نامنظم یا غیر مستطیلی فراهم می کند. می توانید از این شکل برای مطابقت دقیق با طرح کلی شخصیت خود استفاده کنید. برای افزودن شکل برخورد چند ضلعی محدب:
# Inside the player character's script
var collision_shape = CollisionShape2D.new()
var polygon_shape = ConvexPolygonShape2D.new()
polygon_shape.set_points([Vector2(-32, -64), Vector2(32, -64), Vector2(0, 64)])
collision_shape.shape = polygon_shape
add_child(collision_shape)
با انتخاب شکل برخورد مناسب و چسباندن آن به شخصیت بازیکن، میتوانید برخوردها را در منطقه تعیینشده دقیقاً تشخیص دهید و دقت تعامل با دنیای بازی را افزایش دهید.
تشخیص برخورد
تشخیص برخورد بین اشیا برای اجرای تعاملات و مکانیک های گیم پلی ضروری است. در گودو، می توانید با استفاده از موتور فیزیک داخلی به این هدف برسید.
# Detecting Collisions in _physics_process
func _physics_process(delta):
var input_dir = Vector2.ZERO
# ... (input handling)
velocity = input_dir.normalized() * speed
var collision = move_and_collide(velocity * delta)
if collision:
print("collided")
در زیر خروجی است:
سیگنال های برخورد و ماسک های برخورد
گودو سیگنالهای برخورد و ماسکهای برخورد را به عنوان ابزار قدرتمندی برای اضافه کردن پیچیدگی به بازی شما ارائه میکند.
سیگنال های برخورد
سیگنالهای برخورد رویدادهایی هستند که موتور فیزیک هنگام وقوع تصادم باعث ایجاد آنها میشود. این سیگنال ها راهی برای ارتباط اشیاء با یکدیگر و پاسخ به برخوردها فراهم می کنند. در گودو، میتوانید به سیگنالهای برخورد متصل شوید تا زمانی که رویدادهای برخورد خاصی اتفاق میافتند، منطق سفارشی را اجرا کنید.
به عنوان مثال، میخواهید زمانی که شخصیت پخشکننده با یک آیتم کلکسیونی برخورد میکند، میخواهید یک جلوه صوتی پخش کنید. در اینجا نحوه رسیدن به این هدف با استفاده از سیگنال های برخورد آورده شده است:
# Inside the player character's script
func _ready():
connect("body_entered", self, "_on_body_entered")
func _on_body_entered(body: Node):
if body.is_in_group("collectible"):
# Play a sound effect
play_collectible_sound()
# Perform additional logic like collecting the item
# Remove the collectible from the scene
body.queue_free()
در این مثال، سیگنال body_ented زمانی که شخصیت بازیکن با بدنه فیزیک دیگری برخورد می کند، منتشر می شود. با اتصال این سیگنال به تابع _on_body_ented، می توانید به رویداد برخورد پاسخ دهید. اگر بدنه در حال برخورد در گروه کلکسیونی قرار دارد، می توانید جلوه صوتی بدون حق چاپ را پخش کنید.
ماسک های برخورد
ماسک های برخورد به شما این امکان را می دهند که کنترل کنید کدام لایه های برخورد می توانند با یکدیگر تعامل داشته باشند. هر لایه برخورد مربوط به بیتی در یک بیت ماسک است. با اختصاص لایههای برخورد و ماسکها به اشیا، میتوانید به خوبی تنظیم کنید که کدام اجسام با یکدیگر برخورد میکنند و عملکرد را بهینه کنید.
به عنوان مثال، تصور کنید در بازی خود دشمنان و گلوله هایی دارید. شما می خواهید دشمنان با پلتفرم ها برخورد کنند اما نه با یکدیگر. شما همچنین می خواهید گلوله ها با دشمنان برخورد کنند اما نه با پلتفرم ها. در اینجا نحوه رسیدن به این هدف با استفاده از ماسک های برخورد آورده شده است:
# Inside the enemy's script
func _ready():
# Disable collision with other enemies
set_collision_mask_value(2, false)
# Enable collision with platforms
set_collision_mask_value(3, true)
# Inside the bullet's script
func _ready():
# Enable collision with enemies
set_collision_mask_value(2, true)
# Disable collision with platforms
set_collision_mask_value(3, false)
با فعال یا غیرفعال کردن انتخابی ماسکهای برخورد، کنترل میکنید که کدام اجسام میتوانند با یکدیگر برخورد کنند و در نتیجه تعاملات برخورد دقیق و کارآمدی ایجاد میشود.
بهترین روش ها برای تشخیص برخورد
برای اطمینان از گیم پلی روان و تشخیص برخورد کارآمد، این بهترین شیوه ها را در نظر بگیرید.
از شکل های ساده استفاده کنید
اشکال برخورد پیچیده می توانند منابع فشرده باشند. در صورت امکان، از اشکال ساده مانند دایره و مستطیل برای تشخیص برخورد استفاده کنید.
ماسک های برخورد لایه ها
گودو به شما اجازه می دهد تا لایه ها و ماسک های برخورد را تعریف کنید. از اینها برای کنترل برخورد اشیاء با یکدیگر استفاده کنید و عملکرد را بهینه کنید.
به عنوان مثال، در یک بازی پلتفرمر، بازیکن ممکن است روی سکوها بپرد و در امتداد دیوارها بلغزد. با تنظیم مناسب لایهها و ماسکهای برخورد، میتوانید به رفتارهای متمایز دست پیدا کنید.
گروه های برخورد
برای مدیریت آسان تر و تشخیص برخورد کارآمد، اشیاء با ویژگی های برخورد مشابه را گروه بندی کنید.
جعبه های مرزبندی
برای بهینهسازی عملکرد، از جعبههای محدودکننده استفاده کنید تا قبل از انجام تشخیص دقیق برخورد، به سرعت بررسی کنید که آیا اشیا در نزدیکی شما هستند یا خیر.
از پرس و جوهای سینماتیک استفاده کنید
گودو پرس و جوهای سینماتیکی را برای انجام بررسی های برخورد بدون حرکت واقعی جسم ارائه می کند. این می تواند برای پیش بینی برخوردها قبل از وقوع آنها مفید باشد.
جذابتر کردن بازیهای گودو با تشخیص برخورد
گنجاندن تشخیص برخورد کارآمد در بازی Godot شما نه تنها تعامل یکپارچه بین شخصیتها و محیط را تضمین میکند، بلکه فرصتهایی را برای مکانیکهای گیمپلی خلاقانه باز میکند.
چه چالشهای پلتفرمینگ، حل پازل یا سناریوهای جنگی، تشخیص برخورد هسته اصلی درگیری بازیکن است. با اضافه کردن تشخیص برخورد، میتوانید یک بازی بسازید که با تعاملات روان و پویا، بازیکنان را مجذوب خود کند.