Tiếp theo với series lập trình game với godot hôm nay mình sẽ hướng dẫn các bạn bài tiếp theo đó là Trọng Lực, Bề mặt di chuyển và Nhảy.
Tham gia kênh Telegram của AnonyViet 👉 Link 👈 |
À trước khi làm thì nếu các bạn muốn mở lại sence đang làm giờ thì tìm dưới phần FileSystem và click đúp vào sence mà bạn đã lưu lúc trước và của mình lưu ở đây là World.tscn
Bề Mặt Di Chuyển: Bề mặt di chuyển chính là phần mà chúng t để nhân vật mình di chuyển trên đó có thể nói nó giống như mặt đường để con người chúng ta đi.
Để tạo bề mặt các bạn làm như mình và đây chỉ là cái cơ bản của cơ bản thôi nhé nếu muốn tạo bề mặt di chuyển như những game khác thì người ta gọi đó là tilemap và tileset mình sẽ hướng dẫn ở bài sau:
Tạo Node StaticBody2D dưới quyền của World
Ở StaticBody mình sẽ đổi tên lại thành floor (click đúp vào để đổi tên) và mình cũng đổi tên KinematicBody thành Player nhé.
Và cũng như ở Node Player mình sẽ tạo 2 Node là Sprite: hình ảnh cho floor và Collsion
Collsion ở đây thì giải thích rất rất khó nên mình giải thích sơ sơ cho các bạn nào hiểu được thôi. VD:
Khi mà bạn tạo 1 sprite mà không có collsion thì nó chỉ là một hình ảnh, một hình ảnh được vẽ lên. Nếu bạn tạo 1 sprite + collsion thì nó có nghĩa là giống như là bạn dùng tay ép 1 cái bịch bóng vào tường thì nó sẽ xẹp xuống đó là khi chưa có collsion và khi có collsion thì giống như là bên trong cái bịch bóng có một cục gạch thì khi bạn ép bịch bóng có cục gạch bạn không thể ép nó được vì cục gạch nó cứng. Nói tổng quát là sprite là bộ da còn collsion chính là xương trong bộ da đó.
Hoặc cũng có thể hiểu collsion là cái khung để chống phần bên trong cho sprite hoạt động
Ở đây StaticBody2D được xử dụng cho chuyển động vật lý nếu bạn muốn xây dựng một cái bẫy, cầu, một thứ gì đó đứng yên hoặc chuyển động đều làm vật cản thì xài StaticBody2D.
Rồi các bạn cũng làm như Bài 1 với Node player như này:
Mình sẽ không hướng dẫn cụ thể mà các bạn phải nhớ qua từng bài thế mới đi lên được.
Ở floor các bạn nhấn vào sprite để ý phần bên phải dưới CanvasItem thì nhấn vô Visiable > chọn Modulate và chỉnh lại màu thành màu bất kì.
Ở đây mình đổi thành màu đen
Và như ảnh trên các ban có thể thấy rằng sprite đã đổi thành màu đen nhưng mà cái collsion nó lại đè lên sprite thì các bạn đổi vị trí collsion lên trên sprite hoặc là nhấn vào cái mắt ở bên phải collsion để ẩn nó và khi ẩn các bạn không cần lo vì nó chỉ ẩn thôi chứ không làm gì đâu.
Và các bạn khóa nó lại như Node Player:
À ở cuối bài mình sẽ để các nút zoom bằng bàn phím cho bạn nào xài laptop không có chuột hoặc là nút cuộn chuột bị hư như mình.
Và chọn floor các bạn để ý cho mình 2 phần mình đã khoanh tròn trong ảnh
Cái bên trái màu trắng đậm là nó hiển thị grid (mấy cái ô vuông vuông như pixel á).
Ở đây thì grid này nó hơi nhỏ nên mình sẽ zoom lên
Để zoom lên các bạn nhấn 3 dấu chấm bên cạnh:
Chọn cái cuối cùng là Configure Snap. Đổi Gird Step thành 32-32
Và được như ảnh:
Các bạn có thể di chuyển cái floor nhưng có thể thấy nó không có vô đúng ô vì vậy Godot đã cho chúng ta thêm một chức năng nữa đó là di chuyển theo pixel.
Ở cái bên cạnh cái bật pixel các bạn nhấn vô floor rồi bật nó lên:
Khi đó floor của chúng ta sẽ di chuyển theo pixel
Và các bạn đặt nó xuống để làm sàn di chuyển nhé
Dưới ảnh các bạn để ý kĩ thì thấy 1 cái ô màu xanh nước biển thì cái ô đó chính là màn hình của chúng ta các bạn nhớ đặt floor bên trong cái ô này nhé.
Ở đây mình tạo thêm 1 cái Node tên là wall và ở đó chứa floor và floor mình đổi thành 01
Các bạn đặt vị trí cho floor rồi nhấn vào cái 01 nhấn tổ hợp Ctrl + D nó sẽ nhân đôi ra và ở cái chỗ của floor 01 các bạn kéo ra là được không hiểu thì nhìn ảnh:
Đã nhân đôi
Bây giờ kéo ra
Nó sẽ ra 2 cái
Vậy là được 2 cái các bạn có thể làm liên tục để tạo sàn di chuyển dài hơn
Nhưng trước khi tạo sàn các bạn cần phải check cho mình collsion có bằng nhau hay không để check các bạn bật collsion của 01 và 02 lên
Như của mình thì nó chưa khít lắm nhưng player vẫn di chuyển ngon lành. Nếu của các bạn lệch thì chỉnh lại cho phẳng là được nhé.
Bây giờ tạo ra nhiều cái,
Mình đã tạo xong nhé:
Chạy chương trình các bạn sẽ thấy như này:
Nhìn nó khá xấu nhỉ? Nhưng đừng lo các bạn chỉ học cái cơ bản để làm nó thôi và đây chỉ là bài hướng dẩn , nhưng bài đầu thôi những bài sau sẽ hướng dẫn các bạn tạo 1 player và một tilemap hoàn chỉnh à và cả background, enemy nữa chứ.
Các bạn có thể di chuyển nó xuống và sẽ thấy nó sẽ bị cản bởi floor
Và vậy là các bạn đã tạo xong Bề mặt di chuyển rồi nhé tiếp theo là Trọng Lực.
Trọng Lực:
Nói đến trọng lực thì ai mà chả biết nhỉ 😀 thứ giúp chúng ta di chuyển dễ dàng.
Để tạo trọng lực thì các bạn vô phần script của player.
Khai báo biến:
Khai báo thêm 1 biến trọng lực gán nó bằng 20
Ở physics code cho mình như sau
Chuyendong chính là thứ giúp chúng ta di chuyển theo trục tọa độ x, y: Y là xuống-lên, X là phải-trái.
ở đây chuyendong.y nghĩa là dùng biến chuyendong gọi trục y vì lúc chúng ta khai báo chuyendong = Vector2()
nghĩa là chuyendong đã được phép sử dụng trục x, y và ở đây chúng ta gọi trục y di chuyển xuống bằng chuyendong| chuyendong.y += tocdo có nghĩa là chuyendong.y = chuyendong + trongluc
và nó có nghĩa là khi chuyendong trục y + với trongluc đang là 20 thì nó sẽ di chuyển xuống dưới với 20 lần trọng lực.
Và chạy game:
Chúng ta sẽ thấy nó rớt xuống và Cái Collsion của Floor nó là vật cản cho player của chúng ta không cho player rơi xuống
Nếu phần di chuyển của bạn giống như mình:
Thì bạn sẽ thấy không thể di chuyển lên được khi nhấn mũi tên lên
Và tiếp theo là nhảy.
Nhảy
Để Code phần nhảy thì các bạn sẽ code như mình.
Xóa phần if input up và if input down đi
Và đổi
if input ui_left thành > elif input.is_action ui_left
Và code thêm 1 phần else:
else:
Chuyển động trục x bằng 0|| = 0 chứ không phải là += nhé (mình sẽ viết như này để các bạn hiểu và code nó và cũng như cải thiển khả năng code của các bạn)
Sau khi code các bạn nhấn F6 chạy game sẽ thấy nó có thể di chuyển sang phải sang trái và sau khi ngừng di chuyển sẽ đứng im.
Tiếp đến phần jumping.
Khai báo cho mình một biến là:
Nhaycao và gán nó bằng -500
Tại sao lại gán nó bằng -500 đơn giản là vì khi các bạn tạo biến trọng lực thì player của chúng ta sẽ rơi xuống theo trục y đúng không? Vậy ở đây chúng ta gán -500 là nó sẽ di chuyển lên trên ngược chiều với trọng lực khi nhảy đến độ cao nhất định vì trongluc luôn luôn được gán bằng 20 nên sau khi nhảy xong nó sẽ ép player của các bạn xuống.
Các bạn khai báo thêm cho mình 1 biến UP = Vector2(0, -1)
Biến UP này là biến giúp bạn có thể nhảy lên 0, -1 || 0 là trục x, -1 là trục y
Tiếp theo code cho mình phần như ảnh:
if is_on_floor
có nghĩa là khi bạn đang ở trên sàn (floor mà chúng ta đã tạo) và chỉ khi ở trên sàn nó mới thực hiện được.
if input ui_up
thì đọc mấy bài trước cũng biết rồi nhỉ
chuyendong.y += nhaycao
là: chuyendong gọi trục y và gán nó bằng biến nhaycao khi bạn nhấn phím mũi tên lên Và Khi gán nó sẽ nhảy lên vì sao? Thì mình đã giải thích ở phần khai báo biến nhaycao
À ở phần move_and_slide() thêm cho mình UP
Lưu Ý:
Một số lưu ý khi code:
Trong câu lệnh if bạn có thể để ý phần ký tự >| mờ bên phải câu lệnh đó là thứ sắp xếp các câu lệnh nhé
Nghĩa là câu lệnh if mà các bạn xuống dòng để code mà không có >| thì nó sẽ ko thực hiện vd như này là không thực hiện
>| if
>|Chuyendong = 0
Thì nó ko thực hiện được và báo lỗi
Còn nếu như này:
>| if
>| >| chuyendong = 2
Thì nó sẽ hoạt động nhé
Cách di chuyển sence và phím zoom cho ai hư con lăn chuột hoặc xài laptop:
- Ctrl + – (dấu – đó): zoom out
- Ctrl + +(dấu + đấy): zoom in
Nhấn chuột giữa để di chuyển xung quanh hoặc là chuột phải
Ở đây các bạn sẽ thấy 3 cái màu trắng
- Cái thứ 1(4 cái mũi tên đó): di chuyển Sprite
- Cái thứ 2: Quay cái Sprite hoặc nhấn Ctrl để quay
- Cái thứ 3: Phóng to hoặc thu nhỏ cái Sprite
Vậy là đã xong bài tiếp theo sẽ là Về Tilemap và Tileset sau đó sẽ đến bài chuyển động của nhân vật.
DeathGM!
extends KinematicBody2D
var chuyendong = Vector2()
var UP = Vector2(0,-1)
var Nhaycao = -500
var tocdo = 20
var trongluc = 20
func _physics_process(delta):
chuyendong.y += trongluc
if Input.is_action_pressed(“ui_right”):
chuyendong.x += tocdo
elif Input.is_action(“ui_left”):
chuyendong.x += -tocdo
else:
chuyendong.x = 0
if is_on_floor():
if Input.is_action_just_pressed(“ui_up”):
chuyendong.y += Nhaycao
chuyendong = move_and_slide(chuyendong,UP)
Anh có thể sửa giúp em được không ạ , của em chỉ sang trái phải và không dừng lại khi dừng thao tác và không thể nhảy ạ , em cảm ơn
Thanks Death GM.
haha nhưng nghe giải thích cái collsion tự nhiên cái thấy nó phức tạp dị thường 😀
T chỉ hiểu nó sẽ là thứ sẽ tạo ra va chạm, ai ngờ đọc xong cái giải thích cái đau đầu quá.