Chào mừng các bạn đến với bài 3 trong series lập trình game RPG với Godot :3
| Tham gia kênh Telegram của AnonyViet 👉 Link 👈 |
Okay , thì trong bài này mình sẽ hướng dẫn các bạn tấn công với animation player & Hitbox & Hurtbox và Object với Godot
Và chúng ta cùng bắt đầu thôi
Tấn Công
Chúng ta sẽ tạo 1 cái Sence mới để làm Hitbox để kiểm tra khi chúng ta tấn công và hurtbox để kiểm tra khi cái hitbox nó va chạm thì mất máu.
Hitbox & HurtBox
Tạo cái Hitbox và nút gốc là Area2D rồi sau đó thêm cái CollisionShape2D là được.
![[Godot RPG] #3: Tấn Công & Object 36 [Godot RPG] #3: Tấn Công & Object 35](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-18-45.png)
Rồi tạo script mới
![[Godot RPG] #3: Tấn Công & Object 37 [Godot RPG] #3: Tấn Công & Object 36](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-19-35.png)
Ở đây mình sẽ dùng biến export để xuất ra ngoài Inspector cho dễ điều chỉnh cho từng nhân vật. bạn có thể chỉnh ngôn ngữ ở ngoài giao diện của Godot sang tiếng việt cho dễ
![[Godot RPG] #3: Tấn Công & Object 38 [Godot RPG] #3: Tấn Công & Object 37](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-20-10.png)
Rồi lưu lại là xong.
Rồi tạo cái Sence mới là HurtBox sau đó lưu lại như Hitbox thôi và không cần tạo script vì chúng ta sẽ kết nối tín hiệu đến player
![[Godot RPG] #3: Tấn Công & Object 39 [Godot RPG] #3: Tấn Công & Object 38](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-21-04.png)
Nhấn rồi đánh
Chúng ta phải check nếu như nhấn vào thì tấn công chứ. Bạn có thể Edit cái Input nếu lười thì sử dụng như ảnh :vv. Godot có nhiều lựa chọn mà!
![[Godot RPG] #3: Tấn Công & Object 40 [Godot RPG] #3: Tấn Công & Object 39](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-54-26.png)
Rồi sau đó trạng thái sẽ bằng ATTACK.
Ở ATTACK: chúng ta sẽ tạo 1 hàm mới là trangthai_attack sẽ có code chạy animtion attack
![[Godot RPG] #3: Tấn Công & Object 41 [Godot RPG] #3: Tấn Công & Object 40](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-05-00-04.png)
Rồi tiếp theo các bạn gọi nó trên chỗ ATTACK: nhé.
Sau đó khi tấn công chúng ta phải set speed = 0 để khi tấn công nó sẽ không di chuyển
![[Godot RPG] #3: Tấn Công & Object 42 [Godot RPG] #3: Tấn Công & Object 41](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-05-01-12.png)
Sau khi tấn công xong nó sẽ đứng yên vì nó chưa về trạng thái IDLE vậy nên chúng ta phải set nó về.
Mình sẽ tạo 1 hàm mới
![[Godot RPG] #3: Tấn Công & Object 43 [Godot RPG] #3: Tấn Công & Object 42](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-05-03-42.png)
Sau đó ở AnimationPlayer > Animation AtTACk > thêm track method(đây là track sẽ chạy hàm Godot có cái này tiện vl :3)
![[Godot RPG] #3: Tấn Công & Object 44 [Godot RPG] #3: Tấn Công & Object 43](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-05-04-18.png)
Sau đó chọn Player vì Player mới có code mà chạy:D
![[Godot RPG] #3: Tấn Công & Object 45 [Godot RPG] #3: Tấn Công & Object 44](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-05-04-27.png)
Rồi chọn hàm
![[Godot RPG] #3: Tấn Công & Object 46 [Godot RPG] #3: Tấn Công & Object 45](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-05-06-02.png)
Rồi chỉnh lại cho về cuối vì khi kết thúc animation = chạy hàm
![[Godot RPG] #3: Tấn Công & Object 47 [Godot RPG] #3: Tấn Công & Object 46](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-05-06-13.png)
Và vậy là các bạn sẽ di chuyển bình thường lại
Instance & Animation Player
Tiếp theo chúng ta sẽ Instance nó trong Godot. Instance mình cũng chả biết gọi tiếng việt là gì nữa@@.
Sau đó nhấn add 2 cái Hitbox & Hurtbox sau đó nhấn chuột phải vô 2 cái nhấn Editable as children để chúng ta có thể điều chỉnh nó như 1 nút con và để set collishape luôn.
![[Godot RPG] #3: Tấn Công & Object 48 [Godot RPG] #3: Tấn Công & Object 47](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-23-54.png)
À trước đó, chúng ta phải set mask/layer đã. Vô Project > Project Setting > 2D Render / 2D Physics
các bạn set như mình nhé. Set cho cả 2 cái 2D Render và 2D Physics
![[Godot RPG] #3: Tấn Công & Object 49 [Godot RPG] #3: Tấn Công & Object 48](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-26-03.png)
Rồi ở cái Hitbox của player ở bên bảng thuộc tính > collision thì mình sẽ bỏ tick trong cái Layer và ở cái Mask sẽ tick nó va chạm với Hurtbox_E tức là khi player tấn công nó sẽ va chạm với hurtbox của kẻ thù.
![[Godot RPG] #3: Tấn Công & Object 50 [Godot RPG] #3: Tấn Công & Object 49](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-26-58.png)
![[Godot RPG] #3: Tấn Công & Object 51 [Godot RPG] #3: Tấn Công & Object 50](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-26-50.png)
Rồi ở HurtBox Layer các bạn tick ở ô Hurtbox_P ở phần mask bỏ trống
![[Godot RPG] #3: Tấn Công & Object 52 [Godot RPG] #3: Tấn Công & Object 51](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-28-40.png)
Tiếp đến là chỉnh cái CollisionShape2D của HurtBox sao cho vừa với nhân vật .
![[Godot RPG] #3: Tấn Công & Object 53 [Godot RPG] #3: Tấn Công & Object 52](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-29-47.png)
Rồi tiếp đến sẽ set collisionshape2D của Hitbox với AnimationPlayer.
Ở Collisionshape2D của Hitbox thì nhấn vô cái khoá để add track nhanh
![[Godot RPG] #3: Tấn Công & Object 54 [Godot RPG] #3: Tấn Công & Object 53](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-31-41.png)
![[Godot RPG] #3: Tấn Công & Object 55 [Godot RPG] #3: Tấn Công & Object 54](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-31-54.png)
Sau đó bạn sẽ canh vị trí khi nào nó tấn công để tắt / bật.
Vì nó chưa tấn công nên mình sẽ để Disabled = trueở giây thứ 0 rồi check tiếp mấy giây tiếp theo nếu đến hành động tấn công thì set disable =false rồi sau khi rút kiếm về thì disabled = true
![[Godot RPG] #3: Tấn Công & Object 56 [Godot RPG] #3: Tấn Công & Object 55](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-33-41.png)
![[Godot RPG] #3: Tấn Công & Object 57 [Godot RPG] #3: Tấn Công & Object 56](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-34-58.png)
Rồi sau đó chạy lại sẽ thấy nó ổn và perfect :33. Mình thích cái này trong Godot cực
Object
Tiếp theo chúng ta sẽ tạo object với Godot.
Link tải: https://elthen.itch.io/pixel-art-destructible-objects
Tạo Sence mới
Ở đây thì tạo:
Area2D > Sprite – CollisionShape2D – AnimationPlayer
![[Godot RPG] #3: Tấn Công & Object 58 [Godot RPG] #3: Tấn Công & Object 57](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-38-18.png)
Ở sprite thì bỏ ảnh vô nhé và mình thấy hơi to các bạn set scale sao cho phù hợp nhé.
Vframes = 12
Hframes = 7
![[Godot RPG] #3: Tấn Công & Object 59 [Godot RPG] #3: Tấn Công & Object 58](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-41-01.png)
Mờ thì reimport lại nha.
![[Godot RPG] #3: Tấn Công & Object 60 [Godot RPG] #3: Tấn Công & Object 59](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-41-27.png)
Rồi tiếp theo ở AnimationPlayer tạo 2 animation là Hit và Destroy nhé. Hit là animation khi đánh vào và Destroy là animation khi bị phá huỷ.
Ở đây mình sẽ là cái Thùng bạn muốn đổi thì cũng được.
Hit : 7-9
Destory:10-13
Ở animation destroy mình sẽ áp dụng cái call method tương tự ở trên nha.
destroy() chứa câu lệnh queue_free()
![[Godot RPG] #3: Tấn Công & Object 61 [Godot RPG] #3: Tấn Công & Object 60](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-05-14-36.png)
Rồi sau đó tạo script mới. ở đây chúng ta không cần Hitbox hay Hurtbox vì cái thùng này nó đã là 1 nút area2d rồi.
chúng ta sẽ set collisionshape2D cho nó rồi kết nối tín hiệu. nhưng lưu ý nếu làm theo Nút area2D như mình sẽ có bất lợi khi player va chạm với nó. Nếu bạn dùng StaticBody để làm nó rồi thêm Hurtbox vào thì sẽ hoàn chỉnh tốt hơn.
Kết nối tín hiệu Area enterd nhé.
![[Godot RPG] #3: Tấn Công & Object 62 [Godot RPG] #3: Tấn Công & Object 61](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-04-49-11.png)
mình sẽ tạo biến hp = 10 để có căn mà căn khi player tấn công.
Rồi ở chỗ hàm tín hiệu thì mình sẽ kiểm tra nếu cái tên area = “Hitbox” thì hp sẽ bằng cái damage của area trừ đi hp. Cái print là mình dùng để kiểm tra hp xem có đánh vào chưa thôi Godot.
![[Godot RPG] #3: Tấn Công & Object 63 [Godot RPG] #3: Tấn Công & Object 62](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-05-08-42.png)
Rồi set cái Layer lại thành Hurtbox_E và bỏ chọn Mask là được.
![[Godot RPG] #3: Tấn Công & Object 64 [Godot RPG] #3: Tấn Công & Object 63](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-05-10-47.png)
Tiếp đó chúng ta cần kiểm tra nếu player tấn công thì sẽ chậynimation hit và khi hết máu chạy animation destroy
Ở đây mình sẽ hàm _process(): để kiểm tra mỗi giây nếu hp <= 0 thì sẽ chạy animation rồi tự huỷ
![[Godot RPG] #3: Tấn Công & Object 65 [Godot RPG] #3: Tấn Công & Object 64](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-05-12-39.png)
Rồi Tiếp đến để chắc ăn các bạn ở ANimation hit thì nhấn cái khoanh dưới ảnh đểkhi bắt đầu nó chạy animation hit chứko phải destroy nhé
![[Godot RPG] #3: Tấn Công & Object 66 [Godot RPG] #3: Tấn Công & Object 65](https://anonyviet.com/wp-content/uploads/2020/08/08-08-2020-05-16-07.png)
Lưu Ý: Object thì lúc đầu mình tạo ngu nên thông cảm :V. Khi chạy game Ọbject sẽ không va chạm được với player nếu muốn bạn phải chỉnh lại thành StaticBody2D hoặc KinematicBody2D rồi add hurtbox > kết nối tín hiệu rồi áp dụng code như trên là được.
Hẹn gặp bạn vào bài sau của Series lập trình game RPG với Godot
Câu hỏi thường gặp
Làm thế nào để tạo Hitbox và Hurtbox trong Godot?
Tạo hai Scene mới: Hitbox và Hurtbox. Mỗi Scene sử dụng Area2D làm node gốc và thêm CollisionShape2D để định hình vùng va chạm. Hitbox cần script để xử lý logic va chạm, trong khi Hurtbox không cần script, chỉ cần kết nối tín hiệu với Player.
Cách thiết lập Layer và Mask để Hitbox và Hurtbox tương tác chính xác?
Trong Project Settings > 2D Physics và 2D Render, đặt Layer và Mask cho Hitbox và Hurtbox sao cho chúng tương tác đúng. Ví dụ, Hitbox của player có Mask là Hurtbox_E (Enemy Hurtbox), và Hurtbox của enemy có Layer là Hurtbox_E.
Tôi có thể thêm hiệu ứng phá hủy vật thể như thế nào?
Tạo một Scene mới với Area2D, Sprite, CollisionShape2D và AnimationPlayer. Nhập ảnh động phá hủy vào Sprite và tạo hai animation: “Hit” và “Destroy” trong AnimationPlayer. Sử dụng tín hiệu va chạm để kích hoạt animation “Hit” và “Destroy” tương ứng.

![[Tạo 2D Platformer Game với Godot] Phần 29: Lưu và load dữ liệu game 68 [Tạo 2D Platformer Game với Godot] Phần 29: Lưu và load dữ liệu game 66](https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-04-43-13-120x86.png)
![[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 69 [Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 67](https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-01-02-39-120x86.png)
![[Tạo 2D Platformer Game với Godot] Phần 27: Mở khoá level 70 [Tạo 2D Platformer Game với Godot] Phần 27: Mở khoá level 68](https://anonyviet.com/wp-content/uploads/2021/11/24-11-2021-12-17-23-120x86.png)

![[Tạo 2D Platformer Game với Godot] Phần 29: Lưu và load dữ liệu game 72 [Tạo 2D Platformer Game với Godot] Phần 29: Lưu và load dữ liệu game 69](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 73 [Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 70](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 74 [Tạo 2D Platformer Game với Godot] Phần 27: Mở khoá level 71](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 76 [Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 73](https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-11-13-02.png)




