我正在使用 _world->step(dt,5,5) 来检测碰撞系统。所以碰撞实际上是由 box2d 类处理的。现在我想根据它碰撞到哪个球来显示球碰撞的分数?
有人可以帮我解决这个问题吗?如果你们愿意,如果需要,我可以提供滴答函数的源代码。
感谢您的帮助。
谢谢,
安基塔
我正在使用 _world->step(dt,5,5) 来检测碰撞系统。所以碰撞实际上是由 box2d 类处理的。现在我想根据它碰撞到哪个球来显示球碰撞的分数?
有人可以帮我解决这个问题吗?如果你们愿意,如果需要,我可以提供滴答函数的源代码。
感谢您的帮助。
谢谢,
安基塔
首先,将 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
(很可能在您的 CCLayerinit
方法中)调用下面的行来实例化侦听器:
_world->SetContactListener(new GamePhysicsContactListener());
p/s:除了在 GamePhysicsContactListener 类中执行联系人检查逻辑之外,您还可以使该类接受目标和要使用 NSInvocation 调用的选择器。不过那会更复杂一些。
编辑:
这是 GamePhysicsContactListener 的工作实现:https ://gist.github.com/922824 (它是我的私有 GamePhysics 框架的一部分,它连接了 Cocos2D 和 Box2D 类)
为每个身体创建一个夹具,并在刻度函数中检查碰撞......
if((contact.fixtureA == fixture1 && contact.fixtureB == fixture2) ||
(contact.fixtureA == fixture2 && contact.fixtureB == fixture1))
{
//do something
}
希望这可以帮助!!!!
这是我用来在碰撞时显示一些动画的方法。它可以很容易地修改为显示标签而不是动画。
-(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];
我面临着同样的问题。我想在玩家击中力量时显示一个标签。为此,我在 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];