保持速度恒定和球员在位 - 侧面

时间:2013-10-29 11:40:15

标签: cocos2d-iphone box2d

我正在使用Cocos2D-X和Box2D进行小型移动游戏。

我被卡住的点是box2d-body(主要演员)和相应的Sprite的移动。现在我想:

  1. 沿着x轴以恒定的速度移动此身体,无论它是向上还是向下滚动(它是圆形)
  2. 保持身体几乎贴在它正在滚动的地面上
  3. 将Body和相应的Sprite保持在屏幕中心。
  4. 我尝试了什么:

      更新()中的
    1. - 如果Body为其速度传递一个常量值,我将body->SetLinearVelocity(b2Vec2(x,y))用于更高/更低的值

    2. 我曾在body->SetLinearVelocity(b2Vec2(x,y))

    3. 中设置非常高的y值
    4. 首先尝试将CCFollow与我的playerSprite一起使用,它也沿着y轴滚动,因为我只需要沿着x轴滚动,所以我决定移动整个层,其中包含了氛围(平台等)我的屏幕左侧和我的玩家身体&屏幕右侧的玩家精灵,调整速度值以将玩家保持在屏幕中心。

    5. 嗯...

      1. ...没有按照我想要的方式工作,因为每次我都手动设置速度(我还尝试使用body->applyLinearImpulse(...)当身体向上移动时就像玩弄world->Step(...)中的velocityIterations值有一个小的延迟,它会使玩家身体或多或少地推动屏幕中心。

      2. ...也没有像我预期的那样工作,因为我需要调整x值,当身体向上移动以保持它不会减慢时,这使我的身体更少粘在地上....

      3. ... CCFollow做了一个很好的工作,除了我不想沿着y轴滚动它并且它强制过度的精灵在屏幕的中心开始。移动整个图层甚至没有带来好的结果,我已经尝试了很长时间来调整图层和身体的移动速度值以保持它相互否定,玩家几乎停留在屏幕的中心...

      4. 所以我的问题是:

        你们中是否有人有任何新方法可以解决这一系列问题?

        干杯,

        的Seb

2 个答案:

答案 0 :(得分:0)

  1. 为了便于控制身体,施加力的主要人物应该是圆形的。这应该是因为碰撞的处理机制。本文中的更多详细信息:Why does the character get stuck?。 为了处理与当前身体轮廓的碰撞,您可以使用带有id或使用类别和掩码位的附加夹具和传感器。对于恒定速度通常更好地使用SetLinearVelocity,因为即使使用脉冲速度在急剧上坡或跳跃时也会丢失。如果你想使用implulse来改变身体的位置,那么你需要使用这个类型的代码:

    b2Vec2 vel = m_pB2Body->GetLinearVelocity();
    float desiredVel = mMoveSpeed.x; //set there your speed x value 
    float velChange = desiredVel - vel.x;
    float impulse = m_pB2Body->GetMass() * velChange;
    m_pB2Body->ApplyLinearImpulse( b2Vec2(impulse, mMoveSpeed.y), m_pB2Body->GetWorldCenter());
    

    这将允许在大多数时间保持恒定速度。不要忘记每次在游戏循环中都必须调用这些函数。您可以根据具体情况组合这些力量。例如,如果在开始时需要进行小加速,则可以对身体使用ApplyForce,并且当所需速度使用ApplyLinearImpulse或SetLinearVelocity时。如何正确使用它在此处描述:Moving at constant speed

  2. 如果你使用具有正常重力的世界(b2Vec2(0,-9.81)),那么它应该不是问题。

  3. 我在这里回答这个问题:Cocos2D-x - Issues when with using CCFollow。我使用此代码,它可能对您有用:

    CCPoint position = ccpClamp(playerPosition, mLeftBounds, mRightBounds);
    CCPoint diff = ccpSub(mWorldScrollBound, mGameNode->convertToWorldSpace(position));
    CCPoint newGameNodePosition = ccpAdd(mGameNode->getPosition(), mGameNode->getParent()->convertToNodeSpace(diff));
    mGameNode->setPosition(newGameNodePosition);
    
  4. P.S。如果您是box2d的新手,建议您阅读所有文章iforce2d(tuts),他们是网络中最好的文章,以及他的Box2D编辑器 - RUBE。有一次他们真的帮了我。

答案 1 :(得分:0)

我不知道这是否可行,但我有一个想法:

将圆圈保持在固定位置并相对移动背景。例如,在游戏过程中,如果圆圈的速度为5,则保持圆固定,并将速度为5的屏幕向右移动。如果圆圈向左移动5度,屏幕向右移动3个速度,则保持圆圈固定,向左移动屏幕,向左移动,依此类推。这应该允许您将圆圈固定在屏幕的中心。

另一种方法是将整个屏幕与球一起翻译。使屏幕上的所有内容成为可以具有速度的对象。并且球的速度(圆圈)的x分量应该是所有其他物体的速度。这样,每当圆圈移动时,所有其他对象都会尝试并跟上它。