2013-12-13 23 views
12

我想用sprite套件做一個簡單的遊戲。 其基本思想是有一名玩家可以跳躍以避開積木。 但是我有一個問題,我不知道如何讓玩家擊中區塊時玩家消失,血液動畫開始。 首先,我不明白這個代碼在蘋果網站上發現了什麼。探測sprite套件中的衝突

static const uint32_t blockCategory = 0x1 <<0; 
static const uint32_t playerCategory = 0x1 <<1; 

比我打電話didBeginContact函數,並在其中放入一個NSLOG(「did call function」)。 但我從來沒有收到我的調試器的輸出。

這是我_player和_block代碼: - (SKSpriteNode *)字符{

_player = [SKSpriteNode spriteNodeWithImageNamed:@"soldier_run1"]; 
_player.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:_player.size.width /2 -5]; 
_player.physicsBody.dynamic = YES; 
_player.physicsBody.usesPreciseCollisionDetection = YES; 
_player.physicsBody.friction = 0; 
_player.physicsBody.categoryBitMask = playerCategory; 
_player.physicsBody.collisionBitMask = blokCategory; 
_player.name = @"player"; 
SKAction *animAction = [SKAction animateWithTextures:playerTextures timePerFrame:0.1  resize:YES restore:YES]; 

我_player代碼:

[_player runAction:[SKAction repeatActionForever:animAction]]; 

return _player; 
} 
-(SKSpriteNode *)block { 
_blok = [[SKSpriteNode alloc] initWithColor:[SKColor blackColor] size:CGSizeMake(15, 40)]; 

//physics 
_blok.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_blok.size]; 
_blok.physicsBody.dynamic = NO; 
_blok.name = @"block"; 
_blok.physicsBody.categoryBitMask = blokCategory; 
_blok.physicsBody.collisionBitMask = playerCategory; 
SKAction *moveBlock = [SKAction sequence:@[ 
              [SKAction moveToX:-20 duration:2] ]]; 
[_blok runAction:moveBlock ]; 
return _blok; 
} 

而且我真的不明白什麼categoryBitMask和collisionBitMask做。 我有這個工作後,我想讓角色從屏幕上消失,血液動畫開始,但我不知道如何讓這種情況發生。我認爲你必須這樣做: 如果(_player & & _block didcollide){ } 但我不知道如何做到這一點。

+0

看到這個答案http://stackoverflow.com/questions/22495285/sprite-kit-collision-detection – Jeff

回答

18

categoryBitMask設置精靈所屬的類別,而collisionBitMask設置精靈可以與其碰撞而不通過它們的類別。

對於碰撞檢測,您需要設置contactTestBitMask。在這裏,您可以設置您希望在聯繫時調用聯繫人代理的精靈類別。

你已經做的是正確的。下面是你需要做一些補充:

_player.physicsBody.contactTestBitMask = blockCategory; 
_blok.physicsBody.contactTestBitMask = playerCategory; 

之後,實施接觸委託如下:

-(void)didBeginContact:(SKPhysicsContact *)contact` 
{ 
NSLog(@"contact detected"); 

SKPhysicsBody *firstBody; 
SKPhysicsBody *secondBody; 

if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) 
{ 
    firstBody = contact.bodyA; 
    secondBody = contact.bodyB; 
} 
else 
{ 
    firstBody = contact.bodyB; 
    secondBody = contact.bodyA; 
} 

//Your first body is the block, secondbody is the player. 
//Implement relevant code here. 

} 

有關實現碰撞檢測一個很好的解釋,看看this教程。

4

處理碰撞有點麻煩。 :)有很多方法,但你應該從一個地方開始是this來自蘋果的一個相當簡單的例子。自述提供了一個很好的介紹,然後您可以開始探索代碼。

另一種方法(蘋果在他們的指南中提到)是使用Double Dispatching(請參閱維基百科,瞭解更長的說明)。然而,我不會試圖直接採用這種方法。這是一種有點高級的方法,因爲它依賴於動態選擇器和類似的技術來使魔法發生。然而,即使有這樣的警告,你可以找到一個簡單的例子,有人將如何做到這一點,以及大量的支持說明here