Player.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. #define _USE_MATH_DEFINES
  2. #include <cmath>
  3. #include "Player.h"
  4. #include <GL/freeglut.h>
  5. #include <string>
  6. #include <iostream>
  7. #include <fstream>
  8. Player* Player::instance = NULL;
  9. Player::Player()
  10. {
  11. speed = 10;
  12. maxHp = 100;
  13. health = maxHp;
  14. xp = 0;
  15. maxXp = 100;
  16. level = 1;
  17. crystals = 0;
  18. loadWeapons();
  19. currentleftweapon = 0;
  20. leftWeapon = leftweapons[0];
  21. leftWeapon->rotateWeapon(Vec3f(150, 0, 60));
  22. currentrightweapon = 0;
  23. rightWeapon = rightweapons[0];
  24. rightWeapon->rotateWeapon(Vec3f(150, 0, 60));
  25. }
  26. Player* Player::getInstance()
  27. {
  28. if (instance == nullptr)
  29. instance = new Player();
  30. return instance;
  31. }
  32. void Player::init()
  33. {
  34. instance = new Player();
  35. }
  36. Player::~Player()
  37. {
  38. if (leftWeapon)
  39. delete leftWeapon;
  40. if (rightWeapon)
  41. delete rightWeapon;
  42. }
  43. void Player::setCamera()
  44. {
  45. glRotatef(rotation.x, 1, 0, 0);
  46. glRotatef(rotation.y, 0, 1, 0);
  47. glTranslatef(-position.x, -position.y, -position.z);
  48. leftWeapon->rotate(rotation);
  49. rightWeapon->rotate(rotation);
  50. }
  51. void Player::setPosition(float angle, float fac, bool height)
  52. {
  53. if (height)
  54. position.y += angle*fac;
  55. else
  56. {
  57. position.x -= (float)cos((rotation.y + angle) / 180 * M_PI) * fac;
  58. position.z -= (float)sin((rotation.y + angle) / 180 * M_PI) * fac;
  59. }
  60. leftWeapon->move(position);
  61. rightWeapon->move(position);
  62. }
  63. void Player::draw() {
  64. leftWeapon->draw();
  65. rightWeapon->draw();
  66. }
  67. void Player::HpDown(int damage)
  68. {
  69. int newHealth = health - damage;
  70. if (newHealth <= 0)
  71. {
  72. exit(0);
  73. }
  74. health = newHealth;
  75. }
  76. void Player::HpUp(int hp)
  77. {
  78. if (health != maxHp)
  79. {
  80. int newHealth = health + hp;
  81. if (newHealth >= maxHp)
  82. {
  83. newHealth = maxHp;
  84. }
  85. health = newHealth;
  86. }
  87. }
  88. void Player::XpUp(int xpUp)
  89. {
  90. float newXp = xp + xpUp;
  91. if (newXp >= maxXp)
  92. {
  93. newXp -= maxXp;
  94. levelUp();
  95. }
  96. xp = newXp;
  97. }
  98. void Player::levelUp()
  99. {
  100. level++;
  101. maxXp += 50;
  102. maxHp += 10;
  103. health = maxHp;
  104. }
  105. void Player::loadWeapons()
  106. {
  107. std::string fileName = "weapons.json";
  108. //Open world json file
  109. std::ifstream file(fileName);
  110. if (!file.is_open())
  111. std::cout << "Error, can't open world file - " << fileName << "\n";
  112. json::Value v = json::readJson(file);
  113. file.close();
  114. //Check file
  115. if (v["weapons"].isNull())
  116. std::cout << "Invalid weapons file: " << fileName << "\n";
  117. //Load object templates
  118. for (auto w : v["weapons"])
  119. {
  120. Weapon* lweapon;
  121. Weapon* rweapon;
  122. std::string name = w["name"].asString();
  123. std::string fileN = w["file"].asString();
  124. float damage = w["damage"].asFloat();
  125. Weapon::Element e = Weapon::FIRE;
  126. if(w["element"].asString() == "fire")
  127. e = Weapon::FIRE;
  128. else if (w["element"].asString() == "water")
  129. e = Weapon::WATER;
  130. else if (w["element"].asString() == "earth")
  131. e = Weapon::EARTH;
  132. else if (w["element"].asString() == "air")
  133. e = Weapon::AIR;
  134. else
  135. e = Weapon::FIRE;
  136. Vec3f leftoffset = Vec3f(w["left"]["offset"][0].asFloat(), w["left"]["offset"][1].asFloat(), w["left"]["offset"][2].asFloat());
  137. Vec3f rightoffset = Vec3f(w["right"]["offset"][0].asFloat(), w["right"]["offset"][1].asFloat(), w["right"]["offset"][2].asFloat());
  138. Vec3f anchor = Vec3f(w["anchor"][0].asFloat(), w["anchor"][1].asFloat(), w["anchor"][2].asFloat());
  139. Vec3f collision = Vec3f(w["collision"][0].asFloat(), w["collision"][1].asFloat(), w["collision"][2].asFloat());
  140. Vec2f maxRot = Vec2f(w["maxRotation"][0].asFloat(), w["maxRotation"][1].asFloat());
  141. Vec2f minRot = Vec2f(w["minRotation"][0].asFloat(), w["minRotation"][1].asFloat());
  142. lweapon = new Weapon(name, damage, e, fileN, 1, position, rotation, leftoffset, anchor, maxRot, minRot, collision);
  143. rweapon = new Weapon(name, damage, e, fileN, 1, position, rotation, rightoffset, anchor, maxRot, minRot, collision);
  144. leftweapons.push_back(lweapon);
  145. rightweapons.push_back(rweapon);
  146. }
  147. }
  148. void Player::PreviousRightWeapon()
  149. {
  150. currentrightweapon--;
  151. if (currentrightweapon < 0)
  152. currentrightweapon = (rightweapons.size() > level ? level - 1 : rightweapons.size() - 1);
  153. rightWeapon = rightweapons[currentrightweapon];
  154. }
  155. void Player::NextRightWeapon(void)
  156. {
  157. currentrightweapon++;
  158. if (currentrightweapon > level - 1 || currentrightweapon > rightweapons.size() - 1)
  159. currentrightweapon = 0;
  160. rightWeapon = rightweapons[currentrightweapon];
  161. }
  162. void Player::PreviousLeftWeapon(void)
  163. {
  164. currentleftweapon--;
  165. if (currentleftweapon < 0)
  166. currentleftweapon = (leftweapons.size() > level ? level - 1 : leftweapons.size() - 1);
  167. leftWeapon = leftweapons[currentleftweapon];
  168. }
  169. void Player::NextLeftWeapon(void)
  170. {
  171. currentleftweapon++;
  172. if (currentleftweapon > level - 1 || currentleftweapon > leftweapons.size() - 1)
  173. currentleftweapon = 0;
  174. leftWeapon = leftweapons[currentleftweapon];
  175. }