暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

programmer.cpp 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include "programmer.h"
  2. #include "debuggers.h"
  3. #include "olcPGEX_Sound.h"
  4. #include <iostream>
  5. namespace pabloader {
  6. Programmer::Programmer(Debuggers* game)
  7. : Entity(game)
  8. {
  9. w = game->playerSprite.width / 4;
  10. h = game->playerSprite.height / 4;
  11. x = (game->ScreenWidth() - w) / 2;
  12. y = h / 2;
  13. }
  14. void Programmer::Think()
  15. {
  16. Bug* closest = nullptr;
  17. float dist = 1e100;
  18. for (auto bug : game->bugs) {
  19. float d = bug->Dist(this);
  20. if (d < dist && bug->GetY() > 0) {
  21. dist = d;
  22. closest = bug;
  23. }
  24. }
  25. if (closest != nullptr) {
  26. doJump = closest->GetY() < y;
  27. moveDown = closest->GetY() > y;
  28. walkLeft = closest->GetX() < x;
  29. walkRight = closest->GetX() > x;
  30. } else {
  31. doJump = false;
  32. walkLeft = false;
  33. walkRight = false;
  34. moveDown = false;
  35. }
  36. }
  37. void Programmer::Update(float dt)
  38. {
  39. x += xv * dt;
  40. y += yv * dt;
  41. xv *= 1 - 0.2 * dt;
  42. if (!onGround) {
  43. yv += (70 + skin * 30) * dt;
  44. yv *= 1 - 0.05 * dt;
  45. } else {
  46. xv *= 1 - dt;
  47. }
  48. transform.Reset();
  49. bool userInput = false;
  50. if (doJump && onGround) {
  51. yv = -100 - 50 * skin;
  52. userInput = true;
  53. }
  54. if (walkLeft) {
  55. xv -= (150 + skin * 50) * dt;
  56. userInput = true;
  57. }
  58. if (walkRight) {
  59. xv += (150 + skin * 50) * dt;
  60. userInput = true;
  61. }
  62. if (moveDown) {
  63. if (!onGround) {
  64. yv += (150 + skin * 50) * dt;
  65. }
  66. userInput = true;
  67. }
  68. if (x > game->ScreenWidth() - w / 2) {
  69. xv *= -0.3;
  70. x = game->ScreenWidth() - w / 2;
  71. olc::SOUND::PlaySample(game->playerFallSample);
  72. }
  73. if (x < w / 2) {
  74. xv *= -0.3;
  75. x = w / 2;
  76. olc::SOUND::PlaySample(game->playerFallSample);
  77. }
  78. if (y > game->GameScreenHeight() - h / 2) {
  79. yv *= -0.3;
  80. if (std::abs(yv) < 2) {
  81. yv = 0;
  82. }
  83. y = game->GameScreenHeight() - h / 2;
  84. }
  85. bool newOnGround = y >= game->GameScreenHeight() - h / 2;
  86. if (newOnGround && !onGround) {
  87. olc::SOUND::PlaySample(game->playerFallSample);
  88. }
  89. onGround = newOnGround;
  90. if (onGround) {
  91. tile = 2;
  92. tileCounter = static_cast<uint32_t>(0.1 / dt);
  93. } else if (tileCounter <= 0) {
  94. tile = 0;
  95. } else {
  96. tileCounter--;
  97. }
  98. if (!userInput && std::abs(xv) < 2) {
  99. xv = 0;
  100. }
  101. if (xv < 0) {
  102. transform.Scale(-1, 1);
  103. }
  104. transform.Translate(x, y);
  105. }
  106. void Programmer::Draw()
  107. {
  108. int xOff = xv < 0 ? -1 : 0;
  109. if (std::abs(xv) < 1) {
  110. olc::GFX2D::DrawPartialSprite(&game->playerSprite, skin * w + xOff, h + tile * h, w - xOff, h, transform, true);
  111. } else {
  112. olc::GFX2D::DrawPartialSprite(&game->playerSprite, skin * w + xOff, 0 + tile * h, w - xOff, h, transform, true);
  113. }
  114. #ifdef _DEBUG
  115. game->DrawRect(x - w / 2, y - h / 2, w, h, olc::GREEN);
  116. #endif
  117. }
  118. }