2014-07-20 2 views
0

안녕하세요 충돌 감지를 사용하는 데 문제가 있습니다. 무슨 일이 일어나고 있는지는 발사체 (탄환)가 외계인에게 충돌하여 입자 스파크가 발생했을 때입니다. 문제는 때로는이 기능이 발사체와 몬스터를 섞어서 때때로 총알이 파괴되는 곳에서 불꽃을 생성한다고 생각합니다.SKSpriteNode에서 충돌 감지를 사용하는 데 문제가 있습니다.

Q. 어떤 스프라이트 히트를 결정합니까?

누구든지 조언을 해줄 수 있습니까?

- (void)projectile:(SKSpriteNode *)projectile didCollideWithMonster:(SKSpriteNode *)monster 
{ 

    [projectile removeFromParent]; 
    canfire = true; 

    NSString *path = [[NSBundle mainBundle]pathForResource:@"spark" ofType:@"sks"]; 
    SKEmitterNode *spark = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 
    spark.position = monster.position; 
    SKAction *pause = [SKAction waitForDuration:1.0]; 
    SKAction *remove = [SKAction removeFromParent]; 
    [spark runAction:[SKAction sequence:@[pause,remove]]]; 

    spark.position = monster.position; 
    [monster addChild:spark]; 
    [monster removeFromParent]; 
} 

예는 확실히 발사체와 몬스터가 혼합 점점 :

2014-07-20 19:56:35.279 Space Warz[9420:60b] First Body name = bullet 
2014-07-20 19:56:35.280 Space Warz[9420:60b] Hit 
2014-07-20 19:56:35.281 Space Warz[9420:60b] Monster Name: crystalship 
2014-07-20 19:56:40.878 Space Warz[9420:60b] Contact 
2014-07-20 19:56:40.879 Space Warz[9420:60b] First Body name = crystalship 
2014-07-20 19:56:40.880 Space Warz[9420:60b] Hit 
2014-07-20 19:56:40.881 Space Warz[9420:60b] Monster Name: bullet 
2014-07-20 19:56:43.845 Space Warz[9420:60b] Contact 
2014-07-20 19:56:43.846 Space Warz[9420:60b] First Body name = bullet 
2014-07-20 19:56:43.847 Space Warz[9420:60b] Hit 
2014-07-20 19:56:43.848 Space Warz[9420:60b] Monster Name: crystalship 
2014-07-20 19:56:43.855 Space Warz[9420:60b] Contact 
2014-07-20 19:56:43.856 Space Warz[9420:60b] First Body name = bullet 
2014-07-20 19:56:43.857 Space Warz[9420:60b] Hit 
2014-07-20 19:56:43.858 Space Warz[9420:60b] Monster Name: crystalship 
+0

# LearnCocos2D 무엇을 편집하셨습니까? – Mike

+1

발사체 및 몬스터 매개 변수와 같은 소리가 항상 '예상되는'것은 아닙니다. 그 메소드는 어디서 호출 되나요? 그 코드를 게시하십시오. 당신이 가지고있는 방법은 매개 변수와 일치하는 올바른 객체를 전달한다는 가정을 결정하는 것이 아닙니다. – prototypical

+0

didCollideWithMonster 메서드는 어떻게 호출합니까? – ZeMoon

답변

0

당신이 당신이 -didBeginContact 방법에서 매개 변수로받는 몸을 정렬되지 않은 것을 날 것으로 보인다.

contact 개체의 bodyAbodyB 속성에는 연락처 담당자가 호출 될 때마다 반드시 동일한 유형의 본문이 포함될 필요는 없습니다. 귀하의 경우 contact.bodyAcontact.bodyB은 모두 발사체 또는 괴물 노드를 포함 할 수 있습니다. 다음과 같이

당신은 몸을 정렬 할 수 있습니다 위의 코드에서

-(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; 
    } 

    //Implement relevant code here. 

} 

을, 당신은 firstBody 및 secondBody을 전달하여 -didCollideWithMonster를 호출 할 수 있습니다. 관련된 두 개의 비트 마스크 범주 중에서 낮은 vue를 가진 것이 firstBody가되고 높은 값을 갖는 것이 secondBody가됩니다.

answer도 살펴보십시오.

관련 문제