我已经看了,并找到了单次碰撞的答案,但我正在寻找一种方法来检测多种类型的碰撞。我正在制作一个我想要3次碰撞的游戏。用户平面与敌人子弹相撞,用户的子弹与敌机(我已经工作过)相撞,敌人子弹和用户子弹相撞。我已经设置并更正了所有categoryBitMask和contactTestBitMask。这是我的委托方法。
- (void) didBeginContact:(SKPhysicsContact *)contact {
SKPhysicsBody *firstBody, *secondBody;
if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
{
firstBody = contact.bodyA;
secondBody = contact.bodyB;
}
else
{
firstBody = contact.bodyB;
secondBody = contact.bodyA;
}
// if user plane hits enemy bullet
if ((firstBody.categoryBitMask == playerShipCategory) &&
(secondBody.categoryBitMask == enemyBulletCategory)) {
[self takeDamageByAmount:POINT_INCREMENTER];
[_enemyBullet removeFromParent];
SKAction *bounce = [SKAction sequence:@[
[SKAction fadeAlphaTo:.5 duration:.2],
[SKAction fadeAlphaTo:1.0 duration:.2],
[SKAction fadeAlphaTo:.5 duration:.2],
[SKAction fadeAlphaTo:1.0 duration:.2]
]];
[_playerPlane runAction:bounce];
}
// if the user bullet hits the enemy bullet
else if ((firstBody.categoryBitMask == bulletCategory) &&
(secondBody.categoryBitMask == enemyBulletCategory)) {
[_enemyBullet removeFromParent];
[_bullet removeFromParent];
}
// if bullet hits enemy ship - THIS ONE WORKS, but none of the others work for some reason
else if ((firstBody.categoryBitMask == bulletCategory) &&
(secondBody.categoryBitMask == enemyShipCategory)) {
[self gainPointsByAmoint:POINT_INCREMENTER];
[self projectile:(SKSpriteNode *)firstBody.node didCollideWithMonster:(SKSpriteNode *)secondBody.node];
}
}
答案 0 :(得分:6)
这应该可以使用它已经过测试和工作
//Define the collider Category
typedef NS_ENUM(uint32_t, CollisionType) {
enemyShipCategory = 0x1 << 0,
enemyBulletCategory = 0x1 << 1,
playerShipCategory = 0x1 << 2,
bulletCategory = 0x1 << 3,
};
// Set the category that this physics body belongs to
// and specify which categories of bodies cause intersection
// notifications with this physics body
ship.physicsBody.categoryBitMask = playerShipCategory;
ship.physicsBody.contactTestBitMask = enemyBulletCategory;
shipBullet.physicsBody.categoryBitMask = bulletCategory;
shipBullet.physicsBody.contactTestBitMask = enemyShipCategory | enemyBulletCategory;
enemy.physicsBody.categoryBitMask = enemyShipCategory;
enemy.physicsBody.contactTestBitMask = bulletCategory;
enemyBullet.PhysicsBody.categoryBitMask = enemyBulletCategory;
enemyBullet.physicsBody.contactTestBitMask = bulletCategory;
// And handle Collisions
- (void)didBeginContact:(SKPhysicsContact *)contact {
uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);
if (collision == (playerShipCategory | enemyBulletCategory)) {
SKNode *Ship, *bullet;
if (contact.bodyA.categoryBitMask == playerShipCategory) {
Ship = contact.bodyA.node;
bullet = contact.bodyB.node;
} else {
Ship = contact.bodyB.node;
bullet = contact.bodyA.node;
}
[self takeDamageByAmount:POINT_INCREMENTER];
[bullet removeFromParent];
SKAction *bounce = [SKAction sequence:@[
[SKAction fadeAlphaTo:.5 duration:.2],
[SKAction fadeAlphaTo:1.0 duration:.2],
[SKAction fadeAlphaTo:.5 duration:.2],
[SKAction fadeAlphaTo:1.0 duration:.2]
]];
[Ship runAction:bounce];
}
else if (collision == (bulletCategory | enemyBulletCategory)) {
[contact.bodyA.node removeFromParent];
[contact.bodyB.node removeFromParent];
}
else if (collision == (bulletCategory | enemyShipCategory)) {
SKNode *shipBullet, *enemyShip;
if (contact.bodyA.categoryBitMask == shipBullet) {
shipBullet = contact.bodyA.node;
enemyShip = contact.bodyB.node;
} else {
shipBullet = contact.bodyB.node;
enemyShip = contact.bodyA.node;
}
[self gainPointsByAmoint:POINT_INCREMENTER];
[self projectile:shipBullet didCollideWithMonster:enemyShip];
}
}
祝你好运!!