Trong phần này mình sẽ chỉ bạn cách để thiết lập việc tấn công trên kẻ thù và ở phần tiếp mình sẽ hướng dẫn bạn các gây sát thương / tiêu diệt kẻ thù, player.
Tham gia kênh Telegram của AnonyViet 👉 Link 👈 |
Thiết lập tấn công
Ở phần phần trước thì mình đã hướng dẫn các bạn thiết lập kẻ thù và trong đó có đoạn code trên là dùng để xác định khi gặp wall và nó sẽ quay đầu lại.
Nhưng mà đây khi mà nó gặp Player thì nó cũng quay đầu lại do đó chúng ta phải xác định được rằng khi va chạm vào wall và nó không phải là Player thì nó sẽ xoay lại.
Và ngược lại nếu như va chạm vào tường mà nó là Player thì mình sẽ làm cho con kẻ thù tấn công.
Add node
Bạn add thêm cho mình 1 node raycast để tên là XacDinhPlayer ( node raycast này mình dùng để xác định nếu Player đang đứng trước con kẻ thù thì nó sẽ tấn công).
Xong rồi bạn chỉnh sang ngang và cái mũi tên của raycast không được va chạm với CollisionShape2D.
Bạn bật nó lên và chỉnh lại cái Cast To.
var dangtancong = false func _physics_process(delta): if dangtancong == false: chuyendong.x = tocdo * huong_dichuyen chuyendong.y += trongluc chuyendong = move_and_slide(chuyendong,Vector2.UP) animation.play("dichuyen") if $RayCast2D.is_colliding() == false: huong_dichuyen = huong_dichuyen * -1 scale.x = scale.y * huong_dichuyen if is_on_wall() and $XacDinhPlayer.is_colliding() == false: huong_dichuyen = huong_dichuyen * -1 scale.x = scale.y * huong_dichuyen var coll = $XacDinhPlayer.get_collider() if coll != null and coll.name == "Player" and dangtancong == false: dangtancong = true animation.play("tancong")
Mình sẽ có đoạn code tương tự với như tấn công của Player.
Mình bỏ phần di chuyển trong if dangtancong == false:
là để nếu như không trong trạng thái tấn công thì di chuyển và ngược lại.
Dòng if is_on_wall() and $XacDinhPlayer.is_colliding() == false:
thì mình thêm $XacDinhPlayer.is_colliding() == false
là để xác định rằng khi gặp wall nếu như đó là Player thì nó không xoay lại và ngược lại.
Dòng var coll = $XacDinhPlayer.get_collider()
là mình sẽ tạo 1 biến và gán nó là $XacDinhPlayer.get_collider() là
hàm get_collider() cho phép mình xác định được RayCast đang va chạm với node nào nên mình sẽ gán node đang va chạm vào biến coll.
Dòng if coll != null and coll.name == "Player" and dangtancong == false:
là mình kiểm tra nếu như coll đã được gán bằng 1 node và tên là “Player” và không trong trạng thái tấn công thì nó sẽ thực hiên tấn công.
func _on_AnimatedSprite_animation_finished(): if animation.animation == "tancong": dangtancong = false
Tưởng tự như bên Player thì mình cần phải thêm 1 hàm để xác định khi kết thúc animation thì dangtancong = false bằng cách kết nối tín hiệu.
Và đây là kết quả cuối cùng.
Tổng Kết
Vậy là mình đã hướng dẫn xong cho bạn cách thực hiện rồi, nếu có thắc mắc vui lòng Join Group Cộng Đồng Godot VN hoặc Anonyviet Community để được giải đáp,
Câu hỏi thường gặp
Làm thế nào để kẻ thù trong game chỉ tấn công khi va chạm với nhân vật chính (Player), thay vì các vật thể khác?
Sử dụng một node RayCast2D để phát hiện va chạm. Kiểm tra xem đối tượng va chạm có tên là “Player” không. Chỉ thực hiện hành động tấn công nếu điều kiện này đúng.
Node RayCast2D hoạt động như thế nào trong việc xác định va chạm với Player?
RayCast2D bắn ra một tia. Nếu tia này va chạm với một đối tượng, hàm get_collider()
trả về đối tượng đó. Bạn có thể kiểm tra tên của đối tượng này để xác định xem đó có phải là Player hay không.
Làm thế nào để đảm bảo kẻ thù quay lại trạng thái bình thường sau khi tấn công?
Kết nối tín hiệu animation_finished
của AnimatedSprite với một hàm. Trong hàm này, đặt biến điều khiển trạng thái tấn công (ví dụ: dangtancong
) về false
.