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.
| Tham gia kênh Telegram của AnonyViet 👉 Link 👈 |
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é.
![[Tạo 2D Platformer Game với Godot] Phần 15: Thêm animation bị thương cho Player 7 [Tạo 2D Platformer Game với Godot] Phần 15: Thêm animation bị thương cho player](https://anonyviet.com/wp-content/uploads/2021/11/15-11-2021-10-55-19.png)
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.
![[Tạo 2D Platformer Game với Godot] Phần 15: Thêm animation bị thương cho Player 8 [Tạo 2D Platformer Game với Godot] Phần 15: Thêm animation bị thương cho Player 4](https://anonyviet.com/wp-content/uploads/2021/11/15-11-2021-11-07-19.png)
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.
Câu hỏi thường gặp
Tôi cần làm gì để thêm animation bị thương cho nhân vật?
Bạn cần thêm một animation mới tên là “bithuong” vào tài nguyên nhân vật của mình trong Godot. Sau đó, điều chỉnh code để khi nhân vật bị tấn công, animation này được phát.
Làm thế nào để ngăn nhân vật thực hiện hành động khác khi đang trong trạng thái bị thương?
Sử dụng một biến boolean (ví dụ: `bithuong`) để theo dõi trạng thái bị thương. Thêm điều kiện kiểm tra biến này vào các đoạn code xử lý di chuyển và tấn công của nhân vật.
Nếu animation bị thương kết thúc, điều gì xảy ra?
Code sẽ tự động đặt biến `bithuong` về `false`, cho phép nhân vật tiếp tục thực hiện các hành động khác như di chuyển và tấn công.





![[Tạo 2D Platformer Game với Godot] Phần 29: Lưu và load dữ liệu game 14 [Tạo 2D Platformer Game với Godot] Phần 29: Lưu và load dữ liệu game 7](https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-04-43-13.png)
![[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 15 [Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 8](https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-01-02-39-350x245.png)
![[Tạo 2D Platformer Game với Godot] Phần 27: Mở khoá level 16 [Tạo 2D Platformer Game với Godot] Phần 27: Mở khoá level 9](https://anonyviet.com/wp-content/uploads/2021/11/24-11-2021-12-17-23.png)
![[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 18 [Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 11](https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-11-13-02.png)




