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

Ở 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[Tạo 2D Platformer Game với Godot] Phần 4: Thiết kế nhân vật

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.

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

Sau khi chọn xong các bạn căn chỉnh lại cho đều.[Tạo 2D Platformer Game với Godot] Phần 4: Thiết kế nhân vật 40

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.

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

Như trên.

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.[Tạo 2D Platformer Game với Godot] Phần 4: Thiết kế nhân vật 52

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é

 

 

Previous Post Next Post