fabian
fabian

Reputation: 5463

How to create SKPhysicsBody with holes?

I was wondering how I could create a more complex SKPhysicsyBody like this? I want to hittest againt the black parts.

enter image description here

I exported this shape with PaintCode to a CG Rect.

var barrierpath2Path = UIBezierPath()
        barrierpath2Path.moveToPoint(CGPointMake(52, 26))
        barrierpath2Path.addLineToPoint(CGPointMake(52, 26))
        barrierpath2Path.addCurveToPoint(CGPointMake(26, 52), controlPoint1: CGPointMake(52, 40.36), controlPoint2: CGPointMake(40.36, 52))
        barrierpath2Path.addLineToPoint(CGPointMake(26, 52))
        barrierpath2Path.addCurveToPoint(CGPointMake(0, 26), controlPoint1: CGPointMake(11.64, 52), controlPoint2: CGPointMake(0, 40.36))
        barrierpath2Path.addLineToPoint(CGPointMake(0, 26))
        barrierpath2Path.addCurveToPoint(CGPointMake(26, 0), controlPoint1: CGPointMake(0, 11.64), controlPoint2: CGPointMake(11.64, 0))
        barrierpath2Path.addLineToPoint(CGPointMake(26, 0))
        barrierpath2Path.addCurveToPoint(CGPointMake(52, 26), controlPoint1: CGPointMake(40.36, 0), controlPoint2: CGPointMake(52, 11.64))
        barrierpath2Path.closePath()
        barrierpath2Path.moveToPoint(CGPointMake(46.8, 26))
        barrierpath2Path.addLineToPoint(CGPointMake(46.8, 26))
        barrierpath2Path.addCurveToPoint(CGPointMake(39, 18.2), controlPoint1: CGPointMake(46.8, 21.69), controlPoint2: CGPointMake(43.31, 18.2))
        barrierpath2Path.addLineToPoint(CGPointMake(39, 18.2))
        barrierpath2Path.addCurveToPoint(CGPointMake(31.2, 26), controlPoint1: CGPointMake(34.69, 18.2), controlPoint2: CGPointMake(31.2, 21.69))
        barrierpath2Path.addLineToPoint(CGPointMake(31.2, 26))
        barrierpath2Path.addCurveToPoint(CGPointMake(39, 33.8), controlPoint1: CGPointMake(31.2, 30.31), controlPoint2: CGPointMake(34.69, 33.8))
        barrierpath2Path.addLineToPoint(CGPointMake(39, 33.8))
        barrierpath2Path.addCurveToPoint(CGPointMake(46.8, 26), controlPoint1: CGPointMake(43.31, 33.8), controlPoint2: CGPointMake(46.8, 30.31))
        barrierpath2Path.closePath()
        barrierpath2Path.moveToPoint(CGPointMake(27.3, 14.74))
        barrierpath2Path.addLineToPoint(CGPointMake(27.3, 14.74))
        barrierpath2Path.addCurveToPoint(CGPointMake(19.5, 6.94), controlPoint1: CGPointMake(27.3, 10.43), controlPoint2: CGPointMake(23.81, 6.94))
        barrierpath2Path.addLineToPoint(CGPointMake(19.5, 6.94))
        barrierpath2Path.addCurveToPoint(CGPointMake(11.7, 14.74), controlPoint1: CGPointMake(15.19, 6.94), controlPoint2: CGPointMake(11.7, 10.43))
        barrierpath2Path.addLineToPoint(CGPointMake(11.7, 14.74))
        barrierpath2Path.addCurveToPoint(CGPointMake(19.5, 22.54), controlPoint1: CGPointMake(11.7, 19.05), controlPoint2: CGPointMake(15.19, 22.54))
        barrierpath2Path.addLineToPoint(CGPointMake(19.5, 22.54))
        barrierpath2Path.addCurveToPoint(CGPointMake(27.3, 14.74), controlPoint1: CGPointMake(23.81, 22.54), controlPoint2: CGPointMake(27.3, 19.05))
        barrierpath2Path.closePath()
        barrierpath2Path.moveToPoint(CGPointMake(27.3, 37.26))
        barrierpath2Path.addLineToPoint(CGPointMake(27.3, 37.26))
        barrierpath2Path.addCurveToPoint(CGPointMake(19.5, 29.46), controlPoint1: CGPointMake(27.3, 32.95), controlPoint2: CGPointMake(23.81, 29.46))
        barrierpath2Path.addLineToPoint(CGPointMake(19.5, 29.46))
        barrierpath2Path.addCurveToPoint(CGPointMake(11.7, 37.26), controlPoint1: CGPointMake(15.19, 29.46), controlPoint2: CGPointMake(11.7, 32.95))
        barrierpath2Path.addLineToPoint(CGPointMake(11.7, 37.26))
        barrierpath2Path.addCurveToPoint(CGPointMake(19.5, 45.06), controlPoint1: CGPointMake(11.7, 41.57), controlPoint2: CGPointMake(15.19, 45.06))
        barrierpath2Path.addLineToPoint(CGPointMake(19.5, 45.06))
        barrierpath2Path.addCurveToPoint(CGPointMake(27.3, 37.26), controlPoint1: CGPointMake(23.81, 45.06), controlPoint2: CGPointMake(27.3, 41.57))
        barrierpath2Path.closePath()
        barrierpath2Path.miterLimit = 4;



        monster.physicsBody = SKPhysicsBody(polygonFromPath: barrierpath2Path.CGPath)

But the simulator shows just one hole (and the png behind)? What's wrong here? enter image description here

Upvotes: 1

Views: 225

Answers (1)

TheCodingArt
TheCodingArt

Reputation: 3429

You most likely want to make the holes child nodes with their own physics bodies. This will allow everything to have their own respective physics bodies and move in accordance to each other without any problems

To further elaborate on this answer, you might also be able to use the SKPhysicsBody convenience initializer to create a physics body off of the alpha values in a texture. This will incur a performance hit, but should do what you want it to.

l.physicsBody = SKPhysicsBody(texture: l.texture, size: l.size)

Upvotes: 2

Related Questions