我是Box2D的新手,我真的需要你的帮助!在我使用Cocos2D for iPhone的游戏中,如果他们以给定的速度行进,我希望我的身体能够破坏它们。现在,我所有的身体都是动力学而不是传感器。当发生碰撞时,我会调用一个函数来判断板条箱是否应该断裂。这是代码:
- (void) contactWithPlayer:(Player *)_player{
float recquiredVelocity = 8.5;
b2Vec2 vel = _player.body->GetLinearVelocity();
float playerVelocity = ABS(vel.x) + ABS(vel.y);
NSLog(@"Player speed : %f", playerVelocity);
if (playerVelocity >= recquiredVelocity) {
[self breakCrate]; //Function that destroy the crate's body in the b2world
}
}
一切都很好,但是我想要达到的目标是如果打包机以降低的速度打破对象的话。现在,我的播放器只会反弹!我试图重新使用vel
变量并将其应用于玩家的身体,但是在那一步,玩家已经开始向另一个方向移动了!我试图降低板条箱的密度,但它感觉不自然!
有人有解决方案吗?提前谢谢!
编辑:我现在使用的代码是借用Ray Wenderlich关于使用Box2D碰撞两个对象的教程的代码。所以我有一个名为MyContactListener
的类,它在向量中添加碰撞对象,稍后在我的游戏场景中的更新循环中使用。这是更新循环:
- (void) update:(ccTime)delta{
[self checkCollision];
}
- (void) checkCollisions{
//COLLISIONS
std::vector<MyContact>::iterator pos;
for(pos = _contactListener->_contacts.begin(); pos != _contactListener->_contacts.end(); ++pos) {
MyContact contact = *pos;
b2Body *bodyA = contact.fixtureA->GetBody();
b2Body *bodyB = contact.fixtureB->GetBody();
if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL) {
GameObject *spriteA = (GameObject *)bodyA->GetUserData();
GameObject *spriteB = (GameObject *)bodyB->GetUserData();
if (spriteA.type == o_PLAYER && spriteB.type != o_PLAYER) {
[spriteB contactWithPlayer:(Player*)spriteA];
}else if (spriteB.type == o_PLAYER && spriteA.type != o_PLAYER){
[spriteA contactWithPlayer:(Player*)spriteB];
}
}
}
}
谢谢!
答案 0 :(得分:2)
在您的联系人监听器的BeginContact回调中,您可以执行contact-&gt; SetEnabled(false)来禁用正常的碰撞响应,并让玩家通过包,就好像它不在那里一样。
但这根本不会让玩家放慢速度。你需要添加一点自己的冲动来让玩家慢一点(与运动方向相反的一些冲动应该这样做)。