Powerup.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /**
  2. * one room arena
  3. * Copyright (C) 2016 POSITIVE MENTAL ATTITUDE
  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, version 3 of the License.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. #include <ctime>
  18. #include "Powerup.hpp"
  19. #include "Map.hpp"
  20. #include "Player.hpp"
  21. Powerup::Powerup(std::vector<Texture>* textures)
  22. {
  23. _type = rand() % count;
  24. this->setTexture(textures->at(_type));
  25. this->setOrigin((Vector2f)textures->at(_type).getSize() / 2.f);
  26. }
  27. const int Powerup::getType() const
  28. {
  29. return _type;
  30. }
  31. PowerupManager::PowerupManager(Map* map)
  32. {
  33. _map = map;
  34. _decentlyAllocatedTextures.resize(Powerup::count);
  35. _decentlyAllocatedTextures[Powerup::Haste].loadFromFile("data/haste.png");
  36. _decentlyAllocatedTextures[Powerup::Fatman].loadFromFile("data/fatman.png");
  37. _decentlyAllocatedTextures[Powerup::Steroids].loadFromFile("data/powerup.png");
  38. _decentlyAllocatedTextures[Powerup::RateOfFire].loadFromFile("data/rof.png");
  39. }
  40. void PowerupManager::registerPlayer(Player* player)
  41. {
  42. _ptr.push_back(player);
  43. }
  44. void PowerupManager::deregisterPlayer(Player* player)
  45. {
  46. for(unsigned i = 0; i < _ptr.size(); ++i)
  47. {
  48. if(_ptr[i] == player)
  49. {
  50. _ptr.erase(_ptr.begin() + i);
  51. break;
  52. }
  53. }
  54. }
  55. void PowerupManager::logic()
  56. {
  57. static Clock clock;
  58. if(clock.getElapsedTime().asSeconds() > 2.f && _powerups.size() < 10)
  59. {
  60. clock.restart();
  61. _powerups.emplace_back(&_decentlyAllocatedTextures);
  62. int x, y;
  63. do {
  64. x = rand() % (_map->getSize().x - 200) + 100;
  65. y = rand() % (_map->getSize().x - 200) + 100;
  66. _powerups.back().setPosition(x, y);
  67. } while(_map->collision(Vector2f(x, y)));
  68. }
  69. collision();
  70. }
  71. const unsigned PowerupManager::getSize() const
  72. {
  73. return _powerups.size();
  74. }
  75. const Powerup& PowerupManager::getPowerup(unsigned i) const
  76. {
  77. return _powerups[i];
  78. }
  79. void PowerupManager::collision()
  80. {
  81. for(unsigned i = 0; i < _ptr.size(); ++i)
  82. {
  83. for(unsigned j = 0; j < _ptr[i]->getPointCount(); ++j)
  84. {
  85. Vector2f coords = _ptr[i]->getTransform().transformPoint(_ptr[i]->getPoint(j));
  86. for(unsigned k = 0; k < _powerups.size(); ++k)
  87. {
  88. if(coords.x > _powerups[k].getPosition().x - _powerups[k].getOrigin().x
  89. && coords.x < _powerups[k].getPosition().x + _powerups[k].getOrigin().x
  90. && coords.y > _powerups[k].getPosition().y - _powerups[k].getOrigin().y
  91. && coords.y < _powerups[k].getPosition().y + _powerups[k].getOrigin().y)
  92. {
  93. switch(_powerups[k].getType())
  94. {
  95. case Powerup::Haste: _ptr[i]->hasten(); break;
  96. case Powerup::Fatman: _ptr[i]->addNuke(); break;
  97. case Powerup::Steroids: _ptr[i]->growStronger(); break;
  98. case Powerup::RateOfFire: _ptr[i]->rateOfFire(); break;
  99. default: break;
  100. }
  101. _powerups.erase(_powerups.begin() + k);
  102. }
  103. }
  104. }
  105. }
  106. }
  107. void PowerupManager::draw(RenderTarget& target, RenderStates states) const
  108. {
  109. for(unsigned i = 0; i < _powerups.size(); ++i)
  110. target.draw(_powerups[i], states);
  111. }