Хотите, чтобы ярлык отображался при столкновении мячей в приложениях cocos2d и box2d - PullRequest
0 голосов
/ 15 апреля 2011

Я использую _world-> step (dt, 5,5), чтобы обнаружить систему столкновений. Таким образом, столкновение фактически обрабатывается классами box2d. Теперь я хочу показать счет при столкновении шаров в зависимости от того, с каким мячом он столкнулся?

Может кто-нибудь помочь мне с этим? Если вы, ребята, хотите, я могу предоставить исходный код функции тика, если требуется.

Ваша помощь приветствуется.

Спасибо,

Ankita

Ответы [ 4 ]

1 голос
/ 15 апреля 2011

Во-первых, создайте подкласс класса C ++ b2ContactListener, например:

class GamePhysicsContactListener : public b2ContactListener 
{
public:
    GamePhysicsContactListener();   
    ~GamePhysicsContactListener();  
    void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse);

};

Реализуйте метод PostSolve для проверки двух тел, которые находятся в контакте, используя:

b2Body *bodyA = contact->GetFixtureA()->GetBody();
b2Body *bodyB = contact->GetFixtureB()->GetBody();

И, наконец, создайте экземпляр слушателя, вызвав строку ниже в методе, в котором вы создаете экземпляр b2World (наиболее вероятно в вашем методе CCLayer init):

_world->SetContactListener(new GamePhysicsContactListener());

p / s: вместовыполняя логику проверки контактов в классе GamePhysicsContactListener, вы также можете заставить этот класс принимать цель и селектор, который будет вызываться с помощью NSInvocation.Это было бы немного сложнее.

РЕДАКТИРОВАТЬ:

Вот рабочая реализация GamePhysicsContactListener: https://gist.github.com/922824 (это часть моей частной платформы GamePhysics, которая соединяет Cocos2D и Box2Dклассы)

0 голосов
/ 05 мая 2011

Я столкнулся с той же проблемой.Я хотел показать метку, когда игрок ударяет власть.Для этого я создал статическую функцию в CCScene, которая добавляет метку на сцену.А в ContactListener я инициализировал объект сцены в методе beginContact, а затем вызвал функцию сцены.

+(void)addPointLabel  
{  
    DataClass *d5=[DataClass getInstance];  
   [_label setString:@"+10"];        // Define label in init  
    _label.color = ccc3(0,255,0);  
    _label.position = ccp(d5.playerXPosition,d5.playerYPosition);  
    [self addChild:_label];  
    d5.lbl=_label;  
    id action1 = [CCMoveTo actionWithDuration:2 position:ccp(d5.playerXPosition,d5.playerYPosition+20)];  
    id action2 = [CCFadeOut actionWithDuration:1.0f];  
    [_label runAction: [CCSequence actions:action1,action2,  nil]];    
}  

Теперь вызовите этот метод в вашем классе ContactListener:

[GameScene addPointLabel];  
0 голосов
/ 16 апреля 2011

Вот метод, который я использую, чтобы показать небольшую анимацию при столкновении.Его можно довольно легко изменить, чтобы он отображал метку вместо анимации.

-(void) paintCollisionImage:(CGPoint) point{

CGSize screenSize = self.view.bounds.size;

CGRect myImageRect = CGRectMake((point.x -24), ((screenSize.height - point.y) -24), 48.0f, 48.0f);

NSArray *myImages = [NSArray arrayWithObjects: 
    [UIImage imageNamed:@"collideImage0.png"], 
    [UIImage imageNamed:@"collideImage1.png"], 
                     nil];
UIImageView *myAnimatedView = [UIImageView alloc]; 

[myAnimatedView initWithFrame:myImageRect]; 
myAnimatedView.animationImages = myImages; 
myAnimatedView.animationDuration = 0.25; // seconds 
myAnimatedView.animationRepeatCount = 1; // 0 = loops forever 

[myAnimatedView startAnimating]; 
[self.view addSubview:myAnimatedView]; 
[myAnimatedView release];

}

Я называю это так:

[self paintCollisionImage:collisionPoint];
0 голосов
/ 15 апреля 2011

создать приспособление для каждого тела и в функции галочки проверить на столкновение ...

if((contact.fixtureA == fixture1 && contact.fixtureB == fixture2) ||
(contact.fixtureA == fixture2 && contact.fixtureB == fixture1))
{
//do something
}

Надеюсь, это поможет !!!!

...