Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
建立內容
是時候來做一些讓玩家閃躲的敵人了。這些敵人的行為不會很複雜:怪物會隨機在螢幕的邊緣產生,接著隨機選一個方向來直線移動。
我們將建立一個 Mob 場景,隨後可通過對其進行 實例化 來在遊戲內生成任意數量的獨立怪物。
設定節點
點擊 [場景] -> [新增場景],然後新增下列節點:
RigidBody2D (設定名稱為
Mob)
別忘了設定子節點,使其無法被選中,就像你在“Player”場景中所做的那樣。具體方法是:在場景樹面板中選擇父節點( RigidBody2D ),然後點擊2D編輯器頂部的 按鈕(或在 macOS 上按下 Ctrl + G / Cmd + G 快速鍵)。
選取 Mob 節點,並在屬性檢視器的 RigidBody2D 區塊中,將其 Gravity Scale 屬性設定為 0 。這會阻止怪物向下墜落。
此外,在 Mob 節點的屬性檢視器中,找到 CollisionObject2D 部分,展開 Collision 分組,並取消勾選 Mask 屬性內的 1 。這樣可以確保怪物之間不會相互碰撞。
像設定玩家那樣設定 AnimatedSprite2D。這次我們有三個動畫: fly (飛行)、 swim (游泳)和 walk (行走)。每個動畫的圖片各有兩張,都在美術資料夾裡。
必須為每個單獨動畫設定 動畫速度 屬性,將三個動畫的對應動畫速度值都調整為 3 。
你可以使用 動畫速度 輸入區域右側的“播放動畫”按鈕預覽動畫。
接著我們會隨機選擇其中一個動畫來播放,這樣才不會讓所有怪物看起來都一樣。
就像玩家的圖片一樣,這些怪物的圖片也需要縮小。將 AnimatedSprite 的 Scale (縮放) 屬性設為 (0.75, 0.75) 。
如同 Player 場景一樣,為碰撞新增一個 CapsuleShape2D 。為了讓形狀與圖像對齊,你需要將 Rotation 屬性設定為 90 (在 Inspector 的「Transform」(變形)下方)。
保存場景。
敵人腳本
將腳本附加到 Mob 節點,方法如下:
extends RigidBody2D
using Godot;
public partial class Mob : RigidBody2D
{
// Don't forget to rebuild the project.
}
現在來看看腳本剩下的部分。我們在 _ready() 中隨機在三種動畫中選擇一個:
func _ready():
var mob_types = Array($AnimatedSprite2D.sprite_frames.get_animation_names())
$AnimatedSprite2D.animation = mob_types.pick_random()
$AnimatedSprite2D.play()
public override void _Ready()
{
var animatedSprite2D = GetNode<AnimatedSprite2D>("AnimatedSprite2D");
string[] mobTypes = animatedSprite2D.SpriteFrames.GetAnimationNames();
animatedSprite2D.Play(mobTypes[GD.Randi() % mobTypes.Length]);
}
首先,我們從 AnimatedSprite2D 的 sprite_frames 屬性取得動畫名稱的列表。這會回傳一個包含所有三個動畫名稱的陣列: ["walk", "swim", "fly"] 。
在 GDScript 程式碼中,我們使用 Array.pick_random 方法來隨機選擇其中一個動畫名稱。同時,在 C# 程式碼中,我們挑選一個介於 0 和 2 之間的隨機數字,從列表(陣列索引從 0 開始)中選擇其中一個名稱。運算式 GD.Randi() % n 會選擇一個介於 0 和 n-1 之間的隨機整數。
最後,呼叫 play() 以開始播放選定的動畫。
最後一步是讓怪物離開畫面時自行刪除。請將 VisibleOnScreenNotifier2D 節點的 screen_exited() 訊號連接至 Mob,然後加入以下程式碼:
func _on_visible_on_screen_notifier_2d_screen_exited():
queue_free()
// We also specified this function name in PascalCase in the editor's connection window.
private void OnVisibleOnScreenNotifier2DScreenExited()
{
QueueFree();
}
queue_free() 是一個函式,其本質是在影格結束時「釋放」或刪除節點。
至此, Mob 場景結束。
玩家和敵人已經準備就緒,接下來,我們將在一個新的場景中把他們放到一起。我們將使敵人在遊戲台上隨機生成並前進,我們的專案將變成一個能玩的遊戲。