Advertisement
Guest User

Untitled

a guest
Aug 17th, 2010
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.08 KB | None | 0 0
  1. /*##############################################################################
  2. #    Triog - 2D Shoot em' up Game                                              #
  3. #    Copyright (C) 2010  Alexandre Díaz Cuadrado                               #
  4. #                                                                              #
  5. #    This program is free software: you can redistribute it and/or modify      #
  6. #    it under the terms of the GNU General Public License as published by      #
  7. #    the Free Software Foundation, either version 3 of the License, or         #
  8. #    (at your option) any later version.                                       #
  9. #                                                                              #
  10. #    This program is distributed in the hope that it will be useful,           #
  11. #    but WITHOUT ANY WARRANTY; without even the implied warranty of            #
  12. #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             #
  13. #    GNU General Public License for more details.                              #
  14. #                                                                              #
  15. #    You should have received a copy of the GNU General Public License         #
  16. #    along with this program.  If not, see <http://www.gnu.org/licenses/>.     #
  17. ################################################################################
  18. ##############################################################################*/
  19.  
  20. #include "CParticle.hpp"
  21. #include "CEngine.hpp"
  22. #include "../entities/CProyectile.hpp"
  23.  
  24. using namespace SPK;
  25. using namespace SPK::SFML;
  26.  
  27. CParticleSystem::CParticleSystem()
  28. :
  29.     sparkParticleSystemID(SPK::NO_ID),
  30.     smokeParticleSystemID(SPK::NO_ID)
  31. {
  32.     // random seed
  33.     randomSeed = static_cast<unsigned int>(time(NULL));
  34.  
  35.     // Sets the update step
  36.     System::setClampStep(true,0.1f);            // clamp the step to 100 ms
  37.     System::useAdaptiveStep(0.001f,0.01f);      // use an adaptive step from 1ms to 10ms (1000fps to 100fps)
  38.     SFMLRenderer::setZFactor(1.0f);
  39.     setCameraPosition(SPK::SFML::CAMERA_CENTER,SPK::SFML::CAMERA_BOTTOM,static_cast<float>(SCREEN_H),0.0f);
  40.     loadSparkParticleSystem();
  41.     loadSmokeParticleSystem(engine.resources.img_smoke);
  42.     //CProyectile::loadBaseParticleSystem(engine.resources.img_smoke);
  43.     SPKFactory::getInstance().traceAll();
  44. }
  45. CParticleSystem::~CParticleSystem()
  46. {
  47.     SPKFactory::getInstance().traceAll();
  48.     SPKFactory::getInstance().destroyAll();
  49.     SPKFactory::getInstance().traceAll();
  50. }
  51.  
  52.  
  53. // Creates and register the base particle system for collisions
  54. void CParticleSystem::loadSparkParticleSystem()
  55. {
  56.     // Creates the model
  57.     Model* sparkModel = Model::create(
  58.     FLAG_RED | FLAG_GREEN | FLAG_BLUE | FLAG_ALPHA,
  59.     FLAG_ALPHA,
  60.     FLAG_GREEN | FLAG_BLUE);
  61.     sparkModel->setParam(PARAM_RED,1.0f);
  62.     sparkModel->setParam(PARAM_GREEN,0.2f,1.0f);
  63.     sparkModel->setParam(PARAM_BLUE,0.0f,0.2f);
  64.     sparkModel->setParam(PARAM_ALPHA,0.8f,0.0f);
  65.     sparkModel->setLifeTime(0.2f,0.6f);
  66.     // Creates the renderer
  67.     SFMLLineRenderer* sparkRenderer = SFMLLineRenderer::create(0.1f,1.0f);
  68.     sparkRenderer->setBlendMode(sf::Blend::Add);
  69.     sparkRenderer->setGroundCulling(true);
  70.     // Creates the zone
  71.     Sphere* sparkSource = Sphere::create(Vector3D(0.0f,0.0f,10.0f),5.0f);
  72.     // Creates the emitter
  73.     SphericEmitter* sparkEmitter =
  74.     SphericEmitter::create(Vector3D(0.0f,0.0f,1.0f),3.14159f / 4.0f,3.0f * 3.14159f / 4.0f);
  75.     sparkEmitter->setForce(50.0f,150.0f);
  76.     sparkEmitter->setZone(sparkSource);
  77.     sparkEmitter->setTank(25);
  78.     sparkEmitter->setFlow(-1);
  79.     // Creates the Group
  80.     Group* sparkGroup = Group::create(sparkModel,25);
  81.     sparkGroup->setRenderer(sparkRenderer);
  82.     sparkGroup->addEmitter(sparkEmitter);
  83.     sparkGroup->setGravity(Vector3D(0.0f,0.0f,-200.0f));
  84.     sparkGroup->setFriction(2.0f);
  85.     // Creates the System
  86.     SFMLSystem* system = SFMLSystem::create();
  87.     system->addGroup(sparkGroup);
  88.     // Defines which objects will be shared by all systems
  89.     sparkModel->setShared(true);
  90.     sparkRenderer->setShared(true);
  91.     // returns the ID
  92.  
  93.     sparkParticleSystemID = system->getID();
  94. }
  95.  
  96. void CParticleSystem::loadSmokeParticleSystem(sf::Image& smoke)
  97. {
  98.     // Creates the model
  99.     SPK::Model* smokeModel = SPK::Model::create(
  100.         SPK::FLAG_SIZE | SPK::FLAG_ALPHA | SPK::FLAG_TEXTURE_INDEX | SPK::FLAG_ANGLE,
  101.         SPK::FLAG_SIZE | SPK::FLAG_ALPHA,
  102.         SPK::FLAG_SIZE | SPK::FLAG_TEXTURE_INDEX | SPK::FLAG_ANGLE);
  103.     smokeModel->setParam(SPK::PARAM_SIZE,5.0f,10.0f,100.0f,200.0f);
  104.     smokeModel->setParam(SPK::PARAM_ALPHA,1.0f,0.0f);
  105.     smokeModel->setParam(SPK::PARAM_TEXTURE_INDEX,0.0f,4.0f);
  106.     smokeModel->setParam(SPK::PARAM_ANGLE,0.0f, M_PI * 2.0f);
  107.     smokeModel->setLifeTime(0.2f,0.6f);
  108.  
  109.     // Creates the renderer
  110.     SPK::SFML::SFMLQuadRenderer* smokeRenderer = SPK::SFML::SFMLQuadRenderer::create();
  111.     smokeRenderer->setBlendMode(sf::Blend::Alpha);
  112.     smokeRenderer->setImage(&smoke);
  113.     smokeRenderer->setAtlasDimensions(2,2);
  114.     smokeRenderer->setScale(0.875f,0.875f); // optim
  115.     smokeRenderer->setGroundCulling(true);
  116.  
  117.     // Creates the zones
  118.     SPK::Point* leftTire = SPK::Point::create(Vector3D(0.0f,0.0f,10.0f));
  119.  
  120.     // Creates the emitters
  121.     SPK::SphericEmitter* leftSmokeEmitter = SPK::SphericEmitter::create(SPK::Vector3D(0.0f,0.0f,1.0f),0.0f,1.1f * M_PI);
  122.     leftSmokeEmitter->setZone(leftTire);
  123.     leftSmokeEmitter->setName("left wheel emitter");
  124.  
  125.     // Creates the Group
  126.     SPK::Group* smokeGroup = SPK::Group::create(smokeModel,500);
  127.     smokeGroup->setGravity(SPK::Vector3D(0.0f,0.0f,2.0f));
  128.     smokeGroup->setRenderer(smokeRenderer);
  129.     smokeGroup->addEmitter(leftSmokeEmitter);
  130.     smokeGroup->enableSorting(true);
  131.  
  132.     // Creates the System
  133.     SPK::SFML::SFMLSystem* system = SPK::SFML::SFMLSystem::create(true);
  134.     system->addGroup(smokeGroup);
  135.  
  136.     // Defines which objects will be shared by all systems
  137.     smokeModel->setShared(true);
  138.     smokeRenderer->setShared(true);
  139.  
  140.     // Creates the base and gets the ID
  141.     smokeParticleSystemID = system->getID();
  142. }
  143.  
  144.  
  145.  
  146. SFMLSystem* CParticleSystem::createParticleSystem(const sf::Vector2f& pos, int particleType)
  147. {
  148.     SFMLSystem *system;
  149.  
  150.     if (particleType == PARTICLE_SPARK)
  151.         system = SPK_Copy(SFMLSystem, sparkParticleSystemID);
  152.     else if (particleType == PARTICLE_SMOKE)
  153.         system = SPK_Copy(SFMLSystem, smokeParticleSystemID);
  154.     else
  155.         return 0x0;
  156.  
  157.     system->SetPosition(pos);
  158.     ParticleSystems.push_back(system);
  159.  
  160.     return system;
  161. }
  162.  
  163. void CParticleSystem::destroyParticleSystem(SFMLSystem*& system)
  164. {
  165.     SPK_Destroy(system);
  166.     system = 0x0;
  167. }
  168.  
  169.  
  170. void CParticleSystem::tick()
  171. {
  172.     float deltaTime = engine.screen.GetFrameTime();
  173.  
  174.     std::deque<SFMLSystem*>::iterator it = ParticleSystems.begin();
  175.     while(it != ParticleSystems.end())
  176.     {
  177.         if (!(*it)->update(deltaTime))
  178.         {
  179.             destroyParticleSystem(*it);
  180.             it = ParticleSystems.erase(it);
  181.         }
  182.         else
  183.             ++it;
  184.     }
  185.  
  186.     for (std::deque<SPK::SFML::SFMLSystem*>::const_iterator it = ParticleSystems.begin(); it != ParticleSystems.end(); ++it)
  187.             engine.screen.Draw(**it);
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement