为什么精灵在 cocos2d-x 中颤抖
Why sprites tremble in cocos2d-x
我在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);
}
相关文章:
- 为什么精灵在 cocos2d-x 中颤抖
- 在 Cocos2d-x 中一次使用多个精灵表
- cocos2d-x每次我需要精灵或只是改变它的纹理时,制作精灵的最佳做法是什么
- Cocos2d中精灵的暂停/简历动作/动画
- 为什么Cocos2D-X不一第一次显示精灵
- 如何在cocos2d-x3测试版中围绕精灵绘制边界框
- COCOS2D-X:从另一个线程中加载精灵,任何模式
- 如何使用Cocos2D-X中的精灵表创建菜单
- Cocos2d-x CCArray-对象和精灵
- Cocos2d-x-从精灵或纹理数据编码base64字符串
- 在 cocos2d-x v3 中绘制并向场景添加大量精灵(~200)的最佳方法是什么?
- Cocos2d-x V3.2.使用 RenderTexture 创建精灵
- 捕获精灵及其所有子项 - Cocos2D-X 3.2
- 在4x6网格中显示和随机化精灵-Cocos2d-x
- 如何在cocos2d-x2.1.4中复制精灵的精灵
- Cocos2d-xTMX地图与游戏精灵共享纹理图像文件
- Cocos2d-x拖动手指,精灵以稳定的速度跟随
- 如何在Cocos2d中添加一个始终在屏幕上的精灵
- Cocos2d-x:在多个精灵上运行的顺序动作
- cocos2d - 精灵无法正确显示