2016-03-20 41 views
1

我想我的spritenode有多個physicbodies。我使用bodyWithbodies並添加了phyisicbodies。但沒有檢測到碰撞。Spritekit bodyWithbodies does not work

下面的方法創建spritenode其中應該有更多physicbodies

-(void)spawnBrick 
{ 
    SKPhysicsBody *brickLeftEdge = [SKPhysicsBody bodyWithEdgeFromPoint:CGPointMake(brick.size.width - brick.size.width, brick.size.height - brick.size.height) toPoint:CGPointMake(brick.size.width - brick.size.width, brick.size.height)]; 
    brickLeftEdge.categoryBitMask = brickLeftEdgeCategory; 
    brickLeftEdge.contactTestBitMask = leftEdgeCategory; 

SKPhysicsBody *brickRightEdge = [SKPhysicsBody bodyWithEdgeFromPoint:CGPointMake(brick.size.width, brick.size.height - brick.size.height) toPoint:CGPointMake(brick.size.width, brick.size.height)]; 
brickRightEdge.categoryBitMask = brickRightEdgeCategory; 
brickRightEdge.contactTestBitMask = rightEdgeCategory; 

brick = [[BrickNodeOne alloc] init]; 
brick.name = @"Brick"; 

NSArray *array = [self objectForKeyedSubscript:@"Brick"]; 
BrickNodeOne *oldBrick; 
if ([array count] > 0) { 
    oldBrick = [array objectAtIndex:([array count]-1)]; 
} 
brick.position = CGPointMake(brick.size.width/2, (brick.size.height + oldBrick.position.y)-15); 
brick.physicsBody = [SKPhysicsBody bodyWithBodies:@[brickLeftEdge, brickRightEdge]]; 

    brick.physicsBody.collisionBitMask = 0; 
    [self addChild:brick]; 
} 

DidMoveToView我聲明瞭屏幕的碰撞檢測左和右邊緣與spritenode

// setup edges 
_leftEdge = [[SKNode alloc] init]; 
// heigt + 1000 = for spawned objects above screen 
_leftEdge.physicsBody = [SKPhysicsBody bodyWithEdgeFromPoint:CGPointMake(0.0, 0.0) toPoint:CGPointMake(0.0, self.size.height + 1000)]; 
_leftEdge.physicsBody.dynamic = NO; 
_leftEdge.physicsBody.categoryBitMask = leftEdgeCategory; 
_leftEdge.physicsBody.contactTestBitMask = brickLeftEdgeCategory; 
_leftEdge.position = CGPointZero; 
[self addChild:_leftEdge]; 

_rightEdge = [[SKNode alloc] init]; 
// heigt + 1000 = for spawned objects above screen 
_rightEdge.physicsBody = [SKPhysicsBody bodyWithEdgeFromPoint:CGPointMake(self.size.width, 0.0) toPoint:CGPointMake(self.size.width, self.size.height + 1000)]; 
_rightEdge.physicsBody.dynamic = NO; 
_rightEdge.physicsBody.categoryBitMask = rightEdgeCategory; 
_rightEdge.physicsBody.contactTestBitMask = brickRightEdgeCategory; 
[self addChild:_rightEdge]; 

以下代碼包含位掩碼信息:

我在頭部聲明SKPhysicsContactDelegate文件。設置委託在didMoveToView

static const uint32_t leftEdgeCategory   = 0x1 << 0; 
static const uint32_t rightEdgeCategory   = 0x1 << 1; 
static const uint32_t brickLeftEdgeCategory  = 0x1 << 2; 
static const uint32_t brickRightEdgeCategory = 0x1 << 3; 
static const uint32_t kCarCategory    = 0x1 << 4; 

信息發表評論

所以我改變了physicsbody從邊緣到矩形,檢測不幸的是沒有接觸。

SKPhysicsBody *brickLeftEdge = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(40, brick.size.height) center:CGPointMake((brick.size.width - brick.size.width) + 20 , self.size.height/2)]; 
brickLeftEdge.categoryBitMask = brickLeftEdgeCategory; 
brickLeftEdge.contactTestBitMask = leftEdgeCategory; 

SKPhysicsBody *brickRightEdge = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(40, brick.size.height) center:CGPointMake(brick.size.width - 20, brick.size.height/2)]; 
brickRightEdge.categoryBitMask = brickRightEdgeCategory; 
brickRightEdge.contactTestBitMask = rightEdgeCategory; 
+1

此外,術語「碰撞檢測」不適用於這些類型的項目(SpriteKit項目),可能會引起混淆。說到檢測,通常會說「接觸檢測」。碰撞時,可以說「碰撞應該發生或不應該發生」,因爲你不檢測碰撞,而是碰觸(didBeginContact檢測聯繫人,並且沒有didBeginCollision方法)。 – Whirlwind

+1

例如,即使禁用了接觸檢測(didBeginContact不會被調用),也可以啓用碰撞(正常物理模擬,其中碰撞時身體彈跳等)。此外,您只能啓用接觸檢測(將調用didBeginContact方法),但碰撞(逼真的物理模擬)將被禁用。或者你可以同時擁有它們。仍然有接觸和碰撞之間的差異,並沒有像「碰撞檢測」(而是接觸檢測)這樣的事情 – Whirlwind

回答

1

您遇到的問題與您使用靜態物理實體有關。這是一個從約bodyWithEdgeFromPoint: toPoint方法文檔:

的邊緣不具有體積或質量,並且總是如如果動態 屬性等於NO處理。 邊緣可能僅與基於體積的 物理機構相沖突。

僅當至少有一個物體被定義爲動態(基於體積的物理物體默認爲動態物體)時纔會發生碰撞。

+0

感謝您的迴應。我將spritenode邊緣切換成小矩形。它崩潰,編譯器告訴:沒有添加到數組(bodywithbody)。我使用bodyWithbodies的方式是對的嗎? – Nielsapp

+0

@Nielsapp用一個可以重現你所說的代碼的代碼來更新你的原始問題。我不能評論一些我沒有看到的東西:)或者問一個問題,如果問題不同於你的原始問題,或者編輯會讓一團糟:)另外,檢查錯別字和其他愚蠢的錯誤... – Whirlwind

+0

我編輯過我的問題在下面澄清。我認爲這是關於主題的,因爲這個問題與尚未運行的問題(bodyWithBodies)有關。 – Nielsapp