C++ 在box2d中操纵精灵移动

C++ 在box2d中操纵精灵移动,c++,cocos2d-iphone,box2d,C++,Cocos2d Iphone,Box2d,在过去的几天里,我一直在尝试做一个类似乒乓球的游戏。我有两个桨和一个球。所有动态精灵。除了我遇到的一个问题外,一切都很顺利。球在某一点上倾向于以相同的角度反弹。因此,有时玩家只需在某个特定部位移动球拍,游戏就可以持续一段时间,或者可能永远持续下去,因为无论球击中球拍的哪个部位,球的角速度都不会改变。我使用线速度和角速度的组合来保持球像这样运动: if(_isPaused == FALSE) { _world->Step(dt, 10, 10); for(b2Body *b

在过去的几天里,我一直在尝试做一个类似乒乓球的游戏。我有两个桨和一个球。所有动态精灵。除了我遇到的一个问题外,一切都很顺利。球在某一点上倾向于以相同的角度反弹。因此,有时玩家只需在某个特定部位移动球拍,游戏就可以持续一段时间,或者可能永远持续下去,因为无论球击中球拍的哪个部位,球的角速度都不会改变。我使用线速度和角速度的组合来保持球像这样运动:

if(_isPaused == FALSE)
{
    _world->Step(dt, 10, 10);
    for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) {
        if (b->GetUserData() != NULL) {
            CCSprite *sprite = (CCSprite *)b->GetUserData();
            if(sprite.tag == 2)
            {
                b2Vec2 dir = b->GetLinearVelocity();
                dir.Normalize();
                float currentSpeed = dir.Length();
                int maxSpeed = 60;
                float accelerate = vel;

                if(currentSpeed <= maxSpeed)
                {
                    b->SetLinearVelocity(accelerate * dir);
                }

                sprite.position = ccp(b->GetPosition().x * PTM_RATIO,
                                      b->GetPosition().y * PTM_RATIO);
                sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());

                //Keep sprite from bouncing in a straight angle
                b->SetAngularVelocity(_body->GetAngle());
            }}}
if(\u isPaused==FALSE)
{
_世界->步骤(dt,10,10);
对于(b2Body*b=_world->GetBodyList();b;b=b->GetNext()){
如果(b->GetUserData()!=NULL){
CCSprite*sprite=(CCSprite*)b->GetUserData();
if(sprite.tag==2)
{
b2Vec2 dir=b->GetLinearVelocity();
dir.Normalize();
float currentSpeed=dir.Length();
int-maxSpeed=60;
浮动加速=水平;
if(当前速度设置线性速度)(加速*dir);
}
sprite.position=ccp(b->GetPosition().x*PTM_比率,
b->GetPosition().y*PTM_比率);
sprite.rotation=-1*CC_弧度到_度(b->GetAngle());
//防止精灵以直线角度反弹
b->SetAngularVelocity(_body->GetAngle());
}}}

所以我的问题是,我如何操纵角速度,使球在每次与我的桨碰撞时都能以不同的角度弹跳?我想得到当前的角速度,然后将其乘以某个值,但我不确定这是否是解决我遇到的问题的正确方法。有什么建议或想法吗非常感谢。非常感谢。在我看来,您有两种选择:

  • 检查碰撞的位置。如果它靠近桨叶的上/下边缘,将向外的速度偏转一个与该点的表面“曲率”成比例的角度。当然,这是欺骗,但如果艺术品和代码一致,它看起来是正确的。而图形是“欺骗而不被抓住的艺术”
  • 你可以考虑桨叶的当前速度以及球的速度。例如:如果球向下向右移动,而桨叶向下移动,那么你可以使用计算传出方向。只需确保将桨叶沿水平轴的动量变化限制为零
  • 最后,您可以结合上述技术,但现在您必须使用精确的碰撞检测(而不是我在上面(1)中描述的黑客)


    希望有帮助!

    一些提示,您应该很少使用
    SetLinearVelocity()
    SetAngularVelocity()
    。每种方法都会改变主体定义的属性,这可能会使您在以后事情变得更复杂时遇到问题。最好使用
    ApplyForceToCenter()
    ApplyLinearImpulse()
    代替了
    SetLinearVelocity()
    ,因为这两个函数更通用,对编码人员更友好。

    在我看来,我不认为您应该使用
    b->setangularvocity(\u body->GetAngle())如果你想在每次碰撞时改变角速度,你可以在你的
    beginContact
    方法中,写下每次物体与桨体碰撞时,都会对球施加一个随机的角脉冲,使用
    ApplyAngularImpulse().


    希望能有所帮助。

    谢谢你的建议。你给出的第二个选项似乎是一个不错的方法。我将尝试一下。)