2013-12-13 4 views
12

저는 스프라이트 키트로 간단한 게임을 만들려고합니다. 기본 아이디어는 블록을 피하기 위해 점프 할 수있는 한 명의 플레이어가 있다는 것입니다. 그러나 나는 플레이어가 블록을 치고 플레이어가 사라지고 혈액 애니메이션이 시작될 때 어떻게하는지 모르는 문제가 있습니다. 우선이 코드가 사과 웹 사이트에서 찾은 코드가 무엇인지 이해하지 못합니다.스프라이트 키트의 충돌 감지

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

나는 didBeginContact 함수를 호출하고 NSLOG ("호출 함수를 수행 했음")를 넣었습니다. 하지만 내 디버거에서 출력을받지 못했습니다. 여기

내 _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

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

충돌 처리는 약간 지저분합니다. :) 접근법에는 여러 가지가 있지만 처음부터 시작해야하는 곳은 Apple의 상당히 간단한 예제 인 this입니다. readme는 좋은 소개 정보를 제공하며, 코드를 훑어 볼 수 있습니다.

또 다른 접근법 (Apple에서 가이드에 언급)은 Double Dispatching (긴 설명은 wikipedia 참조)을 사용하는 것입니다. 그러나 나는 그 접근을 당장 그만 두려고 노력하지는 않을 것입니다. 동적 선택기 및 이와 유사한 기법에 따라 마법을 사용할 수있는 다소 고급 방법입니다. 그러나 그 경고가 있더라도, 누군가가 그것을 어떻게하는지에 대한 간단한 예를 찾을 수 있습니다. 많은 설명이 있습니다. here.

관련 문제