Improve code and add stutter compensation.

This commit is contained in:
DelinWorks 2022-05-24 09:42:27 +03:00
parent 3c3069b4fc
commit ab3854f51a
2 changed files with 21 additions and 35 deletions

View File

@ -1016,25 +1016,20 @@ bool ParticleSystem::addAnimationIndex(unsigned short index, cocos2d::Rect rect,
return true;
}
void ParticleSystem::simulate(float seconds)
{
simulateFPS(seconds, 1.0F / Director::getInstance()->getAnimationInterval());
}
void ParticleSystem::simulateFPS(float seconds, float frameRate)
void ParticleSystem::simulate(float seconds, float frameRate)
{
auto l_updatePaused = _updatePaused;
_updatePaused = false;
seconds = seconds == SIMULATION_USE_PARTICLE_LIFETIME ?
seconds = seconds == SIMULATION_USE_PARTICLE_LIFETIME ?
getLife() + getLifeVar() : seconds;
frameRate = frameRate == SIMULATION_USE_GAME_ANIMATION_INTERVAL ?
1.0F / Director::getInstance()->getAnimationInterval() : frameRate;
auto delta = 1.0F / frameRate;
float lastDelta = 0.0F;
if (seconds > delta)
{
while (seconds > 0.0F)
{
this->update(delta);
lastDelta = seconds;
seconds -= delta;
}
this->update(seconds);
@ -1044,16 +1039,10 @@ void ParticleSystem::simulateFPS(float seconds, float frameRate)
_updatePaused = l_updatePaused;
}
void ParticleSystem::resimulate(float seconds)
void ParticleSystem::resimulate(float seconds, float frameRate)
{
this->resetSystem();
this->simulate(seconds);
}
void ParticleSystem::resimulateFPS(float seconds, float frameRate)
{
this->resetSystem();
this->simulateFPS(seconds, frameRate);
this->simulate(seconds, frameRate);
}
void ParticleSystem::onEnter()
@ -1111,6 +1100,12 @@ void ParticleSystem::update(float dt)
_componentContainer->visit(dt);
}
if (dt > 0.5F)
{
this->simulate(dt, 15);
return;
}
if (_fixedFPS != 0)
{
_fixedFPSDelta += dt;

View File

@ -271,6 +271,9 @@ public:
/** The simulation's seconds are set to the particles' lifetime specified inclusive of variant. */
SIMULATION_USE_PARTICLE_LIFETIME = -1,
/** The simulation's framerate is set to the animation interval specified in director. */
SIMULATION_USE_GAME_ANIMATION_INTERVAL = -1,
};
/** Creates an initializes a ParticleSystem from a plist file.
@ -948,34 +951,22 @@ public:
*/
void setPositionType(PositionType type) { _positionType = type; }
/** Advance the particle system and make it seem like it ran for this many seconds.
* The frame rate used for simulation accuracy is the screens refresh rate.
*
* @param seconds Seconds to advance. value of -1 means (SIMULATION_USE_PARTICLE_LIFETIME)
*/
void simulate(float seconds = SIMULATION_USE_PARTICLE_LIFETIME);
/** Advance the particle system and make it seem like it ran for this many seconds.
*
* @param seconds Seconds to advance. value of -1 means (SIMULATION_USE_PARTICLE_LIFETIME)
* @param frameRate Frame rate to run the simulation with (preferred: 30.0) The higher this value is the more accurate the simulation will be at the cost of performance.
* @param frameRate Frame rate to run the simulation with (preferred: 30.0) The higher this value is the more accurate the simulation will be at the cost of performance. value of -1 means (SIMULATION_USE_GAME_ANIMATION_INTERVAL)
*/
void simulateFPS(float seconds = SIMULATION_USE_PARTICLE_LIFETIME, float frameRate = 30.0F);
void simulate(float seconds = SIMULATION_USE_PARTICLE_LIFETIME,
float frameRate = SIMULATION_USE_GAME_ANIMATION_INTERVAL);
/** Resets the particle system and then advances the particle system and make it seem like it ran for this many
* seconds. The frame rate used for simulation accuracy is the screens refresh rate.
*
* @param seconds Seconds to advance. value of -1 means (SIMULATION_USE_PARTICLE_LIFETIME)
* @param frameRate Frame rate to run the simulation with (preferred: 30.0) The higher this value is the more accurate the simulation will be at the cost of performance. value of -1 means (SIMULATION_USE_GAME_ANIMATION_INTERVAL)
*/
void resimulate(float seconds = SIMULATION_USE_PARTICLE_LIFETIME);
/** Resets the particle system and then advances the particle system and make it seem like it ran for this many
* seconds. The frame rate used for simulation accuracy is the screens refresh rate.
*
* @param seconds Seconds to advance. value of -1 means (SIMULATION_USE_PARTICLE_LIFETIME)
* @param frameRate Frame rate to run the simulation with (preferred: 30.0) The higher this value is the more accurate the simulation will be at the cost of performance.
*/
void resimulateFPS(float seconds = SIMULATION_USE_PARTICLE_LIFETIME, float frameRate = 30.0F);
void resimulate(float seconds = SIMULATION_USE_PARTICLE_LIFETIME,
float frameRate = SIMULATION_USE_GAME_ANIMATION_INTERVAL);
// Overrides
virtual void onEnter() override;