[Tạo 2D Platformer Game với Godot] Phần 15: Thêm animation bị thương cho Player

Trong phần này mình sẽ thêm add thêm animation bị thương cho Player còn về kẻ thù thì đã thêm ở phần trước, phần này thì cũng dễ tương tự như phần trước thôi.

Animation bị thương

Thêm animation

Ở phần thiết kế nhân vật thì mình chưa thêm animation bị thương vào cho nên bạn sẽ thêm vào cho mình nhé.

Add cho mình 1 animation tên là bithuong rồi các bạn sẽ tự add lại chứ  mình không hướng dẫn và cũng như ôn lại kiến thức.

Sau đó thì tắt loop luôn nha.

Áp dụng animation

Thì như đã nói ở đâu bài, cách hoạt động của nó cũng không khác gì với phần trước cả.

Mình sẽ tạo 1 biến là bithuong để kiểm tra đang bị thường hay không sau đó khi bị kẻ thù tấn công thì bithuong = true, dangtancong = false để nếu mà bị kẻ thù tấn công nó sẽ không tấn công nữa mà chạy animation bị thương và chạy animation bị thương. Và mình cũng check thêm ở các điều kiện khác.

Sau đó nếu kết thúc Animation bị thương thì bithuong = false

 

var bithuong = false

Biến bị thương nè.

 

func _on_Hurtbox_area_entered(area):
    if area.name == "Hitbox" and area.get_parent().dangtancong == true:
        mau -= area.get_parent().satthuong
        dangtancong = false
        bithuong = true
        animation.play("bithuong")

Nếu như bị đánh thì dangtancong = false, bithuong = true và chạy animation bị thương.

 

func _on_AnimatedSprite_animation_finished():
    if animation.animation == "tancong":
        dangtancong = false
    if animation.animation == "bithuong":
        bithuong = false

Check nếu animation bị thương kết thúc thì biến bithuong = false.

 

if !dangtancong and not bithuong:
    huong_dichuyen = Input.get_axis("ui_left","ui_right")
    if huong_dichuyen != 0:
        chuyendong.x = lerp(chuyendong.x,huong_dichuyen * tocdo,0.5)
        animation.play("chay")
        scale.x = scale.y * huong_dichuyen
    else:
        chuyendong.x = lerp(chuyendong.x,0,0.5)
        animation.play("dungyen")

    if is_on_floor():
        if Input.is_action_just_pressed("ui_accept") :
            chuyendong.y = -250
    else:
        animation.play("nhay")

Thêm điều kiện vào để khi bị thương thì mình không thể di chuyển cho đến khi nó kết thúc.

if Input.is_key_pressed(KEY_J) and is_on_floor():
    if not bithuong:
        dangtancong = true
        chuyendong.x = 0
        animation.play("tancong")

Kiểm tra khi nhấn phím tấn công và không trong trạng thái bị thường thì tấn công.

 

extends KinematicBody2D

var tocdo = 200
var trongluc = 10
var chuyendong = Vector2()
var huong_dichuyen = 1

onready var animation = $AnimatedSprite
var dangtancong = false
var bithuong = false

var mau = 20
var satthuong = 10

func _physics_process(delta):
    
    if !dangtancong and not bithuong:
        huong_dichuyen = Input.get_axis("ui_left","ui_right")
        if huong_dichuyen != 0:
            chuyendong.x = lerp(chuyendong.x,huong_dichuyen * tocdo,0.5)
            animation.play("chay")
            scale.x = scale.y * huong_dichuyen
        else:
            chuyendong.x = lerp(chuyendong.x,0,0.5)
            animation.play("dungyen")

        if is_on_floor():
            if Input.is_action_just_pressed("ui_accept") :
                chuyendong.y = -250
        else:
            animation.play("nhay")
    if Input.is_key_pressed(KEY_J) and is_on_floor():
        if not bithuong:
            dangtancong = true
            chuyendong.x = 0
            animation.play("tancong")
    
    chuyendong.y += trongluc 
    chuyendong.normalized()
    chuyendong = move_and_slide(chuyendong,Vector2.UP) 
    
    if mau <= 0:
        set_physics_process(false)
        animation.play("chet")
        $CollisionShape2D.disabled = true
func _on_AnimatedSprite_animation_finished():
    if animation.animation == "tancong":
        dangtancong = false
    if animation.animation == "bithuong":
        bithuong = false
func _on_AnimatedSprite_frame_changed():
    if animation.animation == "tancong":
        if animation.frame == 3:
            $Hitbox/CollisionShape2D.disabled = false
        else:
            $Hitbox/CollisionShape2D.disabled = true 

func _on_Hurtbox_area_entered(area):
    if area.name == "Hitbox" and area.get_parent().dangtancong == true:
        mau -= area.get_parent().satthuong
        dangtancong = false
        bithuong = true
        animation.play("bithuong")

Và mình có full code của phần này như trên.

Và mình có kết quả cuối cùng.

Tổng Kết

Vậy trong phần này mình đã hướng dẫn bạn cách để có thể sử dụng animation bị thương cho nhân vật.

 

 

 

 

 

Đánh giá post
Exit mobile version