Thủ Thuật

[Tạo 2D Platformer Game với Godot] Phần 11: Tấn công của kẻ thù

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.

Thiết lập tấn công

[Tạo 2D Platformer Game với Godot] Phần 10: Tấn công của kẻ thù

Ở 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

[Tạo 2D Platformer Game với Godot] Phần 11: Tấn công của kẻ thù 9

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).

[Tạo 2D Platformer Game với Godot] Phần 11: Tấn công của kẻ thù 10

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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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")
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")
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:
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:
if is_on_wall() and $XacDinhPlayer.is_colliding() == false: thì mình thêm
$XacDinhPlayer.is_colliding() == false
$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()
var coll = $XacDinhPlayer.get_collider() là mình sẽ tạo 1 biến và gán nó là
$XacDinhPlayer.get_collider()
$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:
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.

 

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
func _on_AnimatedSprite_animation_finished():
if animation.animation == "tancong":
dangtancong = false
func _on_AnimatedSprite_animation_finished(): if animation.animation == "tancong": dangtancong = false
func _on_AnimatedSprite_animation_finished():
    if animation.animation == "tancong":
        dangtancong = false

[Tạo 2D Platformer Game với Godot] Phần 11: Tấn công của kẻ thù 11[Tạo 2D Platformer Game với Godot] Phần 11: Tấn công của kẻ thù 12[Tạo 2D Platformer Game với Godot] Phần 11: Tấn công của kẻ thù 13

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.

[Tạo 2D Platformer Game với Godot] Phần 11: Tấn công của kẻ thù 14

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 RatHuuIch Community để được giải đáp,

 

 

 

 

 

Đánh giá post

Rất Hữu ích

RatHuuIch là Website chia sẻ miễn phí tất cả các kiến thức về công nghệ thông tin. RatHuuIch cung cấp mọi giải pháp về mạng máy tính, phần mềm, đồ họa và MMO.

Bài liên quan

Theo dõi
Thông báo của
guest

0 Góp ý
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận
Back to top button