繁体   English   中英

脚本忽略设置为 false

[英]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和左键单击输入事件开始向上传播场景树时。

  1. Player3接收左键单击输入事件。 can_play并向Main发出信号来执行stuff()
    • stuff()can_play设置为 false。
    • stuff()current_player设置为下一个玩家Player0
  2. Player2接收左键单击输入事件。 它不能玩。
  3. Player1接收左键单击输入事件。 它不能玩。
  4. Player0接收左键单击输入事件。 can_play并向Main发出信号来执行stuff()
    • 这是问题。
  5. 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.gdMain.gd分离。 Player.gd不再需要知道方法stuff()

通常,信号沿场景树向上,方法调用沿场景树向下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM