【问题标题】:Why sprites tremble in cocos2d-xcocos2d-x中精灵为什么会颤抖
【发布时间】:2019-08-12 16:56:45
【问题描述】:

我在 cocos2d-x 上创建了一个小游戏,在移动版本中遇到了一些问题。游戏有带有地形和角色的图层,以及带有 ui/info 对象的图层。带地形的图层不会移动。并带有 ui/info 的图层随字符移动(因此它在屏幕上是静态的)。 在移动版本中,来自 ui 层的所有精灵都在颤抖,但只有精灵,标签是静态的。在 PC 版本中,精灵和标签也是静态的。

创建标签和精灵。在 PC(Win 和 Mac)和移动设备(Android)上标记静态,在 PC 上标记静态,在移动设备上颤抖:

auto infoLayer = m_params->getGameInfoDelegate();    // class GameInfo
auto size = Director::getInstance()->getVisibleSize();

TTFConfig ttfconfig("fonts/Marker Felt.ttf", 100);
auto label = Label::createWithTTF(ttfconfig, "0");
label->setPosition(Vec2(size.width / 2, size.height / 2 + 40));
label->setString("Hello");
infoLayer->getLayer()->addChild(label, 10);

auto spr = Sprite::create();
spr->setColor(Color3B(200, 100, 100));
spr->setTextureRect(Rect(0, 0, 150, 150));
spr->setPosition(Vec2(size.width / 2, size.height / 2 - 40));
infoLayer->getLayer()->addChild(spr, 9);

更新位置层和相机:

update(float t)
{

    ...
    m_cameraFollow->update();
    ...
}

void CameraFollow::update()
{
    float moveX;
    float moveY;
    ...
    m_camera->move(Vec2(moveX, moveY));    // class GameCamera 
}

void GameCamera::move(const cocos2d::Vec2& m)
{
    float x;
    float y;
    ...
    m_position.x = x;
    m_position.y = y;
    m_camera->setPosition(m_position);    // class cocos2d::Camera
    auto infoPanel = m_params->getGameInfoDelegate();    // class GameInfo
    if(infoPanel)
    {
        infoPanel->setMoving(m_position - m_startPosition);
    }
}

class GameInfo : public cocos2d::Layer, public GameInfoDelegate

void GameInfo::setMoving(const cocos2d::Vec2 &position)
{
    this->setPosition(position);
}

那么,我该如何解决呢?

【问题讨论】:

标签: c++ cocos2d-x game-development cocos2d-x-3.0


【解决方案1】:

您的问题的答案很复杂。主要原因是你的手机没有和电脑一样的处理能力,Cocos2d-x 使用了一些巧妙的优化来试图隐藏它。对于移动的精灵,它必须每帧重绘它们(通常是 30-60 fps),轻微的不一致可能会导致这种效果。 为了解决这个问题,我会仔细检查你的 fps 是否为 60,因为 30 fps 会导致颤抖。此外,如果您要更新精灵在update(float dt) 中的位置,我会尝试使用物理引擎来代替速度。如果这不是一种选择,也许可以尝试使用更少的图层,因为您在彼此之上绘制的精灵越多,它看起来就越抖动。让我知道这些解决方案是否有效。

【讨论】:

  • 我检查,我的 fps 是 60。我检查 30 fps 和 10 fps。精灵总是在颤抖。我在“update(float dt)”中更新了位置,但是我更新了图层位置,精灵和标签是图层的孩子。
  • 你能告诉我你更新位置的代码吗?
  • 你是在模拟器上运行这个吗?我在模拟器上的表现很糟糕,结果与您所经历的相似,但是一旦我在实际设备上进行测试,它就可以正常工作。你试过吗?
  • 我只用过设备(华为p smart plus)
【解决方案2】:

此问题可能与您移动相机的方式有关。通过更新方法设置新的 X、Y 坐标而不考虑每次更新调用的增量时间将导致屏幕上的抖动。

您需要平滑从一个位置到另一个位置的移动。

试试这个:

update(float dt)
{
    ...
    m_cameraFollow->update(dt);
    ...
}

void CameraFollow::update(float dt)
{
    float moveX;
    float moveY;
    float speed = 1.0f;
    ...

    Vec2 cameraPosition = m_camera->getPosition();
    Vec2 targetPosition = Vec2(moveX, moveY);
    Vec2 newPosition = cameraPosition.lerp(targetPosition, dt * speed);

    m_camera->move(newPosition);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多