代码之家  ›  专栏  ›  技术社区  ›  Christian Schmidt

SpriteKit-对象内部的播放器

  •  0
  • Christian Schmidt  · 技术社区  · 7 年前

    我目前在一家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 回复  |  直到 7 年前
        1
  •  0
  •   Christian Schmidt    7 年前

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

    我还解决了剩下的问题,那就是我通过SKReferenceNode添加的节点使用了另一个坐标系,而不是播放器。 现在我只取SKReferenceNode的X位置,并将其添加到碰撞节点的X位置。这不是最好的解决方案,但效果很好。