最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Godot從零開始的教程—3去往遙遠(yuǎn)的群星

2023-06-11 22:54 作者:笑望九州  | 我要投稿

飛行的宇宙飛船:你的第一個場景和腳本

https://www.bilibili.com/video/BV1zu411Y7mF?p=1

歡迎來到您的第一個游戲項(xiàng)目。

您已花費(fèi)數(shù)小時學(xué)習(xí)編程基礎(chǔ)知識?,F(xiàn)在,是時候讓事情變得更有趣了:您將一頭扎進(jìn)游戲開發(fā)中。

在課程的這一部分,您將通過制作玩具和迷你游戲來學(xué)習(xí)。我們將進(jìn)行許多不同規(guī)模的項(xiàng)目。

通過這些項(xiàng)目,您將重用和構(gòu)建您在Learn GDScript 應(yīng)用程序中學(xué)到的一切。


你的第一個項(xiàng)目:宇宙飛船

在第一個項(xiàng)目中,我們將制作一艘可以用鍵盤控制并進(jìn)行加速的宇宙飛船。

首先,我們會讓它非常迅速地移動和停止。然后,我們看看如何使用轉(zhuǎn)向使其平穩(wěn)移動。

你將學(xué)習(xí):

  • 如何將節(jié)點(diǎn)添加到場景并運(yùn)行該場景。

  • 如何通過附加 GDScript 代碼來控制節(jié)點(diǎn)。

  • 如何使用游戲循環(huán)讓物體移動。

  • 如何聽取鍵盤輸入并將控制權(quán)交給播放器。

  • 如何使用計時器和信號進(jìn)行限時提升。

在后續(xù)視頻中,我們將首先編寫一艘自行移動的船。然后,我們將向項(xiàng)目的輸入映射添加播放器控件,并使用輸入函數(shù)對播放器控件進(jìn)行編碼。我們最終將添加提升機(jī)制。

然后輪到您使用?轉(zhuǎn)向行為使船平穩(wěn)移動。

由于這是您的第一個項(xiàng)目,因此信息量可能有點(diǎn)大。

這很正常:一開始要學(xué)的東西太多了!我們不希望您記住這里的一切。

我們正在嘗試創(chuàng)建真實(shí)的游戲機(jī)制,讓您了解 Godot 的工作原理。

該項(xiàng)目的關(guān)鍵要點(diǎn)是場景、節(jié)點(diǎn)、信號和腳本的概念?。完成項(xiàng)目后,您會找到更深入的指南。

此外,您將在課程中一次又一次地看到該項(xiàng)目中介紹的每個功能,這將使您更好地記住它。

當(dāng)然,我們還在每個視頻下加入了很多其他新概念的解釋。

請前往下一課,我們將開始一起編寫我們的宇宙飛船。


導(dǎo)入項(xiàng)目

如果您還沒有,請下載?godot-practice-*.zip文件并解壓縮。

鏈接:https://pan.baidu.com/s/1_iFZTWIU8WT2XCZZDrgzig?pwd=2k50?

該課程以壓縮檔案形式提供。要訪問這些文件,您需要從檔案中提取它們。您的系統(tǒng)應(yīng)該帶有預(yù)安裝的程序。

要解壓縮文件:

  1. 在您的文件資源管理器中,導(dǎo)航到包含下載文件的文件夾。

  2. 右鍵單擊 zip 文件并選擇“解壓”選項(xiàng)(Windows、Linux)。在 macOS 上,您需要雙擊該文件。

您應(yīng)該會看到一個名為 zip 存檔的新目錄。它包含本教程和所有其他教程的所有課程文件。

啟動 Godot,然后在打開的項(xiàng)目管理器中單擊?Import。


導(dǎo)航到解壓縮項(xiàng)目的位置,輸入目錄,然后雙擊project.godot.


然后,單擊導(dǎo)入和編輯。

就是這樣,您已經(jīng)導(dǎo)入了項(xiàng)目!

下次,您只需在項(xiàng)目列表中選擇它:

注意:如果您需要,該文件?godot-complete-demos-*.zip包含所有教程(但不包括實(shí)踐)的完整代碼。

如何跟上每節(jié)課

對于每一節(jié)課,您都應(yīng)該在 Godot 中打開項(xiàng)目“Learn to Code with Godot: Practices”。如果有視頻,您應(yīng)該先觀看視頻,然后再閱讀文本。您還應(yīng)該按照說明在 Godot 中重現(xiàn)場景和代碼。

我們的教程分為三個部分:

  1. 我們解釋為什么我們做我們正在做的事情。跳過這部分可能很誘人,但請閱讀它,我們認(rèn)為這對您的學(xué)習(xí)很重要。

  2. 我們?yōu)槟峁┙忉屢怨┠M(jìn),并為您編寫代碼。抵制復(fù)制粘貼的誘惑。編程在很大程度上是一個習(xí)慣問題。反復(fù)編寫代碼對于學(xué)習(xí)來說是必不可少的。

  3. 我們?yōu)槟峁┙换ナ綄?shí)踐來訓(xùn)練新技能。他們的標(biāo)題如“練習(xí):……”。當(dāng)您看到它們時,您應(yīng)該通過單擊右側(cè) GDQuest Practices dock 中的相應(yīng)實(shí)踐在 Godot 中打開指定的場景。

找到課程文件

首先,在 Godot 中打開項(xiàng)目“Learn to Code with Godot: Practices”,然后在FileSystem?dock 中展開?MovingShip目錄,然后 展開01.MakingShipMove目錄,然后雙擊?MakingShipMove.tscn.?教程見!




移動宇宙飛船

https://www.bilibili.com/video/BV1zu411Y7mF?p=2

在本視頻中,我們將編寫一艘自行移動的宇宙飛船。

在每個視頻下方,您都會找到有關(guān)新概念的說明和 回答您的問題。

新概念

精靈

在游戲中,精靈是可以移動的圖像。我們用這個詞來談?wù)撚螒蛑袔缀跛械睦L圖:角色、怪物、門、箱子、武器、云等等?!熬`”一詞在 2D 游戲中很流行。

您還會聽到游戲藝術(shù)家稱他們創(chuàng)建的任何圖像都是“精靈”。

關(guān)鍵詞extends_

關(guān)鍵字extends告訴計算機(jī)您的腳本直接從游戲引擎擴(kuò)展代碼。

例如,該行extends Sprite告訴 Godot 將您的代碼附加到 Godot 開發(fā)人員為該類型編寫的所有代碼??Sprite。這就是您可以像GDScript 一樣訪問?_process()函數(shù)或成員變量的 方式。positionrotation

在 Godot 中,每個腳本都必須從游戲引擎擴(kuò)展一個類型。正如我們在“添加節(jié)點(diǎn)”對話框中看到的那樣,它??Sprite是引擎內(nèi)置的眾多節(jié)點(diǎn)類型之一。

您將在課程的后面學(xué)習(xí)如何創(chuàng)建新類型和擴(kuò)展它們。

速度

速度是將方向和速度組合成單個值的矢量。矢量的方向給了我們它的方向,它的長度代表了速度。

有關(guān)場景、節(jié)點(diǎn)和腳本的更多信息,請查看本章的專門指南。

你的問題

為什么用大寫字母命名文件并且沒有空格?

我們經(jīng)常在代碼中使用大寫字母且沒有空格的名稱來表示大多數(shù)類型。這是一個約定,我們稱之為“PascalCase”。

在這個項(xiàng)目中,我們對相關(guān)文件使用相同的約定。例如,我們用 PascalCase 編寫文件、腳本和文件夾的名稱。

我們這樣做是因?yàn)?PascalCase 是 Godot 社區(qū)的標(biāo)準(zhǔn)約定。Godot 默認(rèn)以 PascalCase 命名節(jié)點(diǎn)、場景和腳本文件,因此人們傾向于使用它。

您可以隨心所欲地編寫文件名。我們建議為每個項(xiàng)目選擇一個約定并堅(jiān)持下去。它有助于讓您和您的隊(duì)友輕松搜索和整理內(nèi)容。

下一個視頻將帶您逐步完成第一個練習(xí)。

代碼

這是本課后該船的完整代碼清單。

extends Sprite


var velocity := Vector2(500, 0)


func _process(delta: float) -> void:

position += velocity * delta

rotation = velocity.angle()




你的第一次練習(xí)

https://www.bilibili.com/video/BV1zu411Y7mF?p=3

現(xiàn)在是您進(jìn)行第一次練習(xí)的時候了,您將在練習(xí)中重現(xiàn)我們在本課中編寫的代碼。

由于這是我們的第一個項(xiàng)目,因此實(shí)踐與課程非常接近。你應(yīng)該把它們當(dāng)作一個機(jī)會來排練和測試你剛剛學(xué)到的東西。實(shí)踐將變得更具挑戰(zhàn)性。

實(shí)踐如何在課程中發(fā)揮作用

練習(xí)都是為了提高您的 Godot 和游戲開發(fā)技能。這就是為什么我們開發(fā)了一個系統(tǒng),讓您可以在 Godot 編輯器中輕松練習(xí)。這是它的工作原理。

在右側(cè),您會看到一個名為GDQuest Practices的停靠欄。它列出了課程中的所有練習(xí)。

每個練習(xí)都有一個專門的場景。要打開第一個練習(xí)場景,請單擊其名稱Making the ship move。


這將在視口中打開練習(xí)場景并顯示您的目標(biāo)、任務(wù)和提示。

在視口中,您應(yīng)該會看到一個帶有腳本的Sprite節(jié)點(diǎn)。

要完成練習(xí),您需要通過多項(xiàng)檢查,就像在Learn GDScript應(yīng)用程序中一樣?。

按 運(yùn)行場景F6。這將在左側(cè)顯示檢查并運(yùn)行它們。對于每個失敗的檢查,右側(cè)都會顯示一條錯誤消息。

按F8停止播放場景并返回到編輯器。

要完成練習(xí),您需要編輯場景及其腳本。使所有檢查通過,完成標(biāo)記將出現(xiàn)在編輯器中。

如果條件允許 經(jīng)可能的關(guān)閉任何能夠影響到你注意力的東西




用鍵盤控制飛船

在本視頻中,您將添加輸入映射和代碼以使用鍵盤控制您的飛船。

https://www.bilibili.com/video/BV1zu411Y7mF?p=4

新概念

什么是對象?

在課程的第一部分,您會不時聽到我們談?wù)搶ο蟆T?Godot 以及 Python 或 JavaScript 等編程語言中,對象是一種將數(shù)據(jù)和函數(shù)捆綁在一起的結(jié)構(gòu)。

您已經(jīng)遇到了幾個對象:您的船?Sprite是一個對象。數(shù)組、字典,?Input也是對象。

它們都將數(shù)據(jù)和函數(shù)捆綁在一個包中:例如,數(shù)組包含值(數(shù)據(jù))并允許您訪問成員函數(shù),例如append().

在游戲開發(fā)中,您將一直使用對象。例如,Godot 中的每個節(jié)點(diǎn)都是一個對象。

這個概念現(xiàn)在可能有點(diǎn)抽象,但不要擔(dān)心:您將在本課程的后面學(xué)到更多關(guān)于對象的知識。

輸入

Input對象使您可以訪問與 Godot 中的用戶輸入相關(guān)的所有功能。比如我們用它來獲取帶有函數(shù)的玩家的輸入方向get_axis()。

對象的許多功能都Input需要輸入操作。輸入操作是您將鍵、鼠標(biāo)按鈕或游戲手柄按鈕映射到的名稱。我們準(zhǔn)備了一份關(guān)于輸入操作的回顧指南:將輸入映射添加到您的游戲中。

方向向量

方向向量是最大長度為 的向量?1。

我們經(jīng)常通過將方向向量乘以速度值來計算游戲角色的速度。

在那種情況下,方向通常是一個二維向量,而速度是一個十進(jìn)制值。將向量乘以十進(jìn)制值會使向量變長或變短,同時保持其方向。

我們準(zhǔn)備了一個額外的視頻演示來向您展示方向向量的工作原理。

檢查是否有輸入方向

在本課中,我們direction在以下條件下測試玩家的輸入:if direction。

使用此快捷方式時,Godot 會同時測試向量的x和 值。y如果它們都等于零,則條件失敗。如果向量有任何其他值,則條件通過。

練習(xí):聆聽玩家輸入

在godot-practice項(xiàng)目中,開啟本項(xiàng)目的第二個練習(xí),Listening to player input。

這一次,你的工作是讓飛船聽取輸入。

你的問題

為什么有時在數(shù)字后加小數(shù)?

我們有時會在數(shù)字后添加一個小數(shù)位,即使它是?.0.?這樣做會告訴計算機(jī)這個值是一個?float(十進(jìn)制數(shù))而不是一個int(整數(shù))。

然而,這在 GDScript 中通常是不必要的。雖然整數(shù)和小數(shù)對于計算機(jī)來說是不同的,但 GDScript 會根據(jù)上下文為您轉(zhuǎn)換數(shù)字。

例如,在創(chuàng)建二維向量時,Vector2()?構(gòu)造函數(shù)只采用十進(jìn)制值。

即使您寫的是整數(shù),計算機(jī)也知道您的意思是使用十進(jìn)制值并照此處理。

那你為什么要.0在數(shù)字后面打字呢?它使您的代碼更加精確。當(dāng)您需要在幾周后修改它并且小數(shù)點(diǎn)很重要時,它特別有用。

.0出于這個原因,我們通??偸菍懶?shù)位,即使它們是 。但是,它們是您不應(yīng)該擔(dān)心的細(xì)節(jié)。

為什么我們在過程函數(shù)之外定義速度而在過程函數(shù)內(nèi)部定義方向?

從技術(shù)上講,我們可以像定義 變量一樣定義函數(shù)velocity內(nèi)部?。這樣做會在每一幀重置變量。_process()direction

然而,為了讓飛船在系列后期順利移動,我們需要velocity在幀之間保持它的值,這就是我們在腳本頂部定義它的原因。您將需要在大多數(shù)角色移動腳本中這樣做。

為什么我們用 Vector2.ZERO 的值定義速度?

創(chuàng)建變量時,最好給它們賦值。這允許我們通過編寫來使用類型推斷:=。此外,如果您忘記設(shè)置變量的初始值,有時您的代碼可能會出現(xiàn)錯誤。

在這種情況下,起始值不是很重要,因?yàn)槲覀冎匦掠嬎?code>velocity每一幀。我們只是經(jīng)常用 的值初始化 2D 向量Vector2.ZERO。

代碼

到目前為止,這是該船的完整代碼清單。

extends Sprite


var max_speed := 600.0

var velocity := Vector2.ZERO



func _process(delta: float) -> void:

? ? var direction := Vector2.ZERO

? ? direction.x = Input.get_axis("move_left", "move_right")

? ? direction.y = Input.get_axis("move_up", "move_down")


? ? # If we don't do this and the player moves diagonally, they will move 40%

? ? # faster than normal.

? ? if direction.length() > 1.0:

? ? ? ? direction = direction.normalized()


? ? velocity = direction * max_speed

? ? position += velocity * delta


? ? if direction:

? ? ? ? rotation = velocity.angle()

在下一個視頻中,我們將使用信號來編寫增強(qiáng)機(jī)制的代碼。



使船舶升壓

在本視頻中,您將使用信號為您的飛船編寫在短時間內(nèi)提升速度的代碼。

https://www.bilibili.com/video/BV1zu411Y7mF?p=5

信號

信號允許節(jié)點(diǎn)相互通信和做出反應(yīng)。它們是節(jié)點(diǎn)在發(fā)生某些事情時發(fā)出的消息。例如,a?在超時時?Timer發(fā)出信號。"timeout"

您可以連接一個信號和一個節(jié)點(diǎn)。當(dāng)您這樣做時,每次發(fā)出信號時,Godot 都會調(diào)用連接的函數(shù)。它是同步發(fā)生的:在視頻中,當(dāng)"timeout"信號發(fā)出時,連接的_on_Timer_timeout()函數(shù)在同一幀中被調(diào)用。

您將在本課程和您的項(xiàng)目中大量使用信號。它們是 Godot 最有用的核心功能之一。

獲取節(jié)點(diǎn)

在 GDScript 中,您可以通過調(diào)用函數(shù)來訪問子節(jié)點(diǎn)?get_node()。此函數(shù)需要一個參數(shù):目標(biāo)節(jié)點(diǎn)相對于您附加腳本的節(jié)點(diǎn)的路徑。

例如,在下圖中,您可以?通過調(diào)用 來?從Player節(jié)點(diǎn)訪問BodySprite節(jié)點(diǎn)。get_node("Pivot/BodySprite")



一旦你得到一個節(jié)點(diǎn),你就可以調(diào)用它的函數(shù)并使用點(diǎn) (?.) 運(yùn)算符訪問它的變量,就像我們?get_node("Timer").start()在視頻中寫的那樣。

實(shí)踐:提升機(jī)制

在Godot實(shí)踐項(xiàng)目中,開啟第三個實(shí)踐,The boost mechanic。

在本練習(xí)中,您將重現(xiàn)我們在本課中看到的提升機(jī)制。

您需要在場景中添加一個計時器,連接到它的信號,并在按下輸入boost操作時使飛船加速。

代碼

到目前為止,這是該船的代碼。

extends Sprite


var boost_speed := 1500.0

var normal_speed := 600.0


var max_speed := normal_speed

var velocity := Vector2.ZERO



func _process(delta: float) -> void:

? ? var direction := Vector2.ZERO

? ? direction.x = Input.get_axis("move_left", "move_right")

? ? direction.y = Input.get_axis("move_up", "move_down")


? ? if direction.length() > 1.0:

? ? ? ? direction = direction.normalized()


? ? if Input.is_action_just_pressed("boost"):

? ? ? ? max_speed = boost_speed

? ? ? ? get_node("Timer").start()


? ? velocity = direction * max_speed

? ? position += velocity * delta

? ? if direction:

? ? ? ? rotation = velocity.angle()



func _on_Timer_timeout() -> void:

? ? max_speed = normal_speed


在下一部分中,您將向節(jié)點(diǎn)添加轉(zhuǎn)向。這一次,您不會有視頻:相反,您必須閱讀簡短的指南并使用代碼清單來修改您的飛船。

它可能不如觀看視頻舒服,但同時對您有好處:它是一種更積極的學(xué)習(xí)形式。



平穩(wěn)地操縱船

在本課中,我們將使用轉(zhuǎn)向行為使我們的船移動得更加順暢。


轉(zhuǎn)向行為是一種計算,可讓您使用通常很少的代碼使角色和 AI 平穩(wěn)移動。它們導(dǎo)致自然運(yùn)動和平滑曲線。

目前,在每一幀中,我們都會立即改變速度。當(dāng)玩家按下方向鍵時,船會以最大速度移動。如果玩家釋放鑰匙,船就會停止。




我們希望飛船平穩(wěn)地加速和減速。為此,我們將使用轉(zhuǎn)向行為。

轉(zhuǎn)向行為是我們用來使物體平穩(wěn)移動的一類算法。轉(zhuǎn)向行為使用矢量計算使對象轉(zhuǎn)向目標(biāo)位置。

我們將看到的第一個轉(zhuǎn)向算法是最簡單的:它只需要兩三行代碼就可以極大地改善運(yùn)動。

var desired_velocity := speed * direction

var steering_vector := desired_velocity - velocity

velocity += steering_vector * drag_factor

我們將在下面對其進(jìn)行分解。

跟隨轉(zhuǎn)向行為

這種轉(zhuǎn)向行為會逐漸改變船只的速度以朝向目標(biāo)移動。

它通過計算我們所說的“所需速度”來工作。那是船在輸入方向上以最大速度立即行駛。我們將其與當(dāng)前速度“比較”。

我們可以像這樣表示當(dāng)前和期望的速度向量。


想象一下船向左行駛,玩家按下右鍵。我們?nèi)绾巫尨蛴肄D(zhuǎn)?

我們首先計算兩個速度之間的差異。這就是我們所說的轉(zhuǎn)向矢量


為了讓船平穩(wěn)地轉(zhuǎn)彎,而不是在每一幀以所需的速度移動,我們將一小部分轉(zhuǎn)向矢量添加到當(dāng)前速度。這樣做會使船逐漸轉(zhuǎn)向?目標(biāo)速度。

到目前為止,我們用一行代碼計算了速度。

func _process(delta: float) -> void:

? ? # ...

? ? velocity = direction * speed

注意:當(dāng)我們寫#...代碼清單時,它代表我們突出顯示的行之前或之后的代碼行。否則,如果我們每次都包含每一行代碼,那么重要的或新的代碼行將變得難以發(fā)現(xiàn)。

為了獲得平滑的運(yùn)動,我們需要用三行代碼替換更新船速的行。我們還添加了一個新變量,即drag_factor

var drag_factor := 0.1


func _process(delta: float) -> void:

? ? # ...

? ? var desired_velocity := max_speed * direction

? ? var steering_vector := desired_velocity - velocity

? ? velocity += steering_vector * drag_factor

? ? # ...


我們首先計算所需的速度:船在輸入方向上以最大速度移動。

? ? var desired_velocity := max_speed * direction

然后我們計算所需速度與當(dāng)前速度之間的差異。

? ? var steering_vector := desired_velocity - velocity

請注意,放置向量的順序很重要,因?yàn)橄蛄坑蟹较?。如果你顛倒這兩項(xiàng),船就會遠(yuǎn)離目標(biāo)。

? ? velocity += steering_vector * drag_factor


我們將這個轉(zhuǎn)向矢量的一部分添加到第三行的當(dāng)前速度。它逐漸改變velocity?每一幀,使我們的船根據(jù)我們的輸入加速和減速。

如果沒有drag_factor,我們會立即將我們設(shè)置?velocitydesired_velocity,使船始終以最大速度移動或根本不動。

要每幀僅添加一部分轉(zhuǎn)向矢量,請將該值乘以steering_vector一個小數(shù)。0.01介于和之間的任何地方都0.3應(yīng)該運(yùn)作良好。

值越低,船的慣性就越大:它的轉(zhuǎn)彎、加速和減速都會慢得多。drag_factor這是一艘船?0.05。


值越高,船的反應(yīng)性越強(qiáng):它會急轉(zhuǎn)彎,迅速達(dá)到最大速度,然后瞬間停止。drag_factor這是以of?移動的船0.3。

盡管如此,與使用這種轉(zhuǎn)向算法始終以最大速度移動相比,運(yùn)動總是感覺更順暢。


練習(xí):讓船轉(zhuǎn)向

在 Godot 實(shí)踐項(xiàng)目中,打開Making the ship steer。

代碼

這些轉(zhuǎn)向方程廣泛用于專業(yè)游戲中。本課程僅展示基本原理,但您將在課程中看到我們可以進(jìn)一步推動轉(zhuǎn)向行為以編寫令人印象深刻的 AI 運(yùn)動。

這是舵機(jī)的完整代碼,包括您之前編寫的助推機(jī)制。

extends Sprite


var boost_speed := 1500.0

var normal_speed := 600.0


var max_speed := normal_speed

var velocity := Vector2.ZERO

var drag_factor := 0.1


func _process(delta: float) -> void:

? ? var direction := Vector2.ZERO

? ? direction.x = Input.get_axis("move_left", "move_right")

? ? direction.y = Input.get_axis("move_up", "move_down")


? ? if direction.length() > 1.0:

? ? ? ? direction = direction.normalized()


? ? if Input.is_action_just_pressed("boost"):

? ? ? ? max_speed = boost_speed

? ? ? ? get_node("Timer").start()


? ? var desired_velocity := max_speed * direction

? ? var steering_vector := desired_velocity - velocity

? ? velocity += steering_vector * drag_factor

? ? position += velocity * delta

? ? rotation = velocity.angle()


func _on_Timer_timeout() -> void:

? ? max_speed = normal_speed




到太空和遙遠(yuǎn)的群星!結(jié)束

如果您完成了所有四個練習(xí),恭喜您!您擊敗了第一個項(xiàng)目,并正在成為游戲開發(fā)者的路上。

在下一個項(xiàng)目 Dialog Boxes 中,您將編寫一個漂亮的小對話框系統(tǒng)。那將是一個了解字典力量的好機(jī)會。





將輸入映射添加到您的游戲

您的玩家可能希望使用鍵盤或游戲手柄來玩您的游戲。通常,您需要支持多種輸入設(shè)備。

例如,您可能希望Dkey、→key 和 joystick 都使角色向右移動。

Godot 的Input Map為您解決了這個問題:它將一個??String名稱映射到多個鍵和按鈕。

訪問輸入映射

要管理您的Input Map,請轉(zhuǎn)到Project -> Project Settings…窗口,然后單擊Input Map?選項(xiàng)卡。

Input?Map窗口頂部有一個欄,用于添加新的輸入名稱以及現(xiàn)有名稱和相應(yīng)輸入的列表。

在那里,您可以在淺灰色背景上看到每個現(xiàn)有操作的名稱。在每個名稱下方,您會找到相應(yīng)輸入的列表。

當(dāng)玩家按下這些輸入中的任何一個時,Godot 將觸發(fā)相應(yīng)的動作,允許您在代碼中對其做出反應(yīng)。

所有以ui_開頭的動作都是由 Godot 編輯器預(yù)定義和使用的。

您可以在編寫游戲的用戶界面或插件時使用它們。但是,我們建議為游戲的其余部分創(chuàng)建新的輸入操作,以避免在與游戲的 UI 交互時發(fā)生沖突。

創(chuàng)建動作

要定義新操作,請單擊Action旁邊的欄。您鍵入操作的名稱,例如move_right,然后按下Enter或單擊“添加”按鈕。

然后您的新操作會出現(xiàn)在窗口底部。

要將鍵或按鈕映射到此操作,請單擊其右側(cè)的加號圖標(biāo)。


您會看到四個選項(xiàng):

  1. Physical?Key和Key選項(xiàng)適用于鍵盤按鍵。

  2. Joy Button選項(xiàng)適用于游戲手柄上的按鈕。

  3. 操縱軸選項(xiàng)代表任何操縱桿。

  4. 鼠標(biāo)按鈕控制鼠標(biāo)。在 的情況下?Left Click,它還默認(rèn)與觸摸設(shè)備兼容。

鑰匙和物理鑰匙有什么區(qū)別?

世界各地的玩家使用不同的鍵盤布局。

例如,英語國家有QWERTY鍵盤,但在法國最常見的布局是AZERTY。

當(dāng)試圖映射到鍵盤上的特定字母時,比如?WASD在第一人稱游戲中移動,法國玩家最終會遇到不方便的布局。對于他們來說,鍵的布局不像箭頭鍵,這將要求他們在玩游戲之前更改輸入設(shè)置。

這就是 Godot 引入物理密鑰選項(xiàng)的原因。它不是映射到給定的字母,而是記錄鍵在鍵盤上的位置。例如,如果您在QWERTY鍵盤上記錄您的物理鍵,Godot 會將其保存為“第一個字母行的第二個字母”。W

這使得鍵的位置?WASD在鍵盤布局中保持一致。

如果您想使用字母鍵進(jìn)行移動,我們建議您使用它。


獎勵:方向向量

https://www.bilibili.com/video/BV1zu411Y7mF/?p=6

這段簡短的附贈視頻應(yīng)該可以幫助您直觀地了解我們所說的?方向向量的含義。

簡而言之,它通常是一個最大長度為 的向量?1.0,我們用它來表示玩家或?qū)嶓w的移動方向。您可以將它乘以速度值來計算?速度。


場景、節(jié)點(diǎn)、腳本和信號

這些是 Godot 游戲所依賴的四個基本概念:場景、節(jié)點(diǎn)、腳本和信號。

我們已經(jīng)在我們的第一個項(xiàng)目中看到了它們的實(shí)際應(yīng)用。

本指南將幫助您更多地理解這些概念。您可以隨時返回以復(fù)習(xí)。

Godot 游戲由許多場景組成。場景可以由更小的場景和節(jié)點(diǎn)組成。

您游戲的所有場景和節(jié)點(diǎn)一起構(gòu)成了場景樹:您的游戲?qū)⒔M織在場景樹中。當(dāng)我們從事更大的項(xiàng)目時,您會了解更多。

現(xiàn)在,場景和節(jié)點(diǎn)沒有腳本就做不了多少。腳本是包含附加到節(jié)點(diǎn)的代碼的文件。代碼在您將腳本鏈接到的節(jié)點(diǎn)上執(zhí)行。

最后,您可以使用信號讓腳本對游戲世界中的事件做出反應(yīng)?。信號是節(jié)點(diǎn)在發(fā)生特定事件時發(fā)出的消息,例如計時器用完。

Godot 游戲由場景組成

在 Godot 中,您會將游戲分解為多個場景。

場景可以是游戲中任何有意義的東西,例如角色、武器、門、房子或整個游戲關(guān)卡。

場景可以是任意大小和復(fù)雜程度。在設(shè)計場景時,我們專注于為游戲制作單一的東西,比如角色或菜單。如果我們需要二十個節(jié)點(diǎn)來這樣做,我們就使用二十個節(jié)點(diǎn)。如果我們只需要三個,我們就用三個。

您可以嵌套場景

假設(shè)您有幾個場景:一個房間、一個傳送器和一個箱子。你可以通過將它們組合成一個新場景來制作一個可玩的關(guān)卡場景,就像你在課程介紹中所做的那樣。

您可以根據(jù)需要多次復(fù)制場景。例如,您的寶箱場景是制作新寶箱的藍(lán)圖。

我們稱您游戲中的每個箱子為實(shí)例:場景的具體再現(xiàn)。在整個課程中,您將了解有關(guān)創(chuàng)建實(shí)例的更多信息。

節(jié)點(diǎn)是您最小的構(gòu)建塊

要創(chuàng)建場景,您需要小型構(gòu)建塊。在 Godot 中,我們稱它們?yōu)楣?jié)點(diǎn)。

節(jié)點(diǎn)就像樂高積木。它們是游戲的基本構(gòu)造塊。Godot 提供了其中的幾十個。這里有四個例子:

  • ?Sprite節(jié)點(diǎn)顯示圖像并允許您移動、旋轉(zhuǎn)和縮放它。

  • AudioStreamPlayer2D可以播放聲音或音樂配樂。

  • ?Area2D檢測另一個區(qū)域或物理體何時接觸它。

  • ?Timer倒計時并在每次超時時發(fā)出信號。

節(jié)點(diǎn)為您提供制作游戲所需的所有基本功能。例如,您可以檢測到玩家何時靠近箱子并嘗試使用?Area2D.?您還可以使用它們來了解角色何時受到打擊并且應(yīng)該失去健康。

請注意某些節(jié)點(diǎn)如何具有“2D”后綴。Godot支持2D和3D游戲,很多節(jié)點(diǎn)都有2D和3D版本。后綴和圖標(biāo)的顏色區(qū)分它們。

就其本身而言,節(jié)點(diǎn)通常不執(zhí)行任何操作。它們是 Godot 為您提供的代碼庫的一部分?。要使節(jié)點(diǎn)栩栩如生,您需要將腳本附加到它們。

腳本

腳本是包含附加到 Godot 節(jié)點(diǎn)的代碼的文件。

我們在本課程中專門使用 GDScript 代碼,但Godot為有需要的經(jīng)驗(yàn)豐富的游戲開發(fā)人員支持多種編程語言。

最好將腳本想象成附在兼容主機(jī)上并控制它們的寄生蟲。

每個節(jié)點(diǎn)都帶有一個代碼庫,默認(rèn)情況下不會做太多事情。此代碼正在等待您使用它。為此,您需要在腳本中編寫說明。

您的腳本通常以extends?關(guān)鍵字開頭,后跟節(jié)點(diǎn)類型。

您在第一行所寫的內(nèi)容限制了兼容節(jié)點(diǎn)。例如,以以下代碼開頭的腳本僅與精靈和從精靈派生的節(jié)點(diǎn)兼容。

extends Sprite

關(guān)鍵字extends的意思是“此腳本擴(kuò)展了該節(jié)點(diǎn)類型的代碼”,使您的腳本可以訪問 Godot 開發(fā)人員為該節(jié)點(diǎn)編碼的所有函數(shù)和變量。

例如,每個?Timer節(jié)點(diǎn)都有一個start()啟動計時器的功能。要在?Timer節(jié)點(diǎn)上使用此功能,您必須:

  1. 創(chuàng)建一個?Timer節(jié)點(diǎn)。

  2. 將腳本附加到?Timer以 code 開頭的節(jié)點(diǎn)?extends Timer

信號

你可以只用節(jié)點(diǎn)和腳本做很多事情,但你很快就會遇到問題。想象一顆子彈飛向怪物。您想準(zhǔn)確知道子彈何時接觸到怪物并在那一刻減去生命值。

為了解決這個問題,Godot 有一個名為signals的特性。它們是您可以收聽的消息,可以準(zhǔn)確地告訴您事件發(fā)生的時間。

例如,在給船升壓時,我們?Timer在項(xiàng)目中啟動一個。我們想知道計時器何時超時并降低船速。

為此,我們連接到timeout信號。當(dāng)??Timer結(jié)束時,它發(fā)出信號。

我們將信號連接到函數(shù)。當(dāng)timeout信號發(fā)出時,Godot 調(diào)用連接的函數(shù)并運(yùn)行它的代碼,這就是我們對信號做出反應(yīng)的方式。

總之

信號、腳本、節(jié)點(diǎn)和場景。他們一起工作來幫助你制作游戲:

  • 您連接信號和腳本以對游戲世界中的事件做出反應(yīng)。

  • 您將腳本附加到節(jié)點(diǎn)以控制節(jié)點(diǎn)。

  • 您創(chuàng)建多個節(jié)點(diǎn)并將其組合到場景中。

  • 你所有的場景都匯集到一個游戲中。

請注意,這些概念是 Godot 特有的,因?yàn)槊總€游戲引擎的工作方式都不同。

您不會在其他游戲引擎中找到節(jié)點(diǎn)本身。但是,您會發(fā)現(xiàn)精靈、聲音播放器、區(qū)域等。他們只是工作方式不同。



















Godot從零開始的教程—3去往遙遠(yuǎn)的群星的評論 (共 條)

分享到微博請遵守國家法律
上犹县| 平塘县| 易门县| 习水县| 富裕县| 肥西县| 临清市| 金川县| 永嘉县| 蓬莱市| 昌邑市| 宜章县| 兴文县| 清原| 大宁县| 龙山县| 腾冲县| 德州市| 普定县| 中山市| 泸溪县| 灵宝市| 边坝县| 郓城县| 城市| 贡山| 察隅县| 大兴区| 叙永县| 石楼县| 马边| 区。| 仁寿县| 两当县| 娄底市| 湘乡市| 泽库县| 屯留县| 遂溪县| 六枝特区| 米脂县|