Reputation: 5463
I was wondering how I could create a more complex SKPhysicsyBody like this? I want to hittest againt the black parts.
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?
Upvotes: 1
Views: 225
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