[程式] Godot node/scene structure
看板GameDesign (遊戲設計)作者meowyih (meowyih)時間3年前 (2021/04/28 23:06)推噓9(9推 0噓 11→)留言20則, 10人參與討論串1/2 (看更多)
Node/Scene structure in Godot
C++ Programmer Perspective
寫給熟悉 C++,且依文件寫完 Godot 的 2D範例遊戲後,
依然對 node/scene 的觀念感覺有點混亂的人看的
1. Godot 裡的最基本元素是 Node,概念上等同 C++ Class
2. 當我們為一個 Node 附加 GDScript 時,
就是準備在 script 裡面覆寫 (override) 原來的
member function 或增加 member variable,
也就是繼承的概念。
3. 當我們在 Godot 介面左邊的 Scene Panel 加一個 Node 時,
實際上是同時宣告 (declare) 並實體化 (instance) 了一個 Class,
跟 C++ 不同,在 Scene Panel 被實體化的物件名可以
和 Class 名字一樣。不過只限於 Scene Panel,
因為在 script 裡面是不可以用 Node 名字當變數名的。
4. 所有的 Node 都是可以被執行的,如果要讓執行有意義,
以下是比較常被覆寫 (override) 的 member function
- func _init()
- func _ready()
- func _process(delta)
- func _physics_process(delta)
- func _input(event)
- func _enter_tree() # check sec8 ~ 13
- func _exit_tree() # check sec8 ~ 13
5. 每個 Node 裡面都可以加入多個 Child Node,
可以想像 Node 有個 private member variable - node container。
當 Node 的如 _ready() 或 _process(delta) 等 member 被呼叫時,
Godot 會自動呼叫所有 node container 裡面的同樣的 member func。
*check Node.propagate_call() for similar mechanism
6. Scene 指的就是 root Node,root Node 與所有的 child Nodes
的集合叫 scene tree 或一樣叫 scene。
一個 project 裡面可以有很多的 scene,
指定第一個被執行的 scene (i.e. entry point) 的方法
project -> project settings -> application -> run -> Main Scene
7. 每個 scene 都一定要一個對應的 *.tscn 檔案,該檔案不能直接編輯,
可以在左下的 FileSystem 找到。
8. 在 Coding time 要在某個 Node 下加入 API 中定義的 Node,
在 node 上右點滑鼠選 "add child node" 再選擇 Node 類型。
9. 在 Coding time 要在某個 Node 下加入自定義的 root Node (i.e. scene)
在 node 上右點滑鼠選 "instance child scene" 再選擇 scene *.tscn。
10. 在 Runtime (in script) 要在某個 Node 下加入 API 中定義的 Node,
在 Node's script 下寫
var child_node = Node.new()
add_child( child_node )
11. 在 Runtime (in script) 要在某個 Node 下加入自定義的 root Node (i.e. scene)
在 Node's script 下先宣告一個 PackedScene name
export (PackedScene) var MyNode
然後把 MyNode 這名字跟你要實體化的 scene 做連結,
連結方法是到右上方的 Inspector panel 裡 Script Variable -> MyNode
連結完後再回到 script 寫
var child_node = MyNode.instance()
add_child( child_node )
*從 C++ 的角度,instance() 和 new() 名字不一樣,
但做得事好像沒差別?
有人對這疑惑的說法是 new() 是實體化一個 Class
instance() 除了實體化 Class,還實體化了 scipt
內定義的 member variable 與 node 裡面的 child nodes,
某個角度看還是有不同的。
12. Parent Node 要取得 Child Node
get_child( path )
Coding time 加入的 Node's path 可以參照 Scene Panel。
Runtime 加入的 Node's path 可以在 add_child() 結束後
用 get_path() 取得,不過與其記下路徑,
不如把 child node reference 存下來就好。
13. 要移除一個 Child Node,
最常用的方法是 Child Node 呼叫自己的 queue_free() func,
當 Child Node 自行消滅時,Parent Node 也會自動將之移除。
另一個方法是 Parent Node 呼叫 remove_child(ref),
不過這不會消滅 Child Node,如果 code 同時有這二種方法存在,
有可能會造成 reference 指向一個已經釋放的 Object 的問題。
*參考 queue_free() 的說明
-
雖然我也不知道誰會看,就加減發一下吧
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.231.113.185 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/GameDesign/M.1619622388.A.A42.html
推
04/28 23:32,
3年前
, 1F
04/28 23:32, 1F
真的很棒,又輕又快又精美,
不像某引擎要使用還要硬綁他家的賣場,
寫出來的遊戲也不用硬要擺引擎 logo 上去,
編輯器還是綠色軟體連安裝都不用讓人覺得很乾淨,
(我就是在吐槽那個裝完後在背景偷吃資源的某引擎XD)
真希望能多一點人用 (笑)
※ 編輯: meowyih (36.231.100.217 臺灣), 04/29/2021 07:11:41
推
04/29 08:16,
3年前
, 2F
04/29 08:16, 2F
→
04/29 08:17,
3年前
, 3F
04/29 08:17, 3F
→
04/29 08:18,
3年前
, 4F
04/29 08:18, 4F
→
04/29 08:40,
3年前
, 5F
04/29 08:40, 5F
→
04/29 08:41,
3年前
, 6F
04/29 08:41, 6F
→
04/29 08:42,
3年前
, 7F
04/29 08:42, 7F
→
04/29 08:43,
3年前
, 8F
04/29 08:43, 8F
→
04/29 08:43,
3年前
, 9F
04/29 08:43, 9F
推
04/29 09:11,
3年前
, 10F
04/29 09:11, 10F
→
04/29 09:42,
3年前
, 11F
04/29 09:42, 11F
→
04/29 09:43,
3年前
, 12F
04/29 09:43, 12F
推
04/29 09:45,
3年前
, 13F
04/29 09:45, 13F
推
04/29 10:29,
3年前
, 14F
04/29 10:29, 14F
推
04/29 11:28,
3年前
, 15F
04/29 11:28, 15F
推
04/29 11:59,
3年前
, 16F
04/29 11:59, 16F
推
04/29 12:28,
3年前
, 17F
04/29 12:28, 17F
→
04/29 12:30,
3年前
, 18F
04/29 12:30, 18F
推
05/05 19:32,
3年前
, 19F
05/05 19:32, 19F
→
05/05 19:32,
3年前
, 20F
05/05 19:32, 20F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
GameDesign 近期熱門文章
PTT遊戲區 即時熱門文章
32
102