更新具有相同名称的多个Spritekit节点

3

我目前正在使用Spritekit和Swift3制作一款游戏,这是一款2D的横向卷轴无尽奔跑游戏。我试图让某些节点随着我的相机移动,但问题在于它们将会是程序生成的,并属于同一类,因此我需要它们都有相同的名称。在我继续之前,这是相关代码的片段:

(所有变量都已初始化)

//让这些节点随相机移动

private var ChoosePieces: ChoosePiecesClass?;

override func didMove(to view: SKView) {
        initializeGame();
}

override func update(_ currentTime: TimeInterval) {
    enumerateChildNodes(withName: "ChoosePieces") {
        node, stop in
        _ = node as! SKSpriteNode

        self.ChoosePieces?.moveWithCamera();

    }
}

private func initializeGame() {
    ChoosePieces = childNode(withName: "ChoosePieces") as? ChoosePiecesClass;
}

我已经测试了moveWithCamera()函数,它很好用——它只是简单地将节点的x值增加了10,与相机以相同的速度移动,因此节点始终保持在屏幕上相同的位置。
我的问题是,我不确定如何在我的节点中使用enumerateChildNodes(withName: "String")函数,以便它能识别所有节点并移动它们。现在这些元素只是静止不动。我从另一个人的帖子中找到了这个函数,他/她试图在游戏中生成“敌人”。谢谢您的帮助!

你面临的实际问题是什么?如果你想枚举所有具有特定名称的节点,只需给它们相同的名称,并根据它们的父级适当地枚举即可。 - Whirlwind
请查看高级搜索: https://developer.apple.com/reference/spritekit/sknode#1654468。同时,请确保self.ChoosePieces不是nil,并且它有一个预期的值... - Whirlwind
你好,很抱歉我的说法不够清晰,我是新手。问题在于项目构建正常,但名为“ChoosePieces”的节点根本没有移动。为测试目的,我手动放置了5个名为“ChoosePieces”的节点在同一SKScene中。我确定枚举函数编写有误,但我不知道如何或在哪里进行更改。 - Ardemis
1
感谢您的帮助!一旦有时间,我将尝试使用断点进行调试,并在此汇报结果,如果我无法解决它。 - Ardemis
你能展示一下 moveWithCamera() 方法是做什么的吗? - Whirlwind
显示剩余3条评论
1个回答

4
通常使用enumerateChildNodes时,您会对返回的节点进行某些操作,例如修改您自己的示例:
override func update(_ currentTime: TimeInterval) {
    enumerateChildNodes(withName: "ChoosePieces") {
        node, stop in
        if let piece = node as? SKSpriteNode { // Cast to Sprite if we can
            piece.moveWithCamera()
        }
    }
}

因此,对于返回的每个节点,我们将其转换为一个名为“piece”的新SKSpriteNode(如果可以使用“as?”运算符进行转换 - 因为enumerateChildNodes返回SKNodes),然后在'piece'节点上调用moveWithCamera。
(我编写了“piece.moveWithCamera()”这一行代码 - 您的原始代码似乎是调用类方法(?)来执行某些操作。您可能需要使用“self.moveWithCamera(piece)”等代码)
在您的代码中,您没有对枚举返回的节点执行任何操作。

嗨,感谢您的帮助!我尝试了这个,但在包含“if let piece = node as!SKSpriteNode”的行上出现了一个错误,它说条件绑定的初始化器必须具有可选类型,而不是SKSpriteNode。 - Ardemis
只需将“as!”更改为“as?”@Ardemis - Whirlwind
嘿,抱歉回复晚了。这个方法很有效,感谢大家的帮助! - Ardemis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接