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
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.
Rồi tạo script mới
Ở đâ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ễ
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
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à!
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
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
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
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)
Sau đó chọn Player vì Player mới có code mà chạy:D
Rồi chọn hàm
Rồi chỉnh lại cho về cuối vì khi kết thúc animation = chạy hàm
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.
À 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
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ù.
Rồi ở HurtBox Layer các bạn tick ở ô Hurtbox_P ở phần mask bỏ trống
Tiếp đến là chỉnh cái CollisionShape2D của HurtBox sao cho vừa với nhân vật .
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
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
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
Ở 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
Mờ thì reimport lại nha.
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()
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é.
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.
Rồi set cái Layer lại thành Hurtbox_E và bỏ chọn Mask là được.
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ỷ
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é
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