[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ù.