Search code examples
swiftsprite-kitcollision-detection

Swift Sprite Collision. Objects passing Through walls


I'm making a simple game(using Swift & SpriteKit), where I have a circle that can be dragged around. but the circle is not allowed to go through walls.

My collision BitMask works perfectly, but when I drag fast enough, the circle ends up going through the walls.

The Initialisation of the Player Sprite goes Like this:

func initPlayerSprite(){
        let playerTexture = SKTexture(imageNamed: "player.png")
        let originX = CGRectGetMidX(self.frame)
        let originY = CGRectGetMidY(self.frame)
        player = SKSpriteNode(texture: playerTexture, size: CGSize(width: 26, height: 26))

        player.position = CGPoint(x: originX , y: originY)

        player.physicsBody = SKPhysicsBody(circleOfRadius: playerTexture.size().height/2)
        player.physicsBody!.dynamic = true
        player.physicsBody?.allowsRotation = false

        player.physicsBody!.categoryBitMask = ColliderType.Player.rawValue
        player.physicsBody!.contactTestBitMask = ColliderType.Floor.rawValue + ColliderType.Gap.rawValue
        player.physicsBody!.collisionBitMask = ColliderType.Wall.rawValue + ColliderType.Floor.rawValue

        self.addChild(player)
    }

My code for moving the Sprite goes like this:

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?){

        var nodeTouched = SKNode()

        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)
            let dx = -player.position.x + location.x
            let dy = -player.position.y + location.y
            let movePlayer = SKAction.moveBy(CGVector(dx: dx, dy: dy), duration: 0.02)

        }
}

Any Idea how to make sure the collision detection work even at high velocities?


Solution

  • From your code its hard to judge. Why are you calling the collisions like

     ColliderType.Wall.rawValue + ColliderType....
    

    I haven't seen this before with a "+" as a separator, usually you use a "|" to separate them.

     ColliderType.Wall.rawValue | ColliderType....
    

    Using a plus should add the two values together and will not treat it as 2 collision types, as far as I understand. I might be wrong here.

    Also did you try using precise collision detection like so?

    ...physicsBody.usesPreciseCollisionDetection = true.
    

    Apple describes this bool as follows

    The default value is NO. If two bodies in a collision do not perform precise collision detection, and one passes completely through the other in a single frame, no collision is detected. If this property is set to YES on either body, the simulation performs a more precise and more expensive calculation to detect these collisions. This property should be set to YES on small, fast moving bodies.

    Not sure this is helping