随着时间 SFML C++ 移动时每隔几秒 Sprite
Sprite just every few seconds when moving with time SFML C++
此代码使精灵相对于时间在屏幕上移动。但是它似乎每隔几秒就跳到左边。
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();
关于为什么会发生这种情况的任何见解?
此致
你没有展示你是如何实现你的时间函数的,两种可能性:
第一种可能性是你,你在
时间函数的循环,在那种情况下,结果是不同程度的运动,但从 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::时间只是一个变量,时钟要计算。
希望这有帮助。
p.s。总是在你的循环结构之外写声明,大部分时间它工作正常,但有时它会导致你得到像这样的奇怪错误,或者随机崩溃。
此代码使精灵相对于时间在屏幕上移动。但是它似乎每隔几秒就跳到左边。
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();
关于为什么会发生这种情况的任何见解?
此致
你没有展示你是如何实现你的时间函数的,两种可能性: 第一种可能性是你,你在 时间函数的循环,在那种情况下,结果是不同程度的运动,但从 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::时间只是一个变量,时钟要计算。
希望这有帮助。
p.s。总是在你的循环结构之外写声明,大部分时间它工作正常,但有时它会导致你得到像这样的奇怪错误,或者随机崩溃。