Cocos2d iphone 保持速度恒定且玩家处于位置-侧滚

Cocos2d iphone 保持速度恒定且玩家处于位置-侧滚,cocos2d-iphone,box2d,Cocos2d Iphone,Box2d,我正在用Cocos2D-X和Box2D开发一款小型手机游戏 我被卡住的地方是box2d身体(主要演员)和相应精灵的运动。现在我想: 沿着x轴匀速移动这个物体,不管它是向上还是向下滚动(它是一个圆形) 保持身体几乎贴在滚动的地面上 将主体和相应的精灵保持在屏幕中央 我尝试的是: 在update()方法中,我使用了body->SetLinearVelocity(b2Vec2(x,y))来设置更高/更低的值,如果body传递的速度为常量 我曾经在body->SetLinearVelocity(b2Ve

我正在用Cocos2D-X和Box2D开发一款小型手机游戏

我被卡住的地方是box2d身体(主要演员)和相应精灵的运动。现在我想:

  • 沿着x轴匀速移动这个物体,不管它是向上还是向下滚动(它是一个圆形)
  • 保持身体几乎贴在滚动的地面上
  • 将主体和相应的精灵保持在屏幕中央
  • 我尝试的是:

  • 在update()方法中,我使用了
    body->SetLinearVelocity(b2Vec2(x,y))
    来设置更高/更低的值,如果body传递的速度为常量

  • 我曾经在
    body->SetLinearVelocity(b2Vec2(x,y))

  • 首先,我尝试在我的playerSprite上使用CCFollow,它也沿着y轴滚动,因为我只需要沿着x轴滚动,所以我决定将包含环境(平台等)的整个层移动到屏幕的左侧,将播放器身体和播放器精灵移动到屏幕的右侧,调整速度值,使播放器保持在屏幕中央

  • …没有按我希望的那样工作,因为每次我手动设置速度时(当身体向上移动时,我也尝试使用
    body->applylinearpulse(…)
    ,就像在
    world->Step(…)
    中玩velocityIterations的值一样)都会有一个小的延迟,这会将玩家的身体推到屏幕中心的更远处

  • 。。。也没有像我预期的那样工作,因为我需要调整x值,当身体向上移动以保持速度不减慢时,这使得我的身体对地面的粘性更小

  • 。。。CCFollow做得很好,只是我不想沿着y轴滚动,它会强制过度给定的精灵从屏幕中央开始。移动整个层甚至没有带来好的效果,我已经尝试了很长时间来调整层和身体的移动速度值,使其相互抵消,使玩家几乎停留在屏幕的中心

  • 所以我的问题是:

    你们中有谁有什么新的方法让我来解决这一系列的问题吗

    干杯

    赛博

  • 为了便于控制身体,施力的主体应为圆形。这是因为碰撞的处理机制。本文中的更多详细信息:。 为了处理与身体当前轮廓的碰撞,您可以使用附加的装置和传感器以及id,或者使用类别和掩码位。对于恒定速度,通常最好使用SetLinearVelocity,因为即使使用冲量速度,在陡坡或跳跃时也会丢失。如果要使用“内推”更改身体的位置,则需要使用以下类型的代码:

    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。下面介绍如何正确使用它:

  • 若你们使用的是具有正常重力的世界(b2Vec2(0,-9.81)),那个么这应该不是问题

  • 我在这里回答这个问题:。我使用此代码,它可能对您有用:

    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);
    

  • 注意:如果您是box2d新手,建议您阅读所有文章iforce2d(),它们是网络中最好的,以及他的box2d编辑器RUBE。有一段时间,他们真的帮助了我。

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

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


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

    使用box2d很难做到这一点,您可以在这里找到一些解释: