Esempio n. 1
0
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;
	}
Esempio n. 3
0
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();
	}