Collision in Sprite Kit
This example is 3 characters, player, point(coin), enemy.
3 characters have each feature in Game.
Physics
World in Scene
We can apply physics world in Scene.
self.physicsWorld
Apply physics in object
Example
Wrap physics world to object
SKNode
self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.frame.size]; //self.physicsBody.allowsRotation = NO; //self.physicsBody.affectedByGravity = NO; // This is gravity setting
You need to set physicsBody in your object.
Collision Setting and Bit mask
Bit mask is important.
This bit mask is thing to decide collision behaviour
Each objects should have bit mask.
Bit mask Example
static const int playerCollisionBitMask = 0x01 << 0; static const int pointCollisionBitMask = 0x02 << 0; static const int enemyCollisionBitMask = 0x03 << 0; [/cpp] <h4>Parameters</h4> <b>SKNode</b> key parameters are <b>collisionBitMask, categoryBitMask, contactTestBitMask</b> Evaluation of collision is based on these parameters. Object A collisionBitMask categoryBitMask contactTestBitMask Object B collisionBitMask categoryBitMask contactTestBitMask To avoid collision in physics meaning, <b>collisionBitMask = 0</b>. Collision has happened when ObjectA categoryBitMask and <h4>Set Collision</h4> [cpp] objA.categoryBitMask = playerCollisionBitMask; objA.contactTestBitMask = pointCollisionBitMask | enemyCollisionBitMask; objB.categoryBitMask = pointCollisionBitMask; objB.contactTestBitMask = playerCollisionBitMask; objC.categoryBitMask = enemyCollisionBitMask; objC.contactTestBitMask = playerCollisionBitMask;
Contact SKPhysicsContactDelegate
To manage special collision behaviour, we need to implement SKPhysicsContactDelegate.
When collision has happened.
Prepare(set delegate)
.h
@interface GameScene : SKScene<SKPhysicsContactDelegate> @end
.m
@implementation GameScene - (id)initWithSize:(CGSize)size { if (self = [super initWithSize:size]) { // Setup here self.physicsWorld.contactDelegate = self; } return self; } #pragma mark - SKPhysicsContactDelegate - (void)didBeginContact:(SKPhysicsContact *)contact { // contact.bodyA.node : Node A This is SKNode class // contact.bodyB.node : Node B This is also SKNode class // This method is called when collision has happened } @end