我想我的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;
此外,術語「碰撞檢測」不適用於這些類型的項目(SpriteKit項目),可能會引起混淆。說到檢測,通常會說「接觸檢測」。碰撞時,可以說「碰撞應該發生或不應該發生」,因爲你不檢測碰撞,而是碰觸(didBeginContact檢測聯繫人,並且沒有didBeginCollision方法)。 – Whirlwind
例如,即使禁用了接觸檢測(didBeginContact不會被調用),也可以啓用碰撞(正常物理模擬,其中碰撞時身體彈跳等)。此外,您只能啓用接觸檢測(將調用didBeginContact方法),但碰撞(逼真的物理模擬)將被禁用。或者你可以同時擁有它們。仍然有接觸和碰撞之間的差異,並沒有像「碰撞檢測」(而是接觸檢測)這樣的事情 – Whirlwind