ios - SpriteKit - 对象内部的播放器

标签 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 内的节点在主场景坐标系中的位置?

最佳答案

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

我还解决了剩下的问题,即我通过 SKReferenceNode 添加的节点使用了与玩家不同的坐标系。 现在我只需获取 SKReferenceNode 的 X 位置并将其添加到碰撞节点的 X 位置。不是最好的解决方案,但效果很好。

关于ios - SpriteKit - 对象内部的播放器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48469745/

相关文章:

ios - 如何获得移动的 SKSpriteNode 的位置?

ios - 当 HotSpot 通过 USB 开启时,可达性报告 Wifi

ios - 在我的 Apple Developer 订阅到期后,我的 Apple Wallet Pass 生成器还能工作吗?

ios - Realm + 对象映射器 + SwityJSON

ios - Swift 自定义后退按钮和目的地

swift - 以编程方式将 View Controller 分配给选项卡栏 Controller

swift - 在 Swift/SpriteKit 中使用 NSCoding 获取高分和生命周期分数

sprite-kit - 如何在 SpriteKit 中创建自定义混合模式

iphone - UIViews-masked-off-area-still-touchable

iphone - hitTesting 时是否可以避免 SuperViews?