想要在cocos2d和box2d应用程序中的球碰撞上显示标签

时间:2011-04-15 16:11:27

标签: iphone cocos2d-iphone box2d box2d-iphone

我正在使用_world->步骤(dt,5,5)来检测碰撞系统。所以碰撞实际上是由box2d类处理的。现在我想根据碰撞的球来显示球碰撞得分?

任何人都可以帮我解决这个问题吗?如果你们想要我可以提供滴答功能的源代码,如果需要的话。

感谢您的帮助。

谢谢,

安基塔

4 个答案:

答案 0 :(得分:1)

首先,将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:您可以使该类接受使用NSInvocation调用的目标和选择器,而不是在GamePhysicsContactListener类中执行联系检查逻辑。但这会有点复杂。

编辑:

以下是GamePhysicsContactListener的工作实现:https://gist.github.com/922824(它是我的私有GamePhysics框架的一部分,它连接了Cocos2D和Box2D类)

答案 1 :(得分:0)

为每个身体创建一个夹具,并在勾选函数中检查碰撞......

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

希望这有助于!!!!

答案 2 :(得分:0)

这是我用来在碰撞时显示一点动画的方法。它可以很容易地修改为显示标签而不是动画。

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

答案 3 :(得分:0)

我遇到了同样的问题。我想在玩家击中电源时显示标签。为此我在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];