Godot-CharacterBody2D

基本的 CharacterBody2D 應該如下

Player(CharacterBody2D) ← 角色根節點
├── AnimatedSprite2D     ← 動畫控制
├── CollisionShape2D     ← 碰撞框
├── Camera2D             ← 攝影機跟隨
├── Sprite2D             ← 顯示角色外觀
└── Script (player.gd)   ← 控制邏輯

事前準備

需要到 https://brackeysgames.itch.io/brackeys-platformer-bundle 下載素材。

下載完成後解壓縮放到專案資料夾中。(我順便新命名為 /assets )

CharacterBody2D

CharacterBody2D 通常是作為一個玩家角色的一個根節點,其特色就是 支援碰撞與移動邏輯,通常運用在玩家或者敵人上。

AnimatedSprite2D

通常在角色上面,都會有動畫存在,而不是一個呆板的圖片在畫面上移動.而 AnimatedSprite2D 就是要讓 CharacterBody2D 可以顯示出一個有動畫效果的人物在遊戲畫面上。其最大特色就是可以逐幀控制動畫的呈現,例如角色待機 跳躍 或者受傷。

圖是一張腳色的動畫圖檔,分別代表主角的

  • 待機
  • 移動
  • 翻滾
  • 擊中
  • 死亡
  1. CharacterBody2D 底下增加 AnimatedSprite2D
  2. AnimatedSprite2D 右側屬性欄中 ‘Animation’ 設定 ‘Sprite Frama’ 選擇 ‘新增 Sprite Frama’
  3. 底下會多出 ‘Sprite Frama’,再點選下方工具欄中的 ‘9宮格’ 按鈕
  4. 點開後再選取素材包 knight.png 圖檔
  5. 挑整正確的Frama大小
  6. 選取要輪播的Frama後

根據上述動作就可以出現下圖的效果,一個玩家腳色出現畫面上。按下播放還有動畫呈現,他會根據上圖選的順序依序輪播,如果速度太慢可以設定FPS 讓動畫跑的快慢。

紅圈中是讓他可以無限循環播放。

如果覺得畫面糊糊的,是因為專案預設的 ‘紋理’ 預設為 ‘線性’。需要做更改

重新設定紋理就好。

CollisionShape2D

這時應該會注意到為何有警告圖示,是因為沒有再 CharacterBody2D 增加碰撞行為。這樣的節點就無法跟場景中其他節點進行互動。

只要在 CharacterBody2D 底下新增 CollisionShape2D ,並在屬性的 Shape 設定想要的碰撞範圍就好。

上圖我用矩形作為碰撞設定範圍,並挑整到跟騎士身體一樣。這樣警告就會消失掉。

之後我們要為這個 CharacterBody2D 增加移動腳本,可以使用內建的 godot script 腳本達到這點。

對 主節點 點下 附加節點腳本,之後確定選在樣板的 Basic Movement,順版把腳本統一管理在一個資料夾下,這樣Player節點就差不多告一段落,切換至主場景中,並把玩家節點拖曳到主場景下。

Camera2D

因為畫面執行後太小,我們要加上一個 Camera2D

Camera2D 是一個 2D 攝影機,用來追蹤角色或場景中的其他物件,讓畫面跟著它移動。

  • 跟著玩家移動: 橫向捲軸遊戲:角色走動時,畫面會跟著移動
  • 限制鏡頭範圍: 地圖邊緣不超出畫面
  • 攝影機效果: 搖晃、縮放、平滑跟隨

例如: 這樣攝影機會自動跟隨玩家

Player(CharacterBody2D)
└── Camera2D(附在角色上)

在主世界下增加 Camera2D ,之後在旁邊屬性面板挑整 Zoon。

這時候如果執行,會發現玩家會掉下去,這是因為沒有設定好世界邊界

StaticBody2D

為了不讓腳色無限往下掉,所以要加入一個水平的世界邊界。

StaticBody2D 是 Godot 中用來建立 靜止、不會移動,但可以發生碰撞 的物件,例如:

  • 地面
  • 牆壁
  • 平台
  • 障礙物

它是 靜態物理物件,意思是它不會自己移動,但別的角色(例如 CharacterBody2DRigidBody2D)可以碰到它、被它擋住或在上面站立

要在主世界增加一個 StaticBody2D,並且要對這個節點增加一個碰撞節點 CollisionShape2D ,並且在碰撞屬性中設定 WorldBoundaryShape2D。

這樣運行時就不會無限掉下去,同時因為剛剛在 Player下的腳本,我們可以用鍵盤上下左右 空白建 執行。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *