Làm game platformer 2D với Godot 4: nhân vật chạy và nhảy bằng GDScript

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Godot là game engine mã nguồn mở, nhẹ và rất thân thiện với người mới. Trong bài này bạn sẽ dựng một nhân vật 2D biết chạy, nhảy và chịu trọng lực bằng node CharacterBody2D và ngôn ngữ GDScript, chỉ với vài chục dòng code.

Vì sao nên thử Godot

Godot có dung lượng nhỏ, không cần cài đặt phức tạp (bản tải về là một file chạy trực tiếp) và hoàn toàn miễn phí. Hệ thống node và scene giúp bạn chia game thành các khối nhỏ dễ tái sử dụng. GDScript có cú pháp gần giống Python nên người từng học Python sẽ làm quen nhanh.

Bước 1: Tạo project và scene nhân vật

  1. Mở Godot 4, chọn New Project, đặt tên và chọn thư mục.
  2. Tạo scene mới, chọn Other Node và thêm CharacterBody2D làm gốc, đổi tên thành Player.
  3. Thêm node con Sprite2D (kéo hình icon.svg có sẵn vào ô Texture để thử) và node con CollisionShape2D với hình dạng RectangleShape2D vừa với sprite.
  4. Lưu scene thành player.tscn.

Bước 2: Viết script di chuyển

Chọn node Player, bấm biểu tượng thêm script và tạo file player.gd. Nội dung dưới đây dùng các hàm có sẵn của Godot 4: Input.get_axis để đọc hướng, move_and_slide để di chuyển và xử lý va chạm.

extends CharacterBody2D

const SPEED = 300.0
const JUMP_VELOCITY = -450.0

var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")

func _physics_process(delta):
	# Trọng lực
	if not is_on_floor():
		velocity.y += gravity * delta

	# Nhảy
	if Input.is_action_just_pressed("ui_accept") and is_on_floor():
		velocity.y = JUMP_VELOCITY

	# Chạy trái/phải
	var direction = Input.get_axis("ui_left", "ui_right")
	if direction != 0:
		velocity.x = direction * SPEED
	else:
		velocity.x = move_toward(velocity.x, 0, SPEED)

	move_and_slide()

Một vài điểm cần nhớ. Trong Godot trục Y hướng xuống nên giá trị nhảy là số âm. GDScript dùng thụt lề (tab) để xác định khối lệnh. Các hành động ui_left, ui_right, ui_accept đã được định nghĩa sẵn (mũi tên và phím Space hoặc Enter), nên bạn chưa cần cấu hình thêm; sau này có thể tạo hành động riêng trong Project Settings > Input Map.

Bước 3: Dựng màn chơi và mặt đất

  1. Tạo scene mới với gốc là Node2D, đổi tên Level.
  2. Kéo player.tscn vào Level để thêm nhân vật.
  3. Thêm node StaticBody2D làm mặt đất, kèm CollisionShape2D hình chữ nhật dài và một ColorRect hoặc Sprite2D để nhìn thấy nó.
  4. Lưu thành level.tscn và nhấn F6 (chạy scene hiện tại), chọn đặt làm scene chính khi được hỏi.

Nếu nhân vật rơi xuyên mặt đất, hãy kiểm tra cả hai node đều có CollisionShape2D với hình dạng đã được gán, và vị trí nhân vật nằm phía trên mặt đất.

Bước 4: Thêm camera đi theo

Thêm node Camera2D làm con của Player. Camera sẽ tự bám theo nhân vật. Bạn có thể bật tùy chọn làm mượt chuyển động (Position Smoothing) trong Inspector để cảm giác chuyển cảnh êm hơn.

Bước 5: Lật hướng nhân vật

Để nhân vật quay mặt theo hướng chạy, thêm vài dòng vào cuối hàm _physics_process trước move_and_slide():

	if direction != 0:
		$Sprite2D.flip_h = direction < 0

Ký hiệu $Sprite2D là cách viết tắt để lấy node con theo tên. Nếu đổi tên node, nhớ sửa lại ở đây.

Lỗi thường gặp

  • Nhân vật không nhúc nhích: kiểm tra script đã gắn đúng node và hàm tên _physics_process viết chính xác.
  • Báo lỗi thụt lề: không trộn lẫn dấu cách và tab trong cùng một file.
  • Nhảy được liên tục trên không: đảm bảo điều kiện is_on_floor() có trong lệnh nhảy.
  • Va chạm lạ: kiểm tra kích thước CollisionShape2D có khớp sprite không.

Kết luận

Chỉ với một scene và một script, bạn đã có nền tảng cho game platformer. Tiếp theo hãy thử thêm TileMap để vẽ màn chơi, AnimatedSprite2D để làm hoạt ảnh, và node Area2D để làm đồng xu hay bẫy.

Nếu bạn muốn học làm game từ cơ bản đến hoàn chỉnh theo lộ trình có hướng dẫn, hãy xem các khóa học game tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment