如何使用Sprite Kit(Swift)中的内部为SKSpriteNode创建物理主体

时间:2018-01-13 17:02:07

标签: ios swift sprite-kit game-physics

我目前正在制作一款iOS游戏,其中一个球必须在由下图所定义的帧内反弹:

enter image description here

游戏依赖于以下方法自动创建物理主体并将其分配给游戏周围的框架。

frame.physicsBody = SKPhysicsBody(texture: frameTexture, size: frame.size)

然而,此代码指定一个包含图像外部而不是内部的主体,因此将空白内部视为实体对象。反过来,这意味着球不能在框架内,并在产生后立即被迫离开屏幕。

有没有办法让物理身体成为一个内部?

此处的另一篇文章:SpriteKit SKPhysicsBody with Inner Edges旨在做类似的事情,但不涉及自动环绕纹理(因此是新问题)

1 个答案:

答案 0 :(得分:1)

您可以使用 init(edgeLoopF​​rom:)初始化程序来实现内边缘摩擦。您可以使用以下代码:

 override func didMove(to view: SKView) {
    //Setup scene's physics body (setup the walls)
    physicsBody = SKPhysicsBody(edgeLoopFrom: frame)

    let back = SKSpriteNode(imageNamed: "1")
    back.position = CGPoint(x: frame.midX, y: frame.midY)
    back.size = CGSize(width: 500, height: 600)
    back.zPosition = -3
    let rect = CGRect(origin: CGPoint(x: -back.size.width/2, y: -back.size.height/2), size: back.size)
    back.physicsBody = SKPhysicsBody(edgeLoopFrom: rect)

    addChild(back)

    //Add Red ball "inside" the back sprite
    let red = SKShapeNode(circleOfRadius: 20)
    red.fillColor = .red
    red.strokeColor = .clear
    red.position = back.position
    red.physicsBody = SKPhysicsBody(circleOfRadius: 20)
    red.physicsBody?.restitution = 1
    red.physicsBody?.friction = 0
    red.zPosition = 1
    red.physicsBody?.affectedByGravity = false

    addChild(red)

    red.physicsBody?.applyImpulse(CGVector(dx: 20, dy: 15))

}

请按照Question进行操作,并查看下面给出的答案。

我正在提供项目here

的屏幕截图