SpriteKit - Object内的Player

时间:2018-01-26 21:23:52

标签: ios swift sprite-kit 2d collision-detection

我目前正在2D无尽的跑步者工作。在游戏中,您可以更改角色的状态,然后浏览对象。但是如果玩家在一个物体内,他不应该能够改变回另一个状态,直到他离开物体。

目前我正在检查这种状态:

    if((thePlayer.physicsBody?.allContactedBodies())! != [])
    {
        for object in (thePlayer.physicsBody?.allContactedBodies())!
        {
            guard let node = object.node
            else
            {
                return
            }

            // Player IN a Block?

            if  node.frame.minX < thePlayer.frame.maxX - 1 &&
                node.frame.maxX > thePlayer.frame.minX + 1 &&
                node.frame.maxY > thePlayer.frame.minY + 1 &&
                node.frame.minY < thePlayer.frame.maxY - 1
                {
                    //Player is IN a Block
                    isInBlock = true
                }

        }
    }

我对这个解决方案并不满意,因为我通过SKReferenceNode添加了新的关卡序列,并且该节点中的关卡对象不响应这种检查方式。

我认为这是因为SKReferenceNode内部的节点使用SKReferenceNode的坐标系,而玩家使用主坐标系。

无论如何,我不确定,如果这是最好的解决方案。 什么是更好的方法呢? 或者我怎么能至少解决SKReferenceNode问题?

编辑: 我改变了代码的结构,所以现在我只检查碰撞,只要玩家点击屏幕。 这仍然存在关于坐标系和SKReferenceNode打开的问题。 我仔细看了一下,现在我确信,这就是问题所在。

如何在主场景的坐标系中获取SKReferenceNode内部节点的位置?

1 个答案:

答案 0 :(得分:0)

基本上我保留了我的初始解决方案,因为我只是在用户改变角色状态时检查玩家是否在一个区块内。这使得代码非常有效,因为它也只检查在这一刻触及播放器的节点。

我还修复了剩下的问题,即我通过SKReferenceNode添加的节点使用了另一个坐标系而不是播放器。 现在我只取SKReferenceNode的X位置并将其添加到碰撞节点的X位置。不是最好的解决方案,但它的工作正常。