[Tạo 2D Platformer Game với Godot] Phần 4: Thiết kế nhân vật

Chào mừng các bạn đến với bài hướng dẫn Office tiếp theo trong GOGOhalloween.  

Ở phần trước mình đã hướng dẫn các bạn thêm animation cho nhân vật và bài đó nó khá là dài.

Trong phần này mình sẽ hướng dẫn bạn cách thiết kế nhân vật, chúng ta sẽ thêm collision rồi sau đó code cho nó di chuyển rồi jump các kiểu nha.

CollisionShape

Đầu tiên, các bạn phải thêm cho mình CollisionShape2D


Các bạn nhấn vào CollisionShape2D bên bảng Inspector ở dòng Shape chọn [empty] -> chọn cái phù hợp vói nhân vật, ở trong trường hợp này là cái đầu tiên.

Sau khi chọn xong các bạn căn chỉnh lại cho đều.

Rồi các bạn nhấn Ctrl + S để save lại. Các bạn tạo cho mình thêm 1 thư mục mới tên là Scenes để lưu trữ các scene bằng cách chuột phải chọn new folder.



Như trên.


 

Sau đó tiến hành thêm Script vào cho nhấn vật.

Các bạn chọn đường dẫn lưu ở thư mục Scenes sau đó nhấn Create.


Và đây là giao diện Script của Godot.

Mình sẽ khai báo 4 biến là:

var tocdo = 200
var trongluc = 7000
var chuyendong = Vector2()
var huong_dichuyen

Và 4 biến có công dụng như tên của nó.

Tiếp đó mình sẽ code cho nó thêm như sau:

func _physics_process(delta):
    chuyendong.y = trongluc * delta
    huong_dichuyen = Input.get_axis("ui_left","ui_right")
    
    if huong_dichuyen != 0:
        chuyendong.x = lerp(chuyendong.x,huong_dichuyen * tocdo,0.5)
    else:
        chuyendong.x = lerp(chuyendong.x,0,0.1)
    
    chuyendong.normalized()
    move_and_slide(chuyendong,Vector2.UP)

Ở đây mình sẽ giải thích đoạn code này cho các bạn hiểu.

Mình sử dụng hàm _physical_process vì đây là hàm chuyên sử dụng các vấn đề liên quan tới vật lý.

Biến chuyendong mình đã khai báo nó là Vector2() mà Vector2() là 1 thư viện và nó hoạt động theo trục ox và oy.

Dòng chuyendong.y += trongluc * delta thì:

  • chuyendong.y tức là mình gọi trục y của biến chuyendong
  • mình sẽ + nó với biến trongluc là 500 mà trục y dương thì nó sẽ di chuyển xuống bên dưới.
  • còn * delta thì đây là biến đồng bộ hoá các khung hình để làm cho game của bạn luôn đồng bộ hoá các frame tránh hiện tượng các frame hiển thị nhanh hoặc chậm khi fps thấp hoặc bị gì đó.

Dòng huong_dichuyen = Input.get_axis(“ui_left”,”ui_right”) :

  • thì huong_dichuyen là biến mình dùng để xác định rằng mình đang nhấn phím nào và muốn con nhân vật mình di chuyển theo hướng đó
  • Input.get_axis(“ui_left”,”ui_right”) là mình sẽ gọiClass Input sau đó sử dụng hàm get_axis() để xác định rằng mình đang nhấn bên trái ( nếu nhấn bên trái nó trả về -1 ) hay phải ( nếu nhấn bên phải trả về 1) ( lưu ý: hàm get_axis() chỉ ở Godot 3.4 mới có nếu cũ hơn thì phải sài thủ công)

Dòng if huong_dichuyen != 0: :


  • Mình sẽ kiểm tra nếu như mình đang nhấn 1 phím nào đó tức là mình muốn nó di chuyển hướng mình nhấn thì nó sẽ thực hiện lênh di chuyển.
  • chuyendong.x thì chuyendong.x tức mình gọi trục x của nó ( vì game Platformer mà bạn chỉ di chuyển trái phải chứ không như Top Down cho nên sử dụng trục x thôi)
  • lerp(chuyendong.x,huong_dichuyen * tocdo,0.5) : lerp() là hàm trả về giá trị từ giá trị này cho đến tối đa giá trị kia ( lerp(from,to, weight)  weight là 1 giá trị đâu đó tùừ0 cho tới 1 ). Vây tức là mình sẽ gọi biến đầu tiên của hàm lerpchuyendong.x vì mình muốn nó di chuyển từ tốc độ hiện tại cho tới tốc độ tối đa nên mình sẽ để biến 2 là speed, còn biến thứ 3 thì tuỳ bạn đặt như nào cũng được trong phạm vi 0 tới 1.
  • còn huong_dichuyen * tocdo là để mình biết mình di chuyển hướng nào)

Dòng else: :

  • Thì mình kiểm tra nếu như không di chuyển nữa sẽ đứng im
  • Ở đây mình xài lerp là vì mình muốn tạo ra một ít ma sát trước khi đứng yên. Nếu như bạn không thấy điều gì khác biệt thì có thể đổi chuyendong.x = lerp(chuyendong.x,0,0.1) thành chuyendong.x = 0 để cảm nhận sự khác biệt nhé.

Hai dòng cuối:

  • chuyendong.normalized() là mình sẽ bình thường hoá nó lại.
  • move_and_slide(chuyendong,Vector2.UP) đây là hàm chỉ có trong các node Body và nó cho phép bạn di chuyển. Biến chuyển động bạn luôn đặt ở vị trí số 1, còn cái Vector2.UP được gọi là UP Direction và nó dùng để xác định vị trí của wall,floor, ceiling. Nếu bạn không để gì thì mọi thứ đều là wall ( sử dụng cho top down game) còn nếu bạn để Vector2.UP thì ở trên đầu bạn sẽ được xác định là trần và bên dưới là sàn ( thường thì platformer sẽ thêm cái này vào để bạn có thể làm nhân vật nhảy được).

Sau đó các bạn ra ngoài và thêm cho mình 1 biến Camera2D.

Và ở Camera2D -> Inspector thì bật current lên thì camera mới hoạt động.

Tiếp đó bạn sẽ tiến hành Instance scene player vào Map bằng các nhấn vào nút trên hình

Chọn Player.tscn sau đó nhấn Open.

Vậy là Player đã được Instance vào Scene Map

Sau đó nhấn F6 và nhấn nút mũi tên trái, phải để di chuyển và khi chạy game của mình nó sẽ như này.


Nếu bạn thấy camera chưa ổn thì có thể chỉnh ở phần Zoom nhé.

Tổng Kết

Vậy là đã xong phần 4 rồi, trong phần này mình đã hướng dẫn các bạn các làm cho nhân vật di chuyển và ở bài sau chúng ta sẽ làm cho nó nhảy lên và áp dụng animation vô nhé

 

 

Dưới đây là đường link video hướng dẫn cụ thể chi tiết từng phần mà chúng tôi đã bỏ thời gian ra làm và quay lại. Bạn hãy tải xuống và thực hiện như chúng tôi nhé!

📥 DOWNLOAD NOW

Related Posts

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *