要檢視訊號是如何工作的,讓我們嘗試使用 timer 節點。使用乙個節點和兩個子節點來建立乙個新場景:乙個是:timer和乙個 sprite。您可以使用godot圖示作為sprite的紋理,或者其他你喜歡的任意影象。
你的場景樹應該是這樣的:
在timer節點的屬性中,勾選*自動啟動*旁邊的選框。這會令計時器在你執行場景時自動啟動。你可以將*等待時間*保留為1秒。
在 「檢查器」 選項卡旁邊是乙個標記為 「節點」 的標籤。單擊此選項卡,您將看到所選節點可以發出的所有訊號。在計時器節點的情況下,我們關心的是」超時」。每當計時器到達0
時,就會發出這個訊號。
點選 「timeout()」 訊號,點選 「connect…」。您將看到以下視窗,您可以在其中定義如何連線訊號:
在左側,您將看到你場景中的節點,並可以選擇你想要「偵聽」的節點訊號。需要留意的是,定時器節點變紅——這不是乙個錯誤,但它是節點發出訊號的視覺提示。選擇根節點。
警告
目標節點*必須*附加乙個指令碼,否則您將收到一條錯誤訊息。
在視窗的底部有乙個「節點中的方法」標籤。這是你在目標節點指令碼中要使用的函式名。預設情況下,godot將會按命名規則』 『 _on__『 『 『建立這個函式,但您可以按您的意願更改它。
單擊「connect」,您將看到該函式已在指令碼中建立:
gdscript
extends node現在,我們可以將佔位符**替換為接收到訊號時要執行的任何**。讓我們讓精靈閃爍:func _on_timer_timeout():
pass # replace with function body
gdscript
extends node執行這個場景,你會看到精靈每秒鐘都在閃爍。您可以更改計時器的 等待時間 屬性來改變這一點。func _on_timer_timeout():
$sprite.visible = !$sprite.visible
您還可以在**中進行訊號連線而不是在編輯器中。當您通過**例項化節點時,您並不能使用編輯器進行連線,因此這通常是必要的。
首先,在計時器的「節點」選項卡中選中』鏈結『,並單擊』斷開連線『來斷開訊號。
要在**中進行連線,我們可以使用connect
函式。我們將把它放在_ready()
函式中,這樣連線就會在執行時進行。函式的語法是.connect(, , )
。下面是我們的計時器連線的**:
gdscript
extends node您也可以在godot中宣告您的的自定義訊號:func _ready():
$timer.connect("timeout", self, "_on_timer_timeout")
func _on_timer_timeout():
$sprite.visible = !$sprite.visible
gdscript
extends node一旦宣告,你的自定義訊號就會出現在檢查器中,並且可以用與節點內建訊號以相同的方式進行連線。signal my_signal
要通過**發出訊號,使用emit
函式:
gdscript
extends node作為訊號使用的另乙個例子,讓我們考慮乙個可以旋轉並向滑鼠射擊的玩家角色。每次單擊滑鼠按鈕,我們都會在玩家的位置建立子彈的例項。詳情請參閱 例項化 。signal my_signal
func _ready():
emit_signal("my_signal")
然而,如果子彈作為玩家的子節點新增,那麼當它旋轉時,子彈將仍然保持「附著」在玩家身上:
相反,我們需要子彈獨立於玩家的移動——一旦發射,子彈就會繼續沿著直線運動,玩家就不能再影響它們了。與其作為玩家的孩子被新增到場景樹中,不如將子彈作為「主」遊戲場景的子節點新增上去更有意義,後者可能是玩家的父節點,甚至可能是更高層級的樹。
你可以通過直接新增子彈來做到這一點:
gdscript
var bullet_instance = bullet.instance()然而,這將導致乙個不同的問題。現在如果你嘗試獨立測試你的「遊戲角色」場景,它會在射擊時崩潰,因為沒有父節點可以訪問。這使得獨立測試玩家角色**變得更加困難,也意味著如果你決定改變主場景的節點結構,玩家的父節點可能不再是接收子彈的合適節點。get_parent().add_child(bullet_instance)
解決這個問題的方法是使用乙個訊號來「發射」玩家的子彈。玩家不需要「知道」子彈在那之後發生了什麼——任何連線到訊號的節點都可以「接收」子彈並採取適當的行動來產生它們。
下面是玩家使用訊號發射子彈的**:
gdscript
extends sprite在主場景中,我們連線玩家的訊號(它將出現在「node」選項卡中)。signal shoot(bullet, direction, location)
var bullet = preload("res:")
func _input(event):
if event is inputeventmousebutton:
if event.button_index == button_left and event.pressed:
emit_signal("shoot", bullet, rotation, position)
func _process(delta):
look_at(get_global_mouse_position())
gdscript
func _on_player_shoot(bullet, direction, location):現在子彈將保持自己的運動獨立於玩家的旋**var b = bullet.instance()
add_child(b)
b.rotation = direction
b.position = location
b.velocity = b.velocity.rotated(direction)
godot的許多內建節點型別都提供可以用來檢測事件的訊號。例如,代表硬幣的 area2d 在玩家的物理體進入碰撞形狀時發出body_entered
訊號,讓你知道玩家什麼時候收集它。
在下一節 您的第乙個遊戲 中,您將構建乙個完整的遊戲,其中包括連線不同遊戲元件的幾種訊號用法。
python計時器 python 計時器
import sysclassshowtime qwidget def init self super init self.istimestart false 標記時間是否開始計時 self.setwindowtitle qlable 顯示計時時間 self.lable time val qlabe...
python計時器單位 python計時器類
import time as t class mytimer def init self self.unit 年 月 日 時 分 秒 self.prompt 未開始計時 self.lasted self.start 0 self.stop 0 def str self return self.pro...
伺服器計時器與 Windows 計時器
說明 此文大部分內容摘自msdn,本人只是做了一點整理。如果有什麼異議,一切以msdn為準。一 引言 在 visual studio net 中有兩種計時器控制項 基於伺服器的計時器和標準的基於 windows 的計時器。基於 windows 的計時器為在 windows 窗體應用程式中使用而進行了...