[英]Script ignores set to false
这是我的脚本的模型:
# player.gd
extends HBoxContainer
class_name Player
var can_play = false
signal thing
func _ready():
connect("thing", #the following script# , "stuff")
func _input(Input):
if !can_play:
return
emit_signal("thing")
# game.gd
extends Node
var players = [Player0, Player1, Player2, Player3] # of class Player
var current_player = 0
func _ready():
yadda()
func yadda():
players[current_player].can_play = true
func stuff():
players[current_player].can_play = false
print(players[current_player])
current_player = (current_player + 1) % 4
yadda()
我的目标是让每个玩家在轮到他们输入时打印他们的名字。 只有一名玩家应该将他们的 can_play 设置为 true。 在每个输入上,当前玩家的 can_play 设置为 false,下一个设置为 true。
现在这段代码每次都有效,除非 current_player == 3。如果之后有输入,代码会打印“Player3”和“Player0”。 Player3 和 Player0 将它们的 can_play 一个接一个地设置为 true,只有一个输入。 这也不会发生在其他玩家身上。
我尝试设置一个 Timer 以便代码不会直接将 can_play 设置为 true 并且它成功了。 这里真正的问题是我不明白为什么代码不能只在 Player3 和 Player0 上工作
这是由事件传播引起的。 输入事件从最深的叶节点开始向上冒泡。
Main ^
- Player0 |
- Player1 | _input(event)
- Player2 |
- Player3 |
情况是当Player3
can_play
和左键单击输入事件开始向上传播场景树时。
Player3
接收左键单击输入事件。 它can_play
并向Main
发出信号来执行stuff()
。
stuff()
将can_play
设置为 false。stuff()
将current_player
设置为下一个玩家Player0
。Player2
接收左键单击输入事件。 它不能玩。Player1
接收左键单击输入事件。 它不能玩。Player0
接收左键单击输入事件。 它can_play
并向Main
发出信号来执行stuff()
。
Main
接收左键单击输入事件。处理输入事件后调用SceneTree.set_input_as_handled()
。
if input.is_action_pressed("left_click") and can_play:
emit_signal("thing")
get_tree().set_input_as_handled()
# Player.gd
func _ready():
connect("thing", get_parent(), "stuff")
这里的thing
信号连接应该是由父级连接的。 例如:
# Main.gd
func _ready():
for player in players:
player.connect("thing", self, "stuff")
这将Player.gd
与Main.gd
分离。 Player.gd
不再需要知道方法stuff()
。
通常,信号沿场景树向上,方法调用沿场景树向下。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.