Search code examples
swiftsprite-kitskphysicsbody

Custom physics body adding unwanted extra line


I have made a node with three custom physics bodies, the problem however is that there is for each physics body an extra line.

I it possible to remove these lines? The lines that I would like to remove are circled with red.

I have made the physics bodies with this editor.

With the paths I have created this code (swift & sprite kit):

//Wheel
    let wheel = SKSpriteNode(imageNamed: "wheel")
    let scaleWheel = frame.width / wheel.frame.width * 0.8
    wheel.name = "wheel"
    wheel.position = view.center

    //Scale constants
    let sprite = SKSpriteNode()
    sprite.position = CGPointMake(CGRectGetMidX(frame), CGRectGetMidY(frame))
    let offsetX: CGFloat = sprite.frame.size.width * sprite.anchorPoint.x
    let offsetY: CGFloat = sprite.frame.size.height * sprite.anchorPoint.y

    //path
    let path: CGMutablePathRef = CGPathCreateMutable()

    CGPathMoveToPoint(path, nil, -172 - offsetX, 143 - offsetY)
    CGPathAddLineToPoint(path, nil, -151 - offsetX, 122 - offsetY)
    CGPathAddLineToPoint(path, nil, -167 - offsetX, 100 - offsetY)
    CGPathAddLineToPoint(path, nil, -178 - offsetX, 81 - offsetY)
    CGPathAddLineToPoint(path, nil, -186 - offsetX, 60 - offsetY)
    CGPathAddLineToPoint(path, nil, -191 - offsetX, 38 - offsetY)
    CGPathAddLineToPoint(path, nil, -193 - offsetX, 16 - offsetY)
    CGPathAddLineToPoint(path, nil, -193 - offsetX, -7 - offsetY)
    CGPathAddLineToPoint(path, nil, -193 - offsetX, -25 - offsetY)
    CGPathAddLineToPoint(path, nil, -188 - offsetX, -47 - offsetY)
    CGPathAddLineToPoint(path, nil, -182 - offsetX, -69 - offsetY)
    CGPathAddLineToPoint(path, nil, -173 - offsetX, -88 - offsetY)
    CGPathAddLineToPoint(path, nil, -164 - offsetX, -105 - offsetY)
    CGPathAddLineToPoint(path, nil, -151 - offsetX, -124 - offsetY)
    CGPathAddLineToPoint(path, nil, -134 - offsetX, -143 - offsetY)
    CGPathAddLineToPoint(path, nil, -150 - offsetX, -168 - offsetY)
    CGPathAddLineToPoint(path, nil, -170 - offsetX, -147 - offsetY)
    CGPathAddLineToPoint(path, nil, -190 - offsetX, -121 - offsetY)
    CGPathAddLineToPoint(path, nil, -207 - offsetX, -89 - offsetY)
    CGPathAddLineToPoint(path, nil, -218 - offsetX, -58 - offsetY)
    CGPathAddLineToPoint(path, nil, -224 - offsetX, -23 - offsetY)
    CGPathAddLineToPoint(path, nil, -224 - offsetX, 25 - offsetY)
    CGPathAddLineToPoint(path, nil, -216 - offsetX, 62 - offsetY)
    CGPathAddLineToPoint(path, nil, -208 - offsetX, 85 - offsetY)
    CGPathAddLineToPoint(path, nil, -192 - offsetX, 116 - offsetY)

    CGPathCloseSubpath(path)

    //pathTwo
    let pathTwo: CGMutablePathRef = CGPathCreateMutable()

    CGPathMoveToPoint(pathTwo, nil, -93 - offsetX, 170 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, -117 - offsetX, 193 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, -93 - offsetX, 205 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, -66 - offsetX, 215 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, -43 - offsetX, 221 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, -21 - offsetX, 224 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, -2 - offsetX, 226 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, 22 - offsetX, 226 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, 46 - offsetX, 221 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, 63 - offsetX, 216 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, 85 - offsetX, 209 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, 111 - offsetX, 197 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, 137 - offsetX, 179 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, 160 - offsetX, 160 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, 181 - offsetX, 135 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, 200 - offsetX, 106 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, 214 - offsetX, 74 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, 223 - offsetX, 37 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, 192 - offsetX, 37 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, 186 - offsetX, 65 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, 170 - offsetX, 99 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, 139 - offsetX, 137 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, 95 - offsetX, 169 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, 46 - offsetX, 191 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, -4 - offsetX, 195 - offsetY)
    CGPathAddLineToPoint(pathTwo, nil, -61 - offsetX, 183 - offsetY)

    CGPathCloseSubpath(pathTwo)

    //pathThree
    let pathThree: CGMutablePathRef = CGPathCreateMutable()

    CGPathMoveToPoint(pathThree, nil, 192,-38 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, 223,-38 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, 219,-61 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, 209,-91 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, 196,-116 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, 176,-145 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, 149,-172 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, 111,-198 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, 79,-213 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, 46,-222 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, 15,-227 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, -19,-226 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, -49,-222 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, -71,-216 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, -87,-209 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, -72,-183 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, -39,-194 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, 5,-197 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, 52,-189 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, 99,-170 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, 141,-136 - offsetY)
    CGPathAddLineToPoint(pathThree, nil, 176,-87 - offsetY)

    CGPathCloseSubpath(pathThree)

    //Physics bodies
    let bodyOne = SKPhysicsBody(polygonFromPath: path)
    let bodyTwo = SKPhysicsBody(polygonFromPath: pathTwo)
    let bodyThree = SKPhysicsBody(polygonFromPath: pathThree)

    wheel.physicsBody = SKPhysicsBody(bodies: [bodyOne, bodyTwo, bodyThree])
    wheel.physicsBody!.angularDamping = 5
    wheel.physicsBody?.pinned = true
    wheel.physicsBody?.affectedByGravity = false
    wheel.physicsBody?.restitution = 1
    wheel.setScale(scaleWheel)
    addChild(wheel)

Picture of the problem


Solution

  • Found it! I did some extra research and this post came up.

    The solution:

    Use bodyWithEdgeLoopFromPath: or bodyWithEdgeChainFromPath: to be able to create concave collision shapes. These bodies will not be dynamic and won't be able to move by themselves but they are the perfect solution for arbitrary collision shapes with a static playfield.