Player.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include <cmath>
  2. #include "Player.hpp"
  3. #include "Log.hpp"
  4. #include "Animation.hpp"
  5. #include "Asset.hpp"
  6. #include "Alermath.hpp"
  7. Player::Player(Collider* collider):
  8. m_collider(collider),
  9. m_dead(false),
  10. m_jumping(false),
  11. m_ms(80.f) {
  12. setPosition(199 * 32.f, 6 * 32.f);
  13. setOrigin(0.f, 0.f);
  14. addAnimation("data/nem-run.png", 600, "run", true, 32);
  15. addAnimation("data/nem-jump.png", 3000, "jump", true, 32);
  16. addAnimation("data/nem-plop.png", 3000, "plop", false, 32);
  17. setAnimation("run");
  18. setAnimationSpeed(1.f);
  19. m_hop.setVolume(20.f);
  20. animate();
  21. }
  22. Player::~Player() {
  23. }
  24. void Player::revive() {
  25. m_dead = false;
  26. m_jumping = false;
  27. sf::Vector2i below;
  28. below.x = 19;
  29. below.y = 1;
  30. while(!(m_collider->isSolid(below.x, below.y) && !m_collider->isSolid(below.x, below.y - 1))) {
  31. move(0.f, 32.f);
  32. below.y++;
  33. if(below.y > 12) {
  34. setPosition(getPosition().x, 0.f);
  35. break;
  36. }
  37. }
  38. setAnimation("run");
  39. animate();
  40. }
  41. void Player::update(float delta) {
  42. animate();
  43. if(m_dead == true) {
  44. return;
  45. }
  46. sf::Vector2i belowL, belowR, ahead, in;
  47. static float jump = 0.f;
  48. static Vector2f jump_pos;
  49. static sf::Clock clock;
  50. belowL.x = (getPosition().x + 2.f - m_collider->getLocalX()) / 32.f;
  51. belowL.y = (getPosition().y + 16.f) / 32.f + 1;
  52. belowR.x = (getPosition().x + 30.f - m_collider->getLocalX()) / 32.f;
  53. belowR.y = (getPosition().y + 16.f) / 32.f + 1;
  54. ahead.x = (getPosition().x - 1.f - m_collider->getLocalX()) / 32.f;
  55. ahead.y = ((getPosition().y + 31.f) / 32.f);
  56. in.x = (getPosition().x + 16.f - m_collider->getLocalX()) / 32.f;
  57. in.y = (getPosition().y + 16.f) / 32.f;
  58. if(jump == 0.f && !m_jumping) {
  59. if(!m_collider->isSolid(belowL.x, belowL.y) && !m_collider->isSolid(belowR.x, belowR.y)) {
  60. jump = 32.f;
  61. } else if(m_collider->isSolid(ahead.x, ahead.y)) {
  62. m_jumping = true;
  63. jump_pos = getPosition();
  64. clock.restart();
  65. std::string str = "data/hop";
  66. str.push_back(rand() % HOPS + '0');
  67. str += ".ogg";
  68. m_hop.setBuffer(Asset::sound(str));
  69. m_hop.play();
  70. }
  71. }
  72. if(m_jumping) {
  73. float dt = clock.getElapsedTime().asSeconds() * 2.f;
  74. float dx, dy;
  75. if(dt < 0.5f) {
  76. dx = 32.f * std::pow(dt, 2);
  77. dy = 48.f - 192.f * std::pow(dt - 0.5f, 2);
  78. } else {
  79. dx = 32.f * std::pow(dt, 2);
  80. dy = 48.f - 64.f * std::pow(dt - 0.5f, 2);
  81. }
  82. setPosition(jump_pos - Vector2f(dx, dy));
  83. if(dt >= 1.f) {
  84. setPosition(jump_pos.x - 32.f, jump_pos.y - 32.f);
  85. m_jumping = false;
  86. }
  87. } else {
  88. if(jump != 0.f) {
  89. setAnimation("jump");
  90. jump -= math::sgn(jump) * delta * 200.f;
  91. move(0.f, math::sgn(jump) * delta * 200.f);
  92. if(std::fabs(jump) < 3.f) {
  93. move(0.f, jump);
  94. jump = 0.f;
  95. }
  96. } else {
  97. setAnimation("run");
  98. move(-delta * m_ms, 0.f);
  99. }
  100. }
  101. if(!m_collider->isSafe(ahead.x, ahead.y) || !m_collider->isSafe(in.x, in.y) || m_collider->isSolid(in.x, in.y)) {
  102. setAnimation("plop");
  103. m_dead = true;
  104. m_hop.setBuffer(Asset::sound("data/ouch.ogg"));
  105. m_hop.play();
  106. }
  107. }
  108. void Player::turboBoost() {
  109. setAnimationSpeed(2.f);
  110. m_ms *= 2.f;
  111. }