I am detecting contacts from a ball and two edges of the screen (left and right one) For that purpose I created: – SKSpriteNode *ball – SKNode *leftEdge – SKNode *rightEdge
Here I am setting up the bit masks
static const uint32_t kCCBallCategory = 0x1 << 0;
static const uint32_t kCCEdgeCategory = 0x1 << 1;
Here I am adding the edges
leftEdge.physicsBody = [SKPhysicsBody bodyWithEdgeFromPoint:CGPointZero toPoint:CGPointMake(0.0, self.size.height)];
leftEdge.position = CGPointZero;
leftEdge.physicsBody.categoryBitMask = kCCEdgeCategory;
[self addChild:leftEdge];
Right edge is added exactly the same, except it has different name and position is set to
rightEdge.position = CGPointMake(self.size.width, 0.0);
Here I am configuring and adding the ball
ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:6.0];
ball.physicsBody.categoryBitMask = kCCBallCategory;
ball.physicsBody.collisionBitMask = kCCEdgeCategory;
ball.physicsBody.contactTestBitMask = kCCEdgeCategory;
[_mainLayer addChild:ball];
Later in didBeginContact I am checking if first body is the ball and the second body is the edge and adding some explosion to it
SKPhysicsBody *firstBody;
SKPhysicsBody *secondBody;
if (firstBody.categoryBitMask == kCCBallCategory && secondBody.categoryBitMask == kCCEdgeCategory) {
// Collision between ball and the edge
[self addExplosion:contact.contactPoint withName:@"BallEdgeBounce"];
}
And the strange thing is – when the ball hits the left edge - code works fine and explosion effect added to the scene. But the right edge wont do the same. It came by surprise for me, because collisions works just fine. So why does the right edge behave like that? How do I fix this?
You could look at the project on the github, settings is done in GameScene.m file https://github.com/Fenkins/Space-Cannon