Player.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  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. isHit = true;
  72. if (newHealth <= 0)
  73. {
  74. exit(0);
  75. }
  76. health = newHealth;
  77. }
  78. void Player::HpUp(int hp)
  79. {
  80. if (health != maxHp)
  81. {
  82. int newHealth = health + hp;
  83. if (newHealth >= maxHp)
  84. {
  85. newHealth = maxHp;
  86. }
  87. health = newHealth;
  88. }
  89. }
  90. void Player::XpUp(int xpUp)
  91. {
  92. float newXp = xp + xpUp;
  93. if (newXp >= maxXp)
  94. {
  95. newXp -= maxXp;
  96. levelUp();
  97. }
  98. xp = newXp;
  99. }
  100. void Player::levelUp()
  101. {
  102. level++;
  103. maxXp += 50;
  104. maxHp += 10;
  105. health = maxHp;
  106. }
  107. void Player::loadWeapons()
  108. {
  109. std::string fileName = "weapons.json";
  110. //Open world json file
  111. std::ifstream file(fileName);
  112. if (!file.is_open())
  113. std::cout << "Error, can't open world file - " << fileName << "\n";
  114. json::Value v = json::readJson(file);
  115. file.close();
  116. //Check file
  117. if (v["weapons"].isNull())
  118. std::cout << "Invalid weapons file: " << fileName << "\n";
  119. //Load object templates
  120. for (auto w : v["weapons"])
  121. {
  122. Weapon* lweapon;
  123. Weapon* rweapon;
  124. std::string name = w["name"].asString();
  125. std::string fileN = w["file"].asString();
  126. float damage = w["damage"].asFloat();
  127. float scale = w["scale"].asFloat();
  128. Weapon::Element e = Weapon::FIRE;
  129. if(w["element"].asString() == "fire")
  130. e = Weapon::FIRE;
  131. else if (w["element"].asString() == "water")
  132. e = Weapon::WATER;
  133. else if (w["element"].asString() == "earth")
  134. e = Weapon::EARTH;
  135. else if (w["element"].asString() == "air")
  136. e = Weapon::AIR;
  137. else
  138. e = Weapon::FIRE;
  139. Vec3f leftoffset = Vec3f(w["left"]["offset"][0].asFloat(), w["left"]["offset"][1].asFloat(), w["left"]["offset"][2].asFloat());
  140. Vec3f rightoffset = Vec3f(w["right"]["offset"][0].asFloat(), w["right"]["offset"][1].asFloat(), w["right"]["offset"][2].asFloat());
  141. Vec3f anchor = Vec3f(w["anchor"][0].asFloat(), w["anchor"][1].asFloat(), w["anchor"][2].asFloat());
  142. Vec3f collision = Vec3f(w["collision"][0].asFloat(), w["collision"][1].asFloat(), w["collision"][2].asFloat());
  143. Vec2f maxRot = Vec2f(w["maxRotation"][0].asFloat(), w["maxRotation"][1].asFloat());
  144. Vec2f minRot = Vec2f(w["minRotation"][0].asFloat(), w["minRotation"][1].asFloat());
  145. lweapon = new Weapon(name, damage, e, fileN, scale, position, rotation, leftoffset, anchor, maxRot, minRot, collision);
  146. rweapon = new Weapon(name, damage, e, fileN, scale, position, rotation, rightoffset, anchor, maxRot, minRot, collision);
  147. leftweapons.push_back(lweapon);
  148. rightweapons.push_back(rweapon);
  149. }
  150. }
  151. void Player::PreviousRightWeapon()
  152. {
  153. currentrightweapon--;
  154. if (currentrightweapon < 0)
  155. currentrightweapon = (rightweapons.size() > level ? level - 1 : rightweapons.size() - 1);
  156. rightWeapon = rightweapons[currentrightweapon];
  157. rightWeapon->move(position);
  158. rightWeapon->rotate(rotation);
  159. }
  160. void Player::NextRightWeapon(void)
  161. {
  162. currentrightweapon++;
  163. if (currentrightweapon > level - 1 || currentrightweapon > rightweapons.size() - 1)
  164. currentrightweapon = 0;
  165. rightWeapon = rightweapons[currentrightweapon];
  166. rightWeapon->move(position);
  167. rightWeapon->rotate(rotation);
  168. }
  169. void Player::PreviousLeftWeapon(void)
  170. {
  171. currentleftweapon--;
  172. if (currentleftweapon < 0)
  173. currentleftweapon = (leftweapons.size() > level ? level - 1 : leftweapons.size() - 1);
  174. leftWeapon = leftweapons[currentleftweapon];
  175. leftWeapon->move(position);
  176. leftWeapon->rotate(rotation);
  177. }
  178. void Player::NextLeftWeapon(void)
  179. {
  180. currentleftweapon++;
  181. if (currentleftweapon > level - 1 || currentleftweapon > leftweapons.size() - 1)
  182. currentleftweapon = 0;
  183. leftWeapon = leftweapons[currentleftweapon];
  184. leftWeapon->move(position);
  185. leftWeapon->rotate(rotation);
  186. }