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

Trong phần này thì mình sẽ hướng dẫn bạn cách để làm cho nhân vật tấn công và lập trình cho kẻ thù có thể xác định được Player để có thể tấn công ở phần sau nha.

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

 

func _physics_process(delta):
    
     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):
        animation.play("tancong")
    
    chuyendong.y += trongluc 
    chuyendong.normalized()
    chuyendong = move_and_slide(chuyendong,Vector2.UP)

Trên đoạn code trên mình vừa thêm vào 2 dòng cơ bản để bạn có thể chạy Animation tấn công và mình đảm bảo chắc sẽ có nhiều bạn nghĩ nó hoạt động nhưng thực chất là KHÔNG đoạn code trên sẽ không thể hoạt động.

Nếu như bạn nhấn phím J để chạy animation tấn công thì sẽ không thể vì là animation hiện tại đang được sử dụng và animation sử dụng nó là dungyen.

var dangtancong = false
func _physics_process(delta):
    
    if !dangtancong:
        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():
        dangtancong = true
        chuyendong.x = 0
        animation.play("tancong")
    
    chuyendong.y += trongluc 
    chuyendong.normalized()
    chuyendong = move_and_slide(chuyendong,Vector2.UP)

Và mình sẽ có đoạn code trên.

Ở đây mình tạo 1 biến mới là  var dangtancong= false biến này dùng để xác định rằng mình có đang thực hiện việc tấn công hay không

Mình bỏ toàn bộ đoạn di chuyển vào nhảy trong if !dangtancong: là vì mình sẽ kiểm tra nếu như mình đang không tấn công thì có thể di chuyển bình thường còn nếu đang tấn công thì code bên trong không chạy và bạn sẽ không thể di chuyển hay chạy trong khi đang tấn công.

Ở  dòng if Input.is_key_pressed(KEY_J) and is_on_floor(): :

+ Mình thêm is_on_floor() là để muốn chắc chắn rằng mình không thể tấn công khi đang nhảy.

+ mình sẽ set dangtancong thành true để báo hiệu mình đang thực hiện anim tấn công.

+ mình để chuyendong.x = 0 là để dừng lại và thực hiện anim tấn công, bạn không thể vừa chạy mà vừa tấn công được.

Khi tới đây mình còn thiếu 1 thứ đó là đưa biến dangtancong về false khi kết thúc animation tấn công.

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

 

Mình sẽ có thêm 1 hàm nữa và hàm này được kết nối signal từ node AnimatedSprite

 

extends KinematicBody2D

var tocdo = 200
var trongluc = 10
var chuyendong = Vector2()
var huong_dichuyen = 1
onready var animation = $AnimatedSprite
var dangtancong = false
func _physics_process(delta):
    
    if !dangtancong:
        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():
        dangtancong = true
        chuyendong.x = 0
        animation.play("tancong")
    
    chuyendong.y += trongluc 
    chuyendong.normalized()
    chuyendong = move_and_slide(chuyendong,Vector2.UP)


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

 

Vậy mình sẽ có toàn bộ code là như trên.

Đây là kết quả cuối cùng

Tổng Kết

Ở phần tiếp, mình sẽ hướng dẫn bạn cách để có thể thiết lập tấn công trên kẻ thù.

 

Đánh giá post
Exit mobile version