【问题标题】:SpriteKit - Player inside of ObjectSpriteKit - 对象内的播放器
【发布时间】:2018-01-26 21:23:52
【问题描述】:

我目前正在从事 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 内的节点在主场景坐标系中的位置?

【问题讨论】:

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


    【解决方案1】:

    基本上我保留了我最初的解决方案,因为我只是在用户更改角色状态时检查玩家是否在块内。这使得代码非常高效,因为它也只检查此时正在接触玩家的节点。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      相关资源
      最近更新 更多