c++ - 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);
}
那么,我该如何解决呢?
解决方案
你的问题的答案很复杂。主要原因是你的手机没有和电脑一样的处理能力,Cocos2d-x 使用了一些巧妙的优化来尝试隐藏它。对于移动的精灵,它必须每帧重新绘制它们(通常为 30-60 fps),轻微的不一致可能会导致这种效果。为了解决这个问题,我会仔细检查你的 fps 是否为 60,因为 30 fps 会导致颤抖。另外,如果您要更新精灵在 中的位置update(float dt)
,我会尝试使用物理引擎来代替速度。如果这不是一种选择,也许可以尝试减少层数,因为您在彼此之上绘制的精灵越多,它看起来就越抖动。让我知道这些解决方案是否有效。
推荐阅读
- google-apps-script - 表格:未捕获的类型错误:google.script.run.withSuccessHandler(...).is not a function
- url - root-relative 和 protocol-relative url 路径有什么区别?
- excel - 在 VBA 中使用 IF
- node.js - res.cookie(名称,值);不设置 cookie (Express/NodeJs)
- keycloak - 通过 Standalone.sh 在与 localhost 不同的地址上启动 Keycloak 服务器
- r - 在绘图区域外添加文本
- java - 如何从文件java中的特定行更新特定字符串
- amazon-web-services - 如何在 CloudWatch 中查看 AWS CloudFormation 日志?
- reactjs - 如何处理 React 中已删除的本地存储?
- twilio - Twilio Studio Flow - 通话录音出错?