0

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

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

  1. 沿 x 轴以恒定速度移动此 Body,无论它是向上还是向下滚动(它是一个圆形)
  2. 保持身体几乎粘在它滚动的地面上
  3. 将 Body 和相应的 Sprite 保持在屏幕的中心。

我尝试了什么:

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

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

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

出色地...

  1. ...没有像我想要的那样工作,因为每次我手动设置速度(我也尝试body->applyLinearImpulse(...)在 Body 向上移动时使用,就像在使用 velocityIterations in 的值一样world->Step(...))有一个小的延迟,这将玩家的身体或多或少地推离屏幕中心。

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

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

所以我的问题是:

你们中有人有什么新方法可以让我解决这一系列有凝聚力的问题吗?

干杯,

塞布

4

2 回答 2

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

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

    这将允许大部分时间保持恒定的速度。不要忘记,在游戏循环中每次都必须调用这些函数。你可以结合这些力量,视情况而定。例如,如果一开始你需要做一个小加速度,可以对body使用ApplyForce,而当一个想要的速度是使用ApplyLinearImpulse或SetLinearVelocity。此处描述了如何正确使用它:以恒定速度移动

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

  3. 我在这里回答这个问题:Cocos2D-x - 使用 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);
    

PS 如果你是 box2d 的新手,建议阅读 iforce2d 的所有文章(tuts),它们在网络中名列前茅,还有他的 Box2D 编辑器 - RUBE。有一次他们真的帮助了我。

于 2013-10-31T00:20:16.533 回答
0

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

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

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

于 2013-10-31T09:50:57.687 回答