Cocos2d-x Physics的问题

目前我在使用Cocos2d-x封装的物理引擎。使用过程中遇到了几个问题,希望高人可以帮我解答一下。
1、我设置了小球不受重力影响,设置了恢复力为1.希望小球可以保持匀速运动,世界中所有物体也都设置了恢复力为1,为什么有时候碰撞了,小球还是会减速。更有时候小球在发生碰撞以后静止的情况。有什么因素会影响小球的速度呢?
2、小球的速度达到一定数值的时候它会穿透其他物品。Physics如何实现像BOX2d这样的子弹效果
期待您的回答。 谢谢。

我来解答第一个:
经过实际测试,跟物体的质量还有关系。
其实这个就是物理学中的动量守恒定律,两个物体碰撞后,整体的动量是不变的,如果二者的质量相同,速度相同,那么碰撞后,速度也是不变的,但是如果质量不同,速度就可能发生变化,这个具体可以参考动量守恒说明。
以下是我测试的部分代码。
// add “HelloWorld” splash screen"
auto ballOne = Sprite::create(“ball.png”);

// position the sprite on the center of the screen
ballOne->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y));

//Physics body
auto physicsBodyOne = PhysicsBody::createCircle(ballOne->getContentSize().width/2, PHYSICSBODY_MATERIAL_DEFAULT);
physicsBodyOne->setDynamic(true);
physicsBodyOne->getShape(0)->setRestitution(1.0f);
physicsBodyOne->getShape(0)->setFriction(0.0f);
physicsBodyOne->getShape(0)->setDensity(1.0f);
physicsBodyOne->getShape(0)->setMass(1000);
physicsBodyOne->setGravityEnable(false);

physicsBodyOne->setCategoryBitmask(0x0001);
physicsBodyOne->setCollisionBitmask(0x0001);
physicsBodyOne->setContactTestBitmask(0x0001);

auto force = Vec2(500000.0f, 0.0f);
physicsBodyOne->applyImpulse(force);
ballOne->setPhysicsBody(physicsBodyOne);
ballOne->setTag(1);
// add the sprite as a child to this layer
this->addChild(ballOne, 0);


// add "HelloWorld" splash screen"
auto ballTwo = Sprite::create("ball.png");

// position the sprite on the center of the screen
ballTwo->setPosition(Vec2(visibleSize.width / 3 + origin.x, visibleSize.height / 2 + origin.y));

//Physics body
auto physicsBodyTwo = PhysicsBody::createCircle(ballOne->getContentSize().width / 2, PHYSICSBODY_MATERIAL_DEFAULT);
physicsBodyTwo->setDynamic(true);
physicsBodyTwo->getShape(0)->setRestitution(1.0f);
physicsBodyTwo->getShape(0)->setFriction(0.0f);
physicsBodyTwo->getShape(0)->setDensity(1.0f);
physicsBodyTwo->getShape(0)->setMass(1000);
physicsBodyTwo->setGravityEnable(false);

physicsBodyTwo->setCategoryBitmask(0x0001);
physicsBodyTwo->setCollisionBitmask(0x0001);
physicsBodyTwo->setContactTestBitmask(0x0001);

auto force2 = Vec2(-500000.0f, 0.0f);
physicsBodyTwo->applyImpulse(force2);
ballTwo->setPhysicsBody(physicsBodyTwo);
ballTwo->setTag(2);

// add the sprite as a child to this layer
this->addChild(ballTwo, 0);

非常感谢。~~