Phát hiện va chạm ảnh hưởng tới hầu hết các phần trong game, từ cách người chơi đứng trên một nền tảng tới cách họ phá hủy kẻ thù.
Phát hiện va chạm là một trong số khía cạnh quan trọng của lập trình game, tác động đáng kể tới trải nghiệm người chơi. Phát hiện va chạm chính xác đảm bảo nhân vật game tương tác liền mạch với môi trường, mang tới cảm giác chân thực và hấp dẫn.
Godot, một công cụ game mã nguồn mở, cung cấp những công cụ mạnh mẽ để triển khai phát hiện va chạm hiệu quả, mang tới gameplay mượt mà, cuốn hút.
Thiết lập game Godot
Trước khi bắt đầu, tạo một game platformer 2D đơn giản trong Godot 4. Bắt đầu bằng cách thiết lập cảnh game với một nhân vật người chơi và các bệ đỡ.
Tạo cảnh mới, rồi thêm node CharacterBody2D làm node gốc. Thêm node Sprite2D làm con của CharacterBody2D để thể hiện trực quan nhân vật người chơi.
Tiếp theo, thêm chuyển động cho nhân vật người chơi bằng 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)
Cuối cùng, đưa các bệ đỡ vào cảnh bằng StaticBody2D để hoàn tất thiết lập cơ bản.
Những hình dạng va chạm khác nhau
Godot cung cấp đa dạng các hình thái va chạm, phục vụ cho những kiểu đối tượng game khác nhau. Những hình thái va chạm này giúp xác định chính xác khu vực phát hiện va chạm diễn ra.
Trước khi đi sâu vào các hình thái va chạm, điều quan trọng cần lưu ý rằng bạn có thể gắn trực tiếp một hình dạng với nhân vật người chơi để xác định khu vực va chạm của nó. Điều này cho phép bạn kiểm soát chính xác vùng phát hiện xung đột.
Va chạm hình tròn
Va chạm hình tròn đặc biệt hữu ích đối với những nhân vật cần tương tác triệt để với môi trường. Bạn có thể dùng hình dạng này cho những nhân vật với hitbox hình tròn hoặc cầu. Để thêm hình dạng va chạm dạng vòng tròn cho nhân vật:
# Bên trong tập lệnh của nhân vật người chơi
var collision_shape = CollisionShape2D.new()
var circle_shape = CircleShape2D.new()
circle_shape.radius = 32
collision_shape.shape = circle_shape
add_child(collision_shape)
Va chạm hình chữ nhật
Va chạm hình chữ nhật phù hợp với các nhân vật có dạng thiên về hình hộp hoặc chữ nhật. Đây là cách bạn có thể thêm một hình dạng va chạm hình chữ nhật:
# Bên trong tập lệnh của nhân vật người chơi
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)
Va chạm dạng đa giác lồi
Va chạm dạng đa giác lồi mang lại sự linh hoạt cao cho các nhân vật có hình dạng không đồng nhất hay không phải hình chữ nhật. Bạn có thể dùng hình dạng này để hài hòa với đường nét của nhân vật. Để thêm hình dạng va chạm dạng đa giác lồi:
# Bên trong tập lệnh của nhân vật người chơi
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)
Bằng cách chọn hình thái va chạm phù hợp và gắn nó với nhân vật người chơi, bạn có thể phát hiện va chạm chính xác trong vùng được chỉ định, nâng cao độ chính xác của tương tác với thế giới game.
Phát hiện va chạm
Phát hiện va chạm nằm giữa các đối tượng là cần thiết để triển khai tương tác và cơ chế gameplay. Trong Godot, bạn có thể đạt được điều này bằng công cụ vật lý tích hợp.
# Phát hiện va chạm trong _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")
Kết quả:
Tín hiệu và lớp phủ va chạm
Godot cung cấp các tín hiệu va chạm và lớp phủ va chạm như những công cụ mạnh mẽ thêm sự tinh tế cho game của bạn.
Tín hiệu va chạm
Tín hiệu va chạm là các sự kiện mà công cụ vật lý kích hoạt khi xung đột xảy ra. Những tín hiệu này mang tới cách giao tiếp giữa các đối tượng và phản hồi với va chạm. Trong Godot, bạn có thể kết nối với các tín hiệu va chạm để triển khai logic tùy chỉnh khi những sự kiện va chạm cụ thể diễn ra.
Ví dụ, giả sử bạn muốn bật hiệu ứng âm thanh khi nhân vật người chơi va chạm với một vật phẩm. Đây là cách bạn có thể đạt được điều này bằng tín hiệu va chạm.
# Bên trong tập lệnh của nhân vật người chơi
func _ready():
connect("body_entered", self, "_on_body_entered")
func _on_body_entered(body: Node):
if body.is_in_group("collectible"):
# Bật hiệu ứng âm thanh
play_collectible_sound()
# Triển khai logic bổ sung như thu thập vật phẩm
# Xóa đồ có thể thu thập khỏi cảnh
body.queue_free()
Ở ví dụ này, tín hiệu body_entered được phát ra khi nhân vật người chơi va chạm với đối tượng vật lý khác. Bằng cách kết nối tín hiệu này với hàm _on_body_entered, bạn có thể phản hồi sự kiện va chạm. Nếu vật thể va chạm nằm trong nhóm collectible , bạn có thể phát hiệu ứng âm thanh không bản quyền.
Lớp phủ va chạm
Mask này cho phép bạn kiểm soát các layer va chạm có thể tương tác với nhau. Mỗi layer va chạm tương ứng với một bit trong bitmask. Bằng cách gán các layer và mask va chạm vào đối tượng, bạn có thể tinh chỉnh những đối tượng va chạm với nhau và tối ưu hóa hiệu suất.
Giả sử bạn có kẻ thù và những viên đạn trong game. Bạn muốn kẻ thù va chạm vào những nền tảng nhưng không phải vào nhau. Bạn cũng muốn va chạm với kẻ thù nhưng không phải bệ đỡ. Đây là cách bạn có thể đạt được điều này bằng mask xung đột:
# Bên trong tập lệnh của kẻ thù
func _ready():
# Vô hiệu hóa va chạm với kẻ thù khác
set_collision_mask_value(2, false)
# Kích hoạt va chạm với nền tảng
set_collision_mask_value(3, true)
#Bên trong tập lệnh viên đạn
func _ready():
# Kích hoạt va chạm với kẻ thù
set_collision_mask_value(2, true)
# Vô hiệu hóa va chạm với các nền tảng
set_collision_mask_value(3, false)
Bằng cách lựa chọn cho phép hoặc vô hiệu hóa mask va chạm, bạn kiểm soát đối tượng có thể xung đột với nhau, kết quả cho tương tác va chạm chính xác và hiệu quả.
Kết hợp phát hiện va chạm hiệu quả trong game Godot không chỉ đảm bảo tương tác mượt mà giữa các nhân vật và môi trường mà còn mở ra cơ hội cho những cơ chế gameplay sáng tạo. Hãy thử đưa tính năng này vào game và bạn sẽ không phải thất vọng.