我在Sprite Kit中使用碰撞检测.它正在工作并阻止我的精灵穿越路径.但是,我没有在didBeginContact中收到通知:我似乎无法控制物理引擎在发生碰撞时如何响应.
我有各种汽车(SKSpriteNodes)使用SKAction followPath在以下路径中移动:asOffset:orientToPath:duration:
以前,如果两辆车越过小路,他们都会像往常一样继续前行,一辆车越过另一辆.为了实现碰撞检测,我做了以下更改......
将此添加到我的@interface:
将此添加到我的@implementation中:
static const uint32_t carCategory = 0x1 << 0;
在我的init方法中添加了这个:
self.physicsWorld.contactDelegate = self; self.physicsWorld.gravity = CGVectorMake(0.0, 0.0);
我创造了我的蓝色汽车:
- (void)addBlueCar { _blueCar = [SKSpriteNode spriteNodeWithImageNamed:@"Blue Car.png"]; _blueCar.position = CGPointMake(818.0, -50.0); _blueCar.name = @"car"; [self addChild:_blueCar]; CGSize contactSize = CGSizeMake(_blueCar.size.width - 5.0, _blueCar.size.height - 5.0); _blueCar.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:contactSize]; _blueCar.physicsBody.categoryBitMask = carCategory; _blueCar.physicsBody.collisionBitMask = carCategory; _blueCar.physicsBody.contactTestBitMask = carCategory; }
我还创造了一辆红色汽车:
- (void)addRedCar { _redCar = [SKSpriteNode spriteNodeWithImageNamed:@"Red Car.png"]; _redCar = CGPointMake(818.0, -50.0); _redCar = @"car"; [self addChild: _redCar]; CGSize contactSize = CGSizeMake(_blueCar.size.width - 5.0, _blueCar.size.height - 5.0); _redCar.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:contactSize]; _redCar.physicsBody.categoryBitMask = carCategory; _redCar.physicsBody.collisionBitMask = carCategory; _redCar.physicsBody.contactTestBitMask = carCategory; }
还有其他车,但我只是使用这两个,直到我弄清楚问题是什么.我想通知任何两辆车之间的任何碰撞.这就是为什么我只使用一个类别carCategory.
第一个问题是我没有收到任何通知.我有这个但它从来没有记录任何东西到控制台:
- (void)didBeginContact:(SKPhysicsContact *)contact { NSLog(@"Contact"); }
第二个问题是,当两辆车越过小路时,他们会开始偏离路线.这没关系,但我似乎无法管理如何处理碰撞的任何方面.奇怪的是,当我对我的两种汽车制作方法都这样做时,没有任何改变:
- (void)addBlueCar { _blueCar = [SKSpriteNode spriteNodeWithImageNamed:@"Blue Car.png"]; _blueCar.position = CGPointMake(818.0, -50.0); _blueCar.name = @"car"; [self addChild:_blueCar]; CGSize contactSize = CGSizeMake(_blueCar.size.width - 5.0, _blueCar.size.height - 5.0); _blueCar.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:contactSize]; // _blueCar.physicsBody.categoryBitMask = carCategory; // _blueCar.physicsBody.collisionBitMask = carCategory; // _blueCar.physicsBody.contactTestBitMask = carCategory; }
碰撞检测仍然与两辆汽车评论的三条线相同.这对我来说似乎不对.当我也注释掉这一行时,碰撞检测才会停止:
_blueCar.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:contactSize];
所以我的主要问题是:为什么contactTest没有报告任何内容?我的第二个问题是:当我没有为任何汽车分配categoryBitMask,collisionBitMask或contactTestBitMask时,为什么会发生碰撞检测?
collisionBitMask
默认值为0xFFFFFFFF(所有位都设置).因此,节点将与physicBody
场景中的每个节点发生冲突.