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