首页 > 解决方案 > cocos2d-x中精灵为什么会颤抖

问题描述

我在 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-xgame-developmentcocos2d-x-3.0

解决方案


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


推荐阅读