2014-01-18 33 views
0

在這個項目中有兩個玩家,都可以射擊。當對方球員擊中一艘船時,它會降低他們的健康並消失,這很好。問題是我不希望船隻或子彈對彼此碰撞做出反應。如何讓SKSpriteNode只對某些衝突作出反應

下面是製作第一個球員代碼:

player = [SKSpriteNode spriteNodeWithImageNamed:filePath]; 
    player.size = CGSizeMake(100, 100); 
    player.position = CGPointMake(150, 250); 
    player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:player.size]; 
    player.physicsBody.categoryBitMask = playerCategory; 
    player.physicsBody.collisionBitMask = wallCategory; 
    player.physicsBody.friction = 1.0f; 
    player.physicsBody.restitution = 1.0f; 
    player.physicsBody.linearDamping = 1.0f; 
    player.physicsBody.allowsRotation = NO; 
    [self addChild:player]; 

及第2選手:

playerTwo = [SKSpriteNode spriteNodeWithImageNamed:filePath]; 
     playerTwo.size = CGSizeMake(100, 100); 
     playerTwo.position = CGPointMake((384*2)-150, (512*2)-250); 
     playerTwo.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:playerTwo.size]; 
     playerTwo.physicsBody.categoryBitMask = playerTwoCategory; 
     playerTwo.physicsBody.collisionBitMask = wallCategory; 
     playerTwo.physicsBody.friction = 1.0f; 
     playerTwo.physicsBody.restitution = 1.0f; 
     playerTwo.physicsBody.linearDamping = 1.0f; 
     playerTwo.physicsBody.allowsRotation = NO; 
     [self addChild:playerTwo]; 

類別的初始化:

static const uint32_t playerCategory = 2; 
static const uint32_t playerTwoCategory = 5; 
static const uint32_t wallCategory = 1; 
static const uint32_t bulletCategory = 4; 
static const uint32_t bulletTwoCategory = 7; 

的子彈播放製作一個:

SKSpriteNode * bullet = [SKSpriteNode spriteNodeWithColor:[UIColor whiteColor]  size:CGSizeMake(5, 5)]; 
    bullet.position = [gunOne convertPoint:CGPointMake(0,0) toNode:self]; 
    [self addChild:bullet]; 
    bullet.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:bullet.frame.size]; 
    bullet.physicsBody.categoryBitMask = bulletCategory; 
    bullet.physicsBody.dynamic = YES; 
    bullet.physicsBody.contactTestBitMask = playerTwoCategory | wallCategory; 
    bullet.physicsBody.collisionBitMask = wallCategory; 
    bullet.physicsBody.usesPreciseCollisionDetection = YES; 

子彈製作供玩家二:

SKSpriteNode * bulletTwo = [SKSpriteNode spriteNodeWithColor:[UIColor whiteColor] size:CGSizeMake(5, 5)]; 
    bulletTwo.position = [gunOneTwo convertPoint:CGPointMake(0,0) toNode:self]; 
    [self addChild:bulletTwo]; 
    bulletTwo.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:bulletTwo.frame.size]; 
    bulletTwo.physicsBody.categoryBitMask = bulletTwoCategory; 
    bulletTwo.physicsBody.dynamic = YES; 
    bulletTwo.physicsBody.contactTestBitMask = playerCategory | wallCategory; 
    bulletTwo.physicsBody.collisionBitMask = wallCategory; 
    bulletTwo.physicsBody.usesPreciseCollisionDetection = YES; 

是否與這樣做會導致僅僅是第一的球員,子彈反應碰撞過程中的任何可見的問題?在此先感謝您的幫助,併爲長時間閱讀而感到抱歉。

回答

0

'靜態常量uint32_t'是問題所在,它們實際上是對類別的順序進行統計,相反,您必須做的是值爲同一數字且高於子彈的數量,也必須是相同的數字。爲了在didBeginContact中區分它們,給每個名稱並使用它。

0

我會定義位和麪具是這樣的:

#define BIT_WALL  (0x01 << 0) // 0000 0001 
#define BIT_PLAYER_1 (0x01 << 1) // 0000 0010 
#define BIT_PLAYER_2 (0x01 << 2) // 0000 0100 
#define BIT_BULLET_1 (0x01 << 3) // 0000 1000 
#define BIT_BULLET_2 (0x01 << 4) // 0001 0000 

// Just Bit groups for players and bullets 
#define MASK_PLAYERS (BIT_PLAYER_1 | BIT_PLAYER_2) // 0000 0110 
#define MASK_BULLETS (BIT_BULLET_1 | BIT_BULLET_2) // 0001 1000 

// Players and bullets collide with wall, but not with each other 
#define COLLISION_MASK_WALL  (MASK_PLAYERS | MASK_BULLETS) 
#define COLLISION_MASK_PLAYER_1 (BIT_WALL) 
#define COLLISION_MASK_PLAYER_2 (BIT_WALL) 
#define COLLISION_MASK_BULLET_1 (BIT_WALL) 
#define COLLISION_MASK_BULLET_2 (BIT_WALL) 

// Contact is detected if anything hits wall, or, if bullet1 hits player2 (and vice versa) 
#define CONTACT_MASK_WALL   (MASK_PLAYERS | MASK_BULLETS) 
#define CONTACT_MASK_PLAYER_1  (BIT_WALL | BIT_BULLET_2) 
#define CONTACT_MASK_PLAYER_2  (BIT_WALL | BIT_BULLET_1) 
#define CONTACT_MASK_BULLET_1  (BIT_WALL | BIT_PLAYER_2) 
#define CONTACT_MASK_BULLET_2  (BIT_WALL | BIT_PLAYER_1) 


// Creating objects 
{ 
    wall.physicsBody.categoryBitMask = BIT_WALL; 
    wall.physicsBody.collisionBitMask = COLLISION_MASK_WALL; 
    wall.physicsBody.contactTestBitMask = CONTACT_MASK_WALL; 

    player1.physicsBody.categoryBitMask = BIT_PLAYER_1; 
    player1.physicsBody.collisionBitMask = COLLISION_MASK_PLAYER_1; 
    player1.physicsBody.contactTestBitMask = CONTACT_MASK_PLAYER_1; 

    bullet1.physicsBody.categoryBitMask = BIT_BULLET_1; 
    bullet1.physicsBody.collisionBitMask = COLLISION_MASK_BULLET_1; 
    bullet1.physicsBody.contactTestBitMask = CONTACT_MASK_BULLET_1; 

    player2.physicsBody.categoryBitMask = BIT_PLAYER_2; 
    player2.physicsBody.collisionBitMask = COLLISION_MASK_PLAYER_2; 
    player2.physicsBody.contactTestBitMask = CONTACT_MASK_PLAYER_2; 

    bullet2.physicsBody.categoryBitMask = BIT_BULLET_2; 
    bullet2.physicsBody.collisionBitMask = COLLISION_MASK_BULLET_2; 
    bullet2.physicsBody.contactTestBitMask = CONTACT_MASK_BULLET_2; 
} 
相關問題