2013-10-29 29 views
0

我正在与Cocos2D-X和Box2D进行小型手机游戏。保持速度不变和玩家位置 - Sidescrolling

我卡住的地方是box2d-body(主要演员)和相应的雪碧的移动。现在我想:

  1. 移动这身搭配沿x轴的恒定速度,不管它是滚动(这是一个circleshape)向上或向下
  2. 保持身体几乎贴到地面上它滚动
  3. 保持正文和相应的雪碧在屏幕中心。

我尝试什么:

  1. 在更新() - 方法我用body->SetLinearVelocity(b2Vec2(x,y))较高/较低的值,如果身体中传递一个恒定值为他的速度

  2. 我用于设置非常高的y值body->SetLinearVelocity(b2Vec2(x,y))

  3. 首先尝试使用CCFollow和我的playerSprite,这也是沿y轴滚动的,因为我只有n因此我决定将包含氛围(平台等)的整个图层移动到屏幕左侧和我的播放器主体&屏幕右侧的播放器精灵,调整速度使玩家保持在屏幕中心的值。

嗯......

  1. ...因为我想它,因为每个i手动设置的速度时(我还试图用body->applyLinearImpulse(...)当身体没有工作向上移动,就像玩着world->Step(...)中的velocityIterations的值一样),会有一个小的延迟,将玩家身体推向屏幕中心或多或少。

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

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

所以我的问题是:

是否有人对你有新的方法的任何一种为我解决问题的这种凝聚力一堆?

干杯,

勒布

+1

这将很难用box2d完成,你会在这里找到一些解释:http://www.learn-cocos2d.com/2013/08/physics-engine-platformer-terrible-idea/ – LearnCocos2D

回答

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

附:如果您是box2d的新手,建议阅读所有文章iforce2d(tuts),他们是网络中最好的,以及他的Box2D Editor - RUBE。有一段时间他们真的帮助了我。

0

我不知道这是可能的,但我有一个想法:

保持圈在一个固定的位置和相对运动的背景。例如,在游戏过程中,如果圆圈的速度朝左,则保持圆圈固定,并向右移动速度为5的屏幕。如果圆圈左侧有5个速度,屏幕右侧有3个速度,则保持圆圈固定,向左移动8个速度,等等。这应该允许您将圆圈固定在屏幕的中心。

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