Giao diện “thân thiện” người dùng và ngôn ngữ tập lệnh trực quan của Godot, GDScript khiến quá trình tạo kẻ thù cho game trở nên đơn giản & thú vị. Dưới đây là hướng dẫn chi tiết.
Kẻ thù đóng vai trò quan trọng trong việc làm game hấp dẫn với những thử thách cuốn hút người chơi. Dù bạn đang tạo một game platformer 2D, bắn súng từ trên xuống dưới hay game nhập vai, thêm kẻ thù có thể nâng cao đáng kể trải nghiệm chơi.
Thiết lập game Godot
Trước khi đi sâu vào sáng tạo kẻ thù, hãy thiết lập cấu trúc cơ bản của game 2D trong công cụ game Godot.
Tạo dự án 2D mới trong Godot. Ở cảnh chính, tạo một node KinematicBody2D mới và đặt tên nó là Player. Bên trong node người chơi, thêm CollisionShape2D cùng một hình chữ nhật - đại diện cho hitbox của người chơi. Ngoài ra, thêm một node Sprite làm đại diện trực quan của nhân vật người chơi.
Gắn code GDScript sau vào node Player để kích hoạt chuyển động cơ bản:
extends KinematicBody2D
const SPEED = 200
func _physics_process(delta):
var motion = Vector2.ZERO
if Input.is_action_pressed("ui_right"):
motion.x += SPEED
if Input.is_action_pressed("ui_left"):
motion.x -= SPEED
if Input.is_action_pressed("ui_down"):
motion.y += SPEED
if Input.is_action_pressed("ui_up"):
motion.y -= SPEED
motion = move_and_slide(motion)
Với code này, người chơi có thể di chuyển sang trái, phải, lên và xuống bằng các phím mũi tên hoặc phím WASD.
Tạo một kẻ thù đơn giản
Giờ bạn đã thiết lập nhân vật người chơi, bạn có thể tạo một kẻ thù đơn giản.
Tạo một cảnh mới và thêm node StaticBody2D tên Enemy. Bên trong node Enemy, thêm node CollisionShape2D với một hình tròn để xác định hitbox của kẻ thù. Ngoài ra, thêm một node Sprite đại diện trực quan kẻ thù.
Với va chạm được thiết lập, kẻ thù đã sẵn sàng tương tác với người chơi và nhân tố khác trong thế giới game.
Làm kẻ thù đi theo người chơi
Làm kẻ thù đi theo người chơi sẽ thêm một cấp độ thử thách mới cho game.
Tạo một cảnh mới cho kiểu kẻ thù sau và thêm node KinematicBody2D tên FollowEnemy với CollisionShape2D. Gắn code GDScript sau vào node FollowEnemy để nó theo chân người chơi:
extends KinematicBody2D
const SPEED = 100
func _physics_process(delta):
var player = get_parent().get_node("Player")
var player_position = player.global_position
var enemy_position = global_position
var direction = player_position - enemy_position
direction = direction.normalized()
var motion = direction * SPEED * delta
move_and_collide(motion)
Giờ, FollowEnemy sẽ di chuyển hướng tới vị trí của người chơi trong từng khung hình.
Thêm đạn của kẻ thù
Giờ bạn có thể làm đạn bắn của kẻ thù bay về phía người chơi. Tạo một cảnh mới và đặt tên nó là Bullet.tscn. Thêm node KinematicBody2D vào cảnh này. Gắn tập lệnh Bullet.gd vào node KinematicBody2D trong cảnh Bullet.tscn. Thêm code sau để xác định class Bullet:
extends KinematicBody2D
const BULLET_SPEED = 300
var bullet_direction = Vector2.ZERO
func _physics_process(delta):
var motion = bullet_direction * BULLET_SPEED * delta
move_and_collide(motion)
func set_direction(direction):
bullet_direction = direction.normalized()
Giờ tạo một node mới cho kẻ thù với những viên đạn và đặt tên ShootingEnemy cho nó. Bên trong node ShootingEnemy, thêm node CollisionShape2D với một hình chữ nhật làm hitbox.
Gắn node GDScript sau làm node ShootingEnemy để nó bắn đạn:
extends KinematicBody2D
const SPEED = 100
const SHOOT_DELAY = 1.5
var shoot_timer = SHOOT_DELAY
# Nhập cảnh bắn đạn
const BulletScene = preload("res://Bullet.tscn")
func _physics_process(delta):
# Logic bắn đạn
shoot_timer -= delta
if shoot_timer <= 0:
shoot_timer = SHOOT_DELAY
var bullet_instance = BulletScene.instance()
bullet_instance.global_position = global_position
bullet_instance.set_direction(direction)
get_parent().add_child(bullet_instance)
Kẻ thù này giờ sẽ bắn đạn theo định kỳ về phía vị trí của người chơi. Dùng một lệnh điều kiện if để kiểm tra xem shoot_timer có nhỏ hơn 0 hay không. Nếu đúng, hãy bắn đạn.
Di chuyển kẻ thù ngẫu nhiên
Ngoài kẻ thù theo dõi hoặc bắn người chơi, một kẻ thù di chuyển ngẫu nhiên có thể đưa yếu tố khó đoán và thách thức vào game. Tạo kẻ thù bằng các mẫu di chuyển ngẫu nhiên cần một kết hợp tạo logic đơn giản và số ngẫu nhiên.
Bắt đầu bằng cách tạo một cảnh mới và thêm node KinematicBody2D tên RandomEnemy. Tạo một tập lệnh mới tên RandomEnemy.gd, rồi gắn nó vào node RandomEnemy. Tập lệnh này sẽ xử lý logic chuyển động ngẫu nhiên.
extends KinematicBody2D
const MOVE_SPEED = 100
const MOVE_INTERVAL_MIN = 1.0
const MOVE_INTERVAL_MAX = 3.0
var move_timer = 0.0
var move_interval = 0.0
var move_direction = Vector2.ZERO
func _ready():
choose_new_direction()
func choose_new_direction():
move_interval = rand_range(MOVE_INTERVAL_MIN, MOVE_INTERVAL_MAX)
move_timer = move_interval
move_direction = Vector2(randf(), randf()).normalized()
func _physics_process(delta):
move_timer -= delta
if move_timer <= 0.0:
choose_new_direction()
var motion = move_direction * MOVE_SPEED * delta
move_and_collide(motion)
Bổ sung thêm tính năng
Bạn có thể thêm các tính năng bổ sung cho kẻ thù để gameplay thú vị hơn. Chẳng hạn như:
- Các cuộc chiến đấu boss
- Hệ thống xuất hiện kẻ thù năng động
- Kẻ thù có thể thích nghi với môi trường
- Điểm yếu và tính đối kháng của kẻ thù
- Tùy biến kẻ thù và các biến thể của hành vi
Khi tạo kẻ thù trong game được phát triển bằng Godot, hãy cân nhắc những yếu tố sau:
- Giao tiếp bằng hình ảnh rõ ràng
- Cân bằng độ khó
- Tránh những cách bắn đạn đơn giản
- Bổ sung chơi thử và lặp lại để đánh giá độ thú vị & khó
- Hiệu ứng âm thanh hấp dẫn
Trên đây là cách tạo kẻ thù trong game Godot. Hi vọng bài viết hữu ích với các bạn.