Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 为什么同一SKNode层中的对象彼此不交互?_Swift_Sprite Kit - Fatal编程技术网

Swift 为什么同一SKNode层中的对象彼此不交互?

Swift 为什么同一SKNode层中的对象彼此不交互?,swift,sprite-kit,Swift,Sprite Kit,我使用SpriteKit的时间不到一年,所以直到最近我才将SKNodes用作层 我有一个SKNode层,保存所有的鱼和用户的位置,例如: var layerMainGame = SKNode() layerMainGame.zPosition = 50 layerMainGame.addChild(userPosition) layerMainGame.addChild(pipFish) addChild(layerMainGame) 用户是否触摸鱼的交互通过此功能处理,基本上是检查他们的帧是

我使用SpriteKit的时间不到一年,所以直到最近我才将SKNodes用作层

我有一个SKNode层,保存所有的鱼和用户的位置,例如:

var layerMainGame = SKNode()
layerMainGame.zPosition = 50
layerMainGame.addChild(userPosition)
layerMainGame.addChild(pipFish)
addChild(layerMainGame)
用户是否触摸鱼的交互通过此功能处理,基本上是检查他们的帧是否交叉:

if CGRectIntersectsRect(CGRectInset(node.frame, delta.dx, delta.dy), self.userPosition.frame) {
    print("You got hit by \(name).")
    gameOver()
}
它起作用了。userPosition和pipFish之间的交互是有效的。不起作用的是随着游戏进行而添加的鱼。我有一个函数,可以每隔一段时间产卵不同类型的鱼,如下所示:

func spawnNew(fish: SKSpriteNode) {
    layerMainGame.addChild(fish)
}
createHitCollisionFor("GoldPiranha", GameOver: model.gameOverImage["Gold"], delta: (dx: 50, dy: 50), index: 1)
用户和后来添加到同一层的鱼之间的交互不起作用。我可以直接通过他们,没有比赛结束。当我完全移除整个LayerMingName变量并像普通一样将它们添加到场景中时,所有的交互都会起作用。将它们全部添加到同一SKNode层不起作用

这是为每条鱼创建命中碰撞的函数

func createHitCollisionFor(name: String, GameOver gameOver: String!, delta: (dx: CGFloat, dy: CGFloat), index: Int = -1) {
    enumerateChildNodesWithName(name) { [unowned me = self] node, _ in
        if CGRectIntersectsRect(CGRectInset(node.frame, delta.dx, delta.dy), self.userPosition.frame) {
            me.gameOverImage.texture = SKTexture(imageNamed: gameOver)
            didGetHitActions()
            me.runAction(audio.playSound(hit)!)
            if index != -1 {
                me.trophySet.encounterTrophy.didEncounter[index] = true
            }
            print("You got hit by \(name).")
        }
    }
}
我这样称呼它:

func spawnNew(fish: SKSpriteNode) {
    layerMainGame.addChild(fish)
}
createHitCollisionFor("GoldPiranha", GameOver: model.gameOverImage["Gold"], delta: (dx: 50, dy: 50), index: 1)

当鱼不在层中时,它工作,但当鱼添加到层中时,它不工作。

将节点放置在节点树中时,其“位置”属性将其放置在其父节点提供的坐标系内

精灵套件使用从屏幕左下角(0,0)开始的坐标方向,x和y值随着向上和向右移动而增加

  • 对于SKScene,原点–
    anchorPoint
    的默认值为(0,0),对应于视图框架矩形的左下角。要将其更改为中心,可以指定(0.5,0.5)

  • 对于SKNode,坐标系原点由其
    锚点定义,锚点默认为(0.5,0.5),是节点的中心

在您的项目中,您已将
LayerMingame
添加到场景中,例如,他的锚点默认为(0.5,0.5),因此像您的鱼这样的子对象的原点是中心,如果更改鱼的位置,您可以看到它,如:

func spawnNew(fish: SKSpriteNode) {
    layerMainGame.addChild(fish)
    fish.position = CGPointZero // position 0,0 = parent center 
}
希望这有助于了解如何解决您的问题


更新:(更改主要问题后)

为了帮助您更好地理解发生了什么,我将立即给出一个示例:

override func didMoveToView(view: SKView) {
        var layerMainGame = SKNode()
        addChild(layerMainGame)

        let pipFish = SKSpriteNode(color: UIColor.yellowColor(), size: CGSizeMake(50,50))
        pipFish.name = "son"
        self.addChild(pipFish)

        let layerPipFish = SKSpriteNode(color: UIColor.yellowColor(), size: CGSizeMake(50,50))
        layerPipFish.name = "son"
        layerMainGame.addChild(layerPipFish)

        enumerateChildNodesWithName("son") { [unowned me = self] node, _ in
            print(node)
        }
}
输出

现在我将简单地更改行:

layerMainGame.addChild(layerPipFish)
与:

输出

发生了什么事?

正如您所看到的,Write As your and my code只打印直接添加到
self
中的孩子(因为实际上我们启动了
enumerateChildNodesWithName
,这等于启动
self.enumerateChildNodesWithName

如何在完整节点树中搜索?

如果您有一个名为“GoldPiranha”的节点,那么可以在名称前加一个//。因此,您可以搜索“//GoldPiranha”:


您是否将LayerMingame的大小和位置设置为与场景匹配?也许你需要将鱼的直肠平移到场景的坐标系中?我以前没有这样做过,但我只是测试了一下,没有区别。你在LayerMingame上设置了任何属性,这些属性也应用于它的子对象(你的鱼)吗像
dynamic=false
那样会影响他们的行为?不;除了添加到场景和z旋转之外,没有任何东西应用到层上,因为我根本没有使用SKPhysics。如果你没有使用物理,你如何检测碰撞?或者你所说的交互是什么意思?很有见地,但这并不能解释为什么当对象一次又一次地相交时不会调用碰撞。鱼从屏幕右侧产卵并向左移动。用户是一个小矩形。我可以在鱼的整个图像上来回拖动矩形,尽管精灵多次相交,但不会调用碰撞。这也不能解释为什么我添加到图层中的第一条鱼是我唯一能触摸到的鱼,而不是其他鱼。你有没有试着为你的交叉点函数设置断点?如果你产卵的第一条鱼与你的用户发生碰撞,那么所有其他的鱼都必须与它发生碰撞。我敢肯定,当你通过“第二个”(以及其他人)时,一定有一些错误使用fish函数与用户检查交叉点,但您的问题中没有足够的代码:请添加一些代码,以便我也可以帮助您处理交叉点。我等待您的进一步信息。当我不将fish添加到图层时,碰撞代码工作得非常完美。它们对每条鱼都使用相同的通用函数。我来编辑这个问题,谢谢!你解决了我的问题!我所要做的就是在LayerMingame上用名字来称呼孩子们,而不是像我最初那样称呼自己。