選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

94 行
2.1 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2011 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 <cstdio>
  14. #include <cmath>
  15. #include "core.h"
  16. /*
  17. * Emitter implementation class
  18. */
  19. class EmitterData
  20. {
  21. friend class Emitter;
  22. private:
  23. int tiler;
  24. Float3 gravity;
  25. int particles[100];
  26. Float3 positions[100];
  27. Float3 velocities[100];
  28. int nparticles;
  29. };
  30. /*
  31. * Public Emitter class
  32. */
  33. Emitter::Emitter(int tiler, Float3 gravity)
  34. : data(new EmitterData())
  35. {
  36. data->tiler = tiler;
  37. data->gravity = gravity;
  38. data->nparticles = 0;
  39. }
  40. void Emitter::TickGame(float deltams)
  41. {
  42. for (int i = 0; i < data->nparticles; i++)
  43. {
  44. data->velocities[i] = data->velocities[i] + deltams * data->gravity;
  45. data->positions[i] = data->positions[i] + deltams * data->velocities[i];
  46. if (data->positions[i].y < -100)
  47. {
  48. data->particles[i] = data->particles[data->nparticles - 1];
  49. data->positions[i] = data->positions[data->nparticles - 1];
  50. data->velocities[i] = data->velocities[data->nparticles - 1];
  51. data->nparticles--;
  52. }
  53. }
  54. Entity::TickGame(deltams);
  55. }
  56. void Emitter::TickDraw(float deltams)
  57. {
  58. Entity::TickDraw(deltams);
  59. for (int i = 0; i < data->nparticles; i++)
  60. Scene::GetDefault()->AddTile((data->tiler << 16) | data->particles[i],
  61. data->positions[i].x,
  62. data->positions[i].y,
  63. data->positions[i].z, 0);
  64. }
  65. void Emitter::AddParticle(int id, Float3 pos, Float3 vel)
  66. {
  67. if (data->nparticles >= 100)
  68. return;
  69. data->particles[data->nparticles] = id;
  70. data->positions[data->nparticles] = pos;
  71. data->velocities[data->nparticles] = vel;
  72. data->nparticles++;
  73. }
  74. Emitter::~Emitter()
  75. {
  76. delete data;
  77. }