SKSpriteNode坚持使用init(edgeLoopF​​rom :) - SKPhysicsBody

Dew*_*wan 2 sprite-kit skphysicsbody skspritenode swift

我在下面有一个名为"Floor"的单独课程.

class Floor: SKNode {
    override init() {
        super.init()
        //let edgeFrame = CGRect(origin: CGPoint(x: 1,y: 1), size: CGSize(width: 1078, height: 1950))
        //self.physicsBody = SKPhysicsBody(edgeLoopFrom: edgeFrame)

        let borderBody = SKPhysicsBody(edgeLoopFrom: self.frame)
        borderBody.friction = 0
        self.physicsBody = borderBody

        // Apply a physics body to the node
       // self.physicsBody?.isDynamic = false

        // Set the bit mask properties
        self.physicsBody?.categoryBitMask = floorCategory
        self.physicsBody?.contactTestBitMask = nailDropCategory
        self.physicsBody?.collisionBitMask = balloonCategory
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemted")
    }
}
Run Code Online (Sandbox Code Playgroud)

我基本上已经下降了SKSpriteNode,它从屏幕顶部开始,然后到达触及"Floor"的底部并移除自身,然后再次从顶部重新开始.我遇到的问题是我的所有SKSpriteNode一直卡在最顶层而不是掉落在屏幕边框周围.如何告诉我的应用程序忽略这些特定节点并让它们进入?感谢任何帮助!


这是在屏幕上左右移动的对象,但它只是在没有edgeLoop的情况下从屏幕的一侧掉落

if let accelerometerData = motionManager.accelerometerData {
            if UIDevice.current.orientation == UIDeviceOrientation.landscapeLeft {
                balloon.physicsBody?.velocity = CGVector(dx: accelerometerData.acceleration.x * -500.0, dy: 0)
            } else {
                balloon.physicsBody?.velocity = CGVector(dx: accelerometerData.acceleration.x * 500.0, dy: 0)
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

Ron*_*huk 5

发生的事情是你的物体击中了边缘循环的顶部边界而无法进入场景.

有几种方法可以做到这一点,如果你绝对需要两侧的边缘循环我建议将循环拉长到高于场景并在循环内但在可见区域上方创建对象.但是,由于你没有给出任何关于你实际上需要两侧环路的指示,我所做的就是摆脱边缘环路检测.

创建一个框,它是场景的宽度,然后说100px高,然后在其上放置一个物理体floorCategory.然后把这个盒子放在屏幕底部下方50像素处.假设您的地板精灵盒的anchorPoint为0.5,0.5,这将隐藏屏幕下方的框,并且框的顶部将与屏幕底部齐平.

现在,您将能够检测到对象何时到达屏幕底部,您将不再需要担心它们通过顶部的边缘循环.

要么

延长循环的一个例子是......

您创建一个比屏幕更高的矩形(图像中的绿色边框)来应用边缘循环,而不是屏幕尺寸本身

在此输入图像描述