訊號 計時器例子

2022-03-23 03:04:02 字數 3468 閱讀 9422

要檢視訊號是如何工作的,讓我們嘗試使用 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

func _ready():

$timer.connect("timeout", self, "_on_timer_timeout")

func _on_timer_timeout():

$sprite.visible = !$sprite.visible

您也可以在godot中宣告您的的自定義訊號:

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

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())

在主場景中,我們連線玩家的訊號(它將出現在「node」選項卡中)。

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 窗體應用程式中使用而進行了...