【问题标题】:Sprite just every few seconds when moving with time SFML C++随时间移动时每隔几秒显示一次精灵 SFML C++
【发布时间】:2015-03-23 14:31:48
【问题描述】:

这段代码相对于时间在屏幕上移动一个精灵。但是它似乎每隔几秒钟就会跳到左边。

int ogreMaxCell = 9;

if (SpriteVector[i].getPosition().x > ogreDirectionX[i]  )
{

    sf::Vector2f ogreDirection = sf::Vector2f(-1,0);
    float ogreSpeed = 1;
    sf::Vector2f ogreVelocity = ogreDirection * ogreSpeed * 250000.0f * dt.asSeconds(); 
    this->SpriteVector[i].move(ogreVelocity);
    //gets the spritesheet row
    orcSource.y = getCellYOrc(orcLeft);

}

if (ogreClock.getElapsedTime().asMilliseconds() > 250)
{
    orcxcell = (orcxcell + 1) % ogreMaxCell;

    ogreClock.restart();
}
SpriteVector[i].setTextureRect(sf::IntRect(orcSource.x + (orcxcell * 80), orcSource.y, 80, 80));

时间的说法是:

    sf::Time                dt; // delta time
    sf::Time                elapsedTime;
    sf::Clock clock;
    elapsedTime += dt;
    dt = clock.restart();

关于为什么会发生这种情况的任何见解?

问候

【问题讨论】:

  • dt 和 elapsedTime 没有初始化?

标签: c++ timer sfml


【解决方案1】:

您没有展示您是如何实现时间函数的,两种可能性: 第一种可能性是您在 时间函数的循环,在这种情况下,结果是不同程度的运动,但从 if 结构看来,错误很可能存在于可能性 2 中。 250000.0f 是一个非常大的数字,在处理偏移量时必须使用,并且使用 ogre.clock 告诉我 #2 的可能性更大

2

时间函数的变量和声明都是循环的。 我将该函数放入编译器中,并将 cout 设置为以微秒为单位输出这两个值。 输出 elapsedTime 始终为 0,dt 始终在 0-4ish 微秒左右,但出于某种原因,它经常等于 400-2000ish 微秒。

这样做的效果是,它让你必须使用第二个时钟来控制你的时间,这样你的动画就不会出现故障,而且你的动画会每隔一段时间跳到左边,因为 dt 从 4 微秒变为随机 1500 微秒。它还解释了为什么你必须乘以这么大的常数,因为你使用的是毫秒,并且不断得到无限小的 dt 值。

时间函数有几个问题 dt = clock.restart(); =/= 0 您将始终获得一些小的时间值,因为在将时钟重置为 0 并将时钟值赋予 sf::time 变量所需的时间。 动画跳转是因为在那个特定的周期中,计算机在时钟重置后需要更长的时间来分配值。

修复非常简单: 在循环结构外声明变量, 并像这样调整代码:

//declare before loop, if you dont, elapsed time constantly gets set to 0
sf::Time                dt; // delta time
sf::Time                elapsedTime;
sf::Clock clock;
//startloop structure of your choice
elapsedTime += clock.getElapsedTime();
dt = clock.getElapsedTime();
clock.restart();

并将第二个 if 语句修改为

if (elapsedTime.asMilliseconds() > 250)
{
    orcxcell = (orcxcell + 1) % ogreMaxCell;

    elapsedTime = milliseconds(0)
}

sf::Time 只是一个变量,时钟必须进行计数。
希望这会有所帮助。

附言总是在你的循环结构之外写声明,它大部分时间都可以正常工作,但有时它会导致你得到像这样的奇怪错误,或者随机崩溃。

【讨论】:

  • 这对我很有帮助并解决了我的问题
猜你喜欢
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多