2012-02-13 3 views
0

프로그래밍에 익숙하지 않은 나는 광선 wenderlich 튜토리얼을 시도했지만 여전히 혼란 스럽다.box2d 충돌 감지, 코드

나는 rock이라는 스프라이트와 player라는 스프라이트를 가지고 있는데, 그들 사이의 충돌을 감지하려고합니다. 그러나 나는 매우 혼란 스럽다. 도움이 필요해.

-(void)addRock { 

CCSprite *rock = [CCSprite spriteWithFile:@"rock.png" 
            rect:CGRectMake(0, 0, 27, 40)]; 

// Determine where to spawn the target along the X axis 
CGSize winSize = [[CCDirector sharedDirector] winSize]; 
int minX = rock.contentSize.width/2; 
int maxX = winSize.width - rock.contentSize.width/2; 
int rangeX = maxX - minX; 
int actualX = (arc4random() % rangeX) + minX; 

// Create the target slightly off-screen along the right edge, 
// and along a random position along the X axis as calculated above 
rock.position = ccp(actualX, 500); 
[self addChild:rock]; 

// Determine speed of the sprite 
int actualDuration = 5;//speed of sprite 

}

- (id)init { 

if ((self=[super init])) { 

     CGSize winSize = [[CCDirector sharedDirector] winSize]; 

     CCSprite *player = [CCSprite spriteWithFile:@"Player.png" 
            rect:CGRectMake(0, 0, 27, 40)]; 

     player.position = ccp(winSize.width/2, winSize.height/4+15); 

     [self addChild:player]; 

     [self schedule:@selector(gameLogicRock:) interval:0.2]; 

가 두 스프라이트, 그들은 산란을 제대로 위치, 난 단지 당신은 충돌에 대한 새로운 클래스를 구현하거나 접촉을 말할 필요가 충돌을

+0

코드를 수정하십시오. 그것은 복잡하고 읽을 수 없습니다. –

+0

괜찮아, 그냥 깔끔하게 ... 죄송합니다. – sahil

답변

1

을 감지 할 필요가 청취자는 몇 가지 기준을 태그 번호로 사용합니다. 나는 너에게 모범을 보인다.

// ContactListener.h

#import "Box2D.h" 

class ContactListener : public b2ContactListener 
{ 
private: 
    void BeginContact(b2Contact* contact); 
    void EndContact(b2Contact* contact); 
}; 

// ContactListener.mm

#import "ContactListener.h" 
#import "cocos2d.h" 
#import "BodyNode.h" 
#import "GameScene.h" 

void ContactListener::BeginContact(b2Contact* contact) 
{ 
    b2Body* bodyA = contact->GetFixtureA()->GetBody(); 
    b2Body* bodyB = contact->GetFixtureB()->GetBody(); 
    if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL) 
    { 
     BodyNode* bNodeA = (BodyNode*)bodyA->GetUserData(); 
     BodyNode* bNodeB = (BodyNode*)bodyB->GetUserData(); 

     if ((bNodeA.tag == GameSceneNodeTagBall && bNodeB.tag == GameSceneNodeTagHole) || 
      (bNodeA.tag == GameSceneNodeTagHole && bNodeB.tag == GameSceneNodeTagBall)) 
     { 
      switch (bNodeA.tag) { 
       case GameSceneNodeTagBall: 
        if ([bNodeA isKindOfClass:[Ball class]]) { 
         Ball* ball = (Ball*)bNodeA; 
         ball.sprite.visible = NO; 
         [[GameScene sharedGameScene] gameOver]; 
        } 
        break; 
       case GameSceneNodeTagHole: 
        if ([bNodeB isKindOfClass:[Ball class]]) { 
         Ball* ball = (Ball*)bNodeB; 
         ball.sprite.visible = NO; 
         [[GameScene sharedGameScene] gameOver]; 
        } 
        break; 

       default: 
        break; 
      } 
     } 
    } 
} 

이 공 구멍 충돌의 한 예이다. 귀하의 요구 사항에 따라 이것을 사용할 수 있습니다.

희망이 도움이 될 것입니다.

감사합니다.