我在Sprite套件中使用了碰撞檢測。它正在工作並阻止我的小精靈穿越路徑。但是,我沒有在didBeginContact中獲得通知:並且我似乎沒有任何控制物理引擎在發生衝突時的響應方式。Sprite套件中的碰撞檢測
我有各種汽車(SKSpriteNodes)中移動後續的使用SKAction followPath路徑:asOffset:orientToPath:時間:
以前,如果兩輛車越過道路,他們將都只是繼續用一個驅動比其他正常。要實現碰撞檢測我已經做了以下修改......
將此添加到我的@interface:
<SKPhysicsContactDelegate>
將此添加到我的@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屬性默認設置了所有位,所以節點將與場景中的每個物理對象碰撞 –
順便說一句,Red Car.png的大小是多少? –
謝謝。這兩個車圖像是52×94. – beev