void updateParticles(Game* game) { for(int i = 0; i < MAX_PARTICLES_PER_GAME; ++i) if(game->particles[i].alive) { Particle* particle = &game->particles[i]; Pointf velocity = createPointf(0, 0); velocity.x = cos(degToRad(particle->direction.value)) * particle->speed.value; velocity.y = -sin(degToRad(particle->direction.value)) * particle->speed.value; particle->position = addPointfs(particle->position, scalePointf(velocity, game->delta)); updateParticleAttributef(game, &particle->scale); particle->life -= game->delta; if(particle->life < 0) destroyParticle(game, particle); } }
// 设置粒子模板 void ParticleObject::setParticleTemplate(const String &templateName) { destroyParticle(); // 创建实体 m_particleSystem = m_scene->getOgreSceneManager()->createParticleSystem(getFullName() , templateName); m_particleSystem->setUserAny(Any(static_cast<ISceneObject*>(this))); // 挂接上去 m_node->attachObject(m_particleSystem); m_particleTemplateName = templateName; }
void ParticleEmitter::updateLives(float time_delta) { for (int i = 0, c = m_rel_life.size(); i < c; ++i) { float rel_life = m_rel_life[i]; rel_life += time_delta / m_life[i]; m_rel_life[i] = rel_life; if (rel_life > 1) { destroyParticle(i); --i; --c; } } }
// 销毁对象实体 void ParticleObject::destroy() { destroyParticle(); NullObject::destroy(); }