暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

debuggers.cpp 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #include "debuggers.h"
  2. #include <cmath>
  3. #include <ctime>
  4. #include <iostream>
  5. #include <random>
  6. namespace pabloader {
  7. std::string& rtrim(std::string& str, const std::string& chars = "\t\n\v\f\r ")
  8. {
  9. str.erase(str.find_last_not_of(chars) + 1);
  10. return str;
  11. }
  12. bool Debuggers::OnUserCreate()
  13. {
  14. SetPixelMode(olc::Pixel::MASK);
  15. std::srand(std::time(0));
  16. if (!olc::SOUND::InitialiseAudio()) {
  17. std::cerr << "Cannot init audio" << std::endl;
  18. return false;
  19. }
  20. if (!pack.LoadPack("debuggers.pgp")) {
  21. std::cerr << "Cannot load resource pack res/debuggers.pgp" << std::endl;
  22. return false;
  23. }
  24. // Load Player
  25. std::string fileName = "res/player.pgs";
  26. if (!playerSprite.LoadFromPGESprFile(fileName, &pack)) {
  27. std::cerr << "[Load player] File " << fileName << " is not found" << std::endl;
  28. return false;
  29. }
  30. fileName = "res/fall.wav";
  31. playerFallSample = olc::SOUND::LoadAudioSample(fileName, &pack);
  32. if (playerFallSample < 0) {
  33. std::cerr << "[Load fall] File " << fileName << " is not found" << std::endl;
  34. return false;
  35. }
  36. // Load enemies
  37. fileName = "res/enemies.pgs";
  38. if (!enemiesSprite.LoadFromPGESprFile(fileName, &pack)) {
  39. std::cerr << "[Load enemies] File " << fileName << " is not found" << std::endl;
  40. return false;
  41. }
  42. fileName = "res/bug_fall.wav";
  43. bugFallSample = olc::SOUND::LoadAudioSample(fileName, &pack);
  44. if (bugFallSample < 0) {
  45. std::cerr << "[Load bug fall] File " << fileName << " is not found" << std::endl;
  46. return false;
  47. }
  48. fileName = "res/bug_catch.wav";
  49. bugCatchSample = olc::SOUND::LoadAudioSample(fileName, &pack);
  50. if (bugCatchSample < 0) {
  51. std::cerr << "[Load bug catch] File " << fileName << " is not found" << std::endl;
  52. return false;
  53. }
  54. // Load background
  55. fileName = "res/bg.pgs";
  56. if (!backgroundSprite.LoadFromPGESprFile(fileName, &pack)) {
  57. std::cerr << "[Load background] File " << fileName << " is not found" << std::endl;
  58. return false;
  59. }
  60. fileName = "src/debuggers.cpp";
  61. auto streamBuffer = pack.GetStreamBuffer(fileName);
  62. if (streamBuffer.data == nullptr) {
  63. std::cerr << "[Load source] File " << fileName << " is not found" << std::endl;
  64. return false;
  65. }
  66. std::istream is(&streamBuffer);
  67. std::string line;
  68. while (std::getline(is, line)) {
  69. if (!rtrim(line).empty())
  70. sourceCode.push_back(line);
  71. }
  72. totalLines = sourceCode.size();
  73. // Free Memory
  74. pack.ClearPack();
  75. // Creating entities
  76. auto player = new Player(this);
  77. programmers.push_back(player);
  78. return true;
  79. }
  80. bool Debuggers::OnUserUpdate(float fElapsedTime)
  81. {
  82. if (!IsFocused())
  83. return true;
  84. if (sourceCode.size() == 0) {
  85. return GameOver();
  86. }
  87. DrawSprite(0, 0, &backgroundSprite);
  88. uint32_t bugsSize = bugs.size();
  89. for (auto bug : bugs) {
  90. if (bug->IsActive()) {
  91. bug->Update(fElapsedTime);
  92. bug->Draw();
  93. for (auto& programmer : programmers) {
  94. if (programmer->Collides(bug)) {
  95. bugsCatched++;
  96. bug->Kill();
  97. olc::SOUND::PlaySample(bugCatchSample);
  98. SpawnBug();
  99. }
  100. }
  101. } else {
  102. bugsMissed++;
  103. sourceCode.erase(sourceCode.begin());
  104. SpawnBug();
  105. olc::SOUND::PlaySample(bugFallSample);
  106. }
  107. }
  108. linesOfCode = (sourceCode.size() * 4 / totalLines) + 1;
  109. for (auto it = programmers.rbegin(); it != programmers.rend(); it++) {
  110. auto& programmer = *it;
  111. programmer->Think();
  112. programmer->Update(fElapsedTime);
  113. programmer->Draw();
  114. }
  115. Programmer* player = programmers.at(0);
  116. if (bugsSize == 0 && player->IsOnGround()) {
  117. SpawnBug();
  118. }
  119. if (bugsCatched >= 15 * bugsSize * programmers.size() && player->GetSkin() < bugsSize) {
  120. player->UpgradeLevel();
  121. SpawnBug();
  122. SpawnBug();
  123. SpawnProgrammer();
  124. }
  125. #ifdef _DEBUG
  126. DrawString(1, 37, "Bugs: " + std::to_string(bugs.size()));
  127. if (GetKey(olc::B).bPressed) {
  128. SpawnBug();
  129. }
  130. if (GetKey(olc::P).bPressed) {
  131. SpawnProgrammer();
  132. }
  133. #endif
  134. DrawString(1, 1, "A,S,D - move; SPACE - jump", olc::CYAN);
  135. DrawString(1, 10, "Don't let the bugs destroy your code!", olc::YELLOW);
  136. DrawString(1, 19, "Bugs catched: " + std::to_string(bugsCatched));
  137. DrawString(1, 28, "Bugs missed: " + std::to_string(bugsMissed));
  138. int y = GameScreenHeight();
  139. FillRect(0, y - 1, ScreenWidth(), ScreenHeight() - y + 1, olc::VERY_DARK_GREY);
  140. for (auto& line : sourceCode) {
  141. DrawString(1, y, line);
  142. y += 10;
  143. if (y >= ScreenHeight())
  144. break;
  145. }
  146. return true;
  147. }
  148. bool Debuggers::GameOver()
  149. {
  150. DrawSprite(0, 0, &backgroundSprite);
  151. DrawString(ScreenWidth() / 2 - 143, ScreenHeight() / 2 - 15, "GAME OVER", olc::BLACK, 4);
  152. DrawString(ScreenWidth() / 2 - 144, ScreenHeight() / 2 - 16, "GAME OVER", olc::RED, 4);
  153. DrawString(ScreenWidth() / 2 - 144, ScreenHeight() / 2 + 16, "Bugs catched: " + std::to_string(bugsCatched), olc::CYAN, 2);
  154. return true;
  155. }
  156. void Debuggers::SpawnBug()
  157. {
  158. auto bug = CreateBug();
  159. bug->ResetPosition();
  160. }
  161. void Debuggers::SpawnProgrammer()
  162. {
  163. auto programmer = new Programmer(this);
  164. programmers.push_back(programmer);
  165. }
  166. Bug* Debuggers::CreateBug()
  167. {
  168. for (auto bug : bugs) {
  169. if (!bug->IsActive())
  170. return bug;
  171. }
  172. auto bug = new Bug(this);
  173. bugs.push_back(bug);
  174. return bug;
  175. }
  176. bool Debuggers::OnUserDestroy()
  177. {
  178. olc::SOUND::DestroyAudio();
  179. return true;
  180. }
  181. }