Player.cpp 4.9 KB

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