Thủ Thuật

[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.[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 25

Rồi Tạo Frame mới

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 26

Rồi add cho mình

3 animation là : idle – move – shoot

Handgun – Rifle – Shotgun bạn có thể lấy ở trong

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 27

Kéo hết vô 3 cái nhé

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 28

Set CollisionShape2D lại nhé.

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 29

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.

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 30

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())

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 31

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.

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 32

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

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 33

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

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 34

Tạo Script mới

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 35

Ở đâ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

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 36

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

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 37

À 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)

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 38

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 39

Rồi ở câu đó chúng ta thêm câu lệnh : queue_free()

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 40

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

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 41

Rồi sau đó check nếu nhấn phím F nó sẽ bắn

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 42

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

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 43

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

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 44

Và nếu chạy thì bạn sẽ gặp trường hợp như ảnh

[Godot Shooter] #2: Tạo Nhân Vật & Bắn Đạn 45

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

Rất Hữu ích

RatHuuIch là Website chia sẻ miễn phí tất cả các kiến thức về công nghệ thông tin. RatHuuIch cung cấp mọi giải pháp về mạng máy tính, phần mềm, đồ họa và MMO.

Bài liên quan

Theo dõi
Thông báo của
guest

0 Góp ý
Phản hồi nội tuyến
Xem tất cả bình luận
Back to top button