2013-11-28 55 views
1

我在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?

+0

對第二個問題的回答:collisionBitMask屬性默認設置了所有位,所以節點將與場景中的每個物理對象碰撞 –

+0

順便說一句,Red Car.png的大小是多少? –

+0

謝謝。這兩個車圖像是52×94. – beev

回答

5

collisionBitMask的默認值是0xFFFFFFFF(所有位設置)。因此節點將與場景中的每個physicBody相沖突。

+1

謝謝。我只是需要更改我的控制檯以顯示「所有輸出」以查看didBeginContact:何時被調用。 – beev

+0

@beev我不明白你是否解決了這個問題?我已將所有輸出設置爲我的控制檯 – 4GetFullOf

+1

在我的控制檯左下角,我將其設置爲調試器輸出,這就是爲什麼我沒有看到我期望從我的代碼獲得的NSLog。當我將它切換到全部輸出時,我看到了我期待的。如果您的場景設置如上,則在調用didBeginContact時(即遇到碰撞時),應該在控制檯中記錄「聯繫人」。 – beev

0

只是一個小小的觀察,也許你應該設置你的節點,並在場景的didMoveToView方法中設置聯繫人委託。

如果這樣不能解決問題,你有可能會發布一些工作代碼給github進行調試嗎?

+0

謝謝。我曾嘗試在didMoveToView中設置委託,但它沒有任何區別。 – beev

0

幫助我的這件事:碰撞和接觸是不同的事情。

碰撞由物理引擎處理,並設置collisionBitMask將確定哪些物體在物理世界中相互碰撞並相互作用。默認情況下,你所有的身體會相互碰撞,這是有道理的。

聯繫人是事件 - 當主體進行聯繫時,他們是否會創建一個通知,您可以在委託方法中使用該通知來執行更有趣的事情。如果你有一個球,你想用槳擊中,你希望他們至少碰撞。但是如果你有一個球在雲中移動,你可能不希望它們在物理世界中碰撞,但你可能想註冊這個聯繫人。