Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

100 linhas
2.2 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2012 Sam Hocevar <sam@hocevar.net>
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the Do What The Fuck You Want To
  7. // Public License, Version 2, as published by Sam Hocevar. See
  8. // http://sam.zoy.org/projects/COPYING.WTFPL for more details.
  9. //
  10. #if defined HAVE_CONFIG_H
  11. # include "config.h"
  12. #endif
  13. #include <cmath>
  14. #include "core.h"
  15. namespace lol
  16. {
  17. /*
  18. * Emitter implementation class
  19. */
  20. class EmitterData
  21. {
  22. friend class Emitter;
  23. static const int MAX_PARTICLES = 1000;
  24. private:
  25. TileSet *tileset;
  26. vec3 gravity;
  27. int particles[MAX_PARTICLES];
  28. vec3 positions[MAX_PARTICLES];
  29. vec3 velocities[MAX_PARTICLES];
  30. int nparticles;
  31. };
  32. /*
  33. * Public Emitter class
  34. */
  35. Emitter::Emitter(TileSet *tileset, vec3 gravity)
  36. : data(new EmitterData())
  37. {
  38. data->tileset = tileset;
  39. data->gravity = gravity;
  40. data->nparticles = 0;
  41. }
  42. void Emitter::TickGame(float seconds)
  43. {
  44. for (int i = 0; i < data->nparticles; i++)
  45. {
  46. vec3 oldvelocity = data->velocities[i];
  47. data->velocities[i] += seconds * data->gravity;
  48. data->positions[i] += seconds * 0.5f
  49. * (oldvelocity + data->velocities[i]);
  50. if (data->positions[i].y < -100)
  51. {
  52. data->particles[i] = data->particles[data->nparticles - 1];
  53. data->positions[i] = data->positions[data->nparticles - 1];
  54. data->velocities[i] = data->velocities[data->nparticles - 1];
  55. data->nparticles--;
  56. }
  57. }
  58. Entity::TickGame(seconds);
  59. }
  60. void Emitter::TickDraw(float seconds)
  61. {
  62. Entity::TickDraw(seconds);
  63. for (int i = 0; i < data->nparticles; i++)
  64. Scene::GetDefault()->AddTile(data->tileset, data->particles[i],
  65. data->positions[i], 0, vec2(1.0f));
  66. }
  67. void Emitter::AddParticle(int id, vec3 pos, vec3 vel)
  68. {
  69. if (data->nparticles >= EmitterData::MAX_PARTICLES)
  70. return;
  71. data->particles[data->nparticles] = id;
  72. data->positions[data->nparticles] = pos;
  73. data->velocities[data->nparticles] = vel;
  74. data->nparticles++;
  75. }
  76. Emitter::~Emitter()
  77. {
  78. delete data;
  79. }
  80. } /* namespace lol */