[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 SpriteCollishape 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)
Đánh giá post
Exit mobile version