[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn
Trong bài này mình sẽ hướng dẫn các bạn tạo nhân vật cho Shooter game với Godot nhé.
TẠO NHÂN VẬT
Trước hết các bạn tải art về nha.
Link: https://opengameart.org/content/animated-top-down-survivor-player
AnimatedSprite
Đầu tiên các bạn xoá cái Sprite đi rồi thêm cho mình lại node AnimatedSprite.
Rồi Tạo Frame mới
Rồi add cho mình
3 animation là : idle – move – shoot
Handgun – Rifle – Shotgun bạn có thể lấy ở trong
Kéo hết vô 3 cái nhé
Set CollisionShape2D lại nhé.
Code:
Tiếp đế là code. Chúng ta sẽ kiểm tra nếu như player di chuyển thì sẽ chạy animation move và đứng im chạy animation idle, bắn thì chạy animation shoot.
Tiếp theo vì đây là game bắn súng chúng ta phải để nhân vật nó xoay theo hướng chuột thì chúng ta có câu lệnh: look_at(get_global_mouse_position())
Tiếp theo set camera nhé nhìn cho dễ:
Thêm node camera2D ở Zoom chỉnh lại cho nó dễ nhìn nhé mấy bạn.
BẮN ĐẠN
Tiếp theo chúng ta sẽ tạo đạn để bắn piu piu
Link down: https://drive.google.com/file/d/1fr4xNtR-s5qS49G5N98in3oTVlVJyxAN/view?usp=sharing
Bạn tải về nhé.
Xong sau đó tạo sence mới
Nút gốc là Area 2D để kiểm tra khi bullet va chạm
CollisionShape2D
Sprite
Các bạn kéo cái ảnh viên đạn vào Sprite
Rồi set collisionShape2D luôn
Rồi đổi tên thành Bullet
Tạo Script mới
Ở đây mình sẽ thêm 1 hàm để viên đạn có thể spawn ở vị trí nào đó mà bạn muốn và Sát thương (damage)
func start_at(pos, dir): position = pos rotation = dir velocity = Vector2(speed, 0).rotated(dir)
position =pos : nghĩa là vị trí của cái viên đạn sẽ bác cái pos
rotation = độ xoay của viên đạn
Tiếp theo thì sẽ tạo 1 hàm để gán tốc độ cho viên đạn để nó có thể fly
func _physics_process(delta): position += velocity * delta
À các bạn nhớ quay 2 nút Sprite và Collishape sang ngang nhé nếu không muốn nó bắn dọc
Rồi tiếp theo chúng ta phải check xem nếu như viên đạn ra khỏi màn hình thì nó tự huỷ để không thể tích lại gây lag.
Rồi các bạn thêm nút VisibilityNotifier2D sau đó chỉnh sao chó ổn là được. Rồi sau đó connect tín hiệu screen_exit
(thoát khỏi màn hình)
Rồi ở câu đó chúng ta thêm câu lệnh : queue_free()
Rồi tiếp theo chúng ta sẽ bắn nó.
Trước đó bạn cần phải có sence của bullet để có thể add nó vào và dùng onready là khi chạy thì nó sẽ được load luôn
Rồi sau đó check nếu nhấn phím F nó sẽ bắn
get_parent().add_child(b)
: nghĩa là nó sẽ lấy bố mẹ rồi add_child tức là thêm cái nút đạn vào nếu có video thì mình sẽ minh hoạ dễ hơn.
b.start_at(global_position,rotation)
: global_position = vị trí của nhân vật, rotation là cái góc xoay.
Khi bắn bạn sẽ thấy nó xuất hiện ở giữa player, chúng ta cần phải chỉnh cho nó ra ngoài cây súng.Vậy thì làm như sau.
Bạn thêm nút Position2D rồi kéo nó vô chỗ mà bạn muốn viên đạn xuất hiện
Tiếp theo thì đơn giản thôi bạn chỉ cần thêm $Position2D vào trước cái global_position để spawn ở cái chỗ trên
Và nếu chạy thì bạn sẽ gặp trường hợp như ảnh
Và bài sau sẽ có cách fix
Code Player:
extends KinematicBody2D export var speed = 200 onready var bullet = preload("res://Canh/Bulet.tscn") func _physics_process(delta): look_at(get_global_mouse_position()) laydau_nhapvao(delta) func laydau_nhapvao(delta): var vector_dauvao = Vector2.ZERO vector_dauvao.x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left") vector_dauvao.y = Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up") vector_dauvao = vector_dauvao.normalized() if vector_dauvao != Vector2.ZERO: $AnimatedSprite.play("move") else: $AnimatedSprite.play("idle") var dichuyen = vector_dauvao * speed * delta if Input.is_key_pressed(KEY_F): shoot() dichuyen = move_and_collide(dichuyen) func shoot(): var b = bullet.instance() get_parent().add_child(b) b.start_at($Position2D.global_position,rotation)