2013-12-13 6 views
12

私はスプライトキットを使って簡単なゲームを作ろうとしています。 基本的な考え方は、ブロックを回避するためにジャンプすることができる1人のプレイヤーがいることです。 しかし、私は問題を抱えています。プレイヤーがブロックに当たってプレイヤーが消えて血のアニメーションが始まると、それをどうやって作るのか分かりません。 まず、私はこのコードがリンゴのウェブサイトで見つけたことを理解していません。スプライトキットの衝突を検出する

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を理解していません行う。 私はその作業をしてから、キャラクターをスクリーンと血行アニメーションが消えるようにしたいと思っていますが、どうしたらいいか分かりません。私はあなたが何かをしなければならないと思う: if(_player & & _block didcollide){ } しかし、私はそれを正確に行う方法を知らない。

+0

この回答を見るhttp://stackoverflow.com/questions/22495285/sprite-kit-collision-detection – Jeff

答えて

18

カテゴリBitMaskはスプライトが属するカテゴリを設定しますが、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

衝突の処理はちょっと面倒です。 :)多くのアプローチがありますが、あなたが始めるべき場所の1つは、Appleのかなり簡単な例であるthisです。 readmeは優れたイントロを提供しています。コードを掘り下げ始めることができます。

もう1つのアプローチ(Appleがガイドで言及している)は、Double Dispatching(長いディスカッションについては、wikipediaを参照)を使用することです。私はしかし、アプローチをすぐにgrokしようとすることから始めません。マジックを有効にするためにダイナミックセレクタや類似のテクニックに依存するということは、やや高度なアプローチです。しかし、そのような警告があっても、誰かがどのようにそれを行うかについての簡単な例と、たくさんのサポートの説明hereを見つけることができます。