为什么精灵在 cocos2d-x 中颤抖

Why sprites tremble in cocos2d-x

本文关键字:cocos2d-x 精灵 为什么      更新时间:2023-10-16

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

创建标签和精灵。在 PC(Win 和 Mac)和移动设备(安卓)上标记静态,在 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);
}

那么,我该如何解决呢?

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

该问题可能与您移动相机的方式有关。 通过更新方法设置新的 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);
}