随着时间SFML C ++移动时,只需每隔几秒精灵

时间:2015-03-23 14:31:48

标签: c++ timer sfml

此代码相对于时间在屏幕上移动精灵。然而,它似乎每隔几秒就跳到左边。

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();

有关为何发生这种情况的任何见解?

此致

1 个答案:

答案 0 :(得分:2)

您没有展示如何实现您的时间功能,2种可能性: 第一种可能性是你在哪里宣布了时间变量 时间函数的循环,在这种情况下结果是一些不同程度的运动,但它从if结构看起来错误最可能在于可能性2. 250000.0f是一个非常庞大的数字必须使用在处理偏移时,使用ogre.clock告诉我#2更可能是

2

时间函数的变量和声明都是循环的。 我把这个函数放在一个compilier中,然后设置cout输出两个值作为微秒。 output is elapsedTime始终为0,dt总是在0-4微秒左右,除了每隔一段时间因为一个证明原因它等于400-2000微秒。

这样做的结果是它让你必须使用第二个时钟来控制你的时间,这样你的动画就不会出现故障,你的动画会经常跳到左边,因为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 ::时间只是一个变量,时钟必须进行计数 希望这会有所帮助。

P.S。总是在你的循环结构之外写声明,它在大多数时候都可以正常工作,但是它会不时地导致你得到像这样的奇怪错误,或者随机崩溃。