123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- #include "programmer.h"
- #include "debuggers.h"
- #include "olcPGEX_Sound.h"
- #include <iostream>
-
- namespace pabloader {
- Programmer::Programmer(Debuggers* game)
- : Entity(game)
- {
- w = game->playerSprite.width / 4;
- h = game->playerSprite.height / 4;
- x = (game->ScreenWidth() - w) / 2;
- y = h / 2;
- }
-
- void Programmer::Think()
- {
- Bug* closest = nullptr;
- float dist = 1e100;
- for (auto bug : game->bugs) {
- float d = bug->Dist(this);
- if (d < dist && bug->GetY() > 0) {
- dist = d;
- closest = bug;
- }
- }
-
- if (closest != nullptr) {
- doJump = closest->GetY() < y;
- moveDown = closest->GetY() > y;
- walkLeft = closest->GetX() < x;
- walkRight = closest->GetX() > x;
- } else {
- doJump = false;
- walkLeft = false;
- walkRight = false;
- moveDown = false;
- }
- }
-
- void Programmer::Update(float dt)
- {
- x += xv * dt;
- y += yv * dt;
-
- xv *= 1 - 0.2 * dt;
-
- if (!onGround) {
- yv += (70 + skin * 30) * dt;
- yv *= 1 - 0.05 * dt;
- } else {
- xv *= 1 - dt;
- }
-
- transform.Reset();
-
- bool userInput = false;
-
- if (doJump && onGround) {
- yv = -100 - 50 * skin;
- userInput = true;
- }
-
- if (walkLeft) {
- xv -= (150 + skin * 50) * dt;
- userInput = true;
- }
-
- if (walkRight) {
- xv += (150 + skin * 50) * dt;
- userInput = true;
- }
-
- if (moveDown) {
- if (!onGround) {
- yv += (150 + skin * 50) * dt;
- }
- userInput = true;
- }
-
- if (x > game->ScreenWidth() - w / 2) {
- xv *= -0.3;
- x = game->ScreenWidth() - w / 2;
- olc::SOUND::PlaySample(game->playerFallSample);
- }
-
- if (x < w / 2) {
- xv *= -0.3;
- x = w / 2;
- olc::SOUND::PlaySample(game->playerFallSample);
- }
-
- if (y > game->GameScreenHeight() - h / 2) {
- yv *= -0.3;
-
- if (std::abs(yv) < 2) {
- yv = 0;
- }
- y = game->GameScreenHeight() - h / 2;
- }
-
- bool newOnGround = y >= game->GameScreenHeight() - h / 2;
- if (newOnGround && !onGround) {
- olc::SOUND::PlaySample(game->playerFallSample);
- }
- onGround = newOnGround;
-
- if (onGround) {
- tile = 2;
- tileCounter = static_cast<uint32_t>(0.1 / dt);
- } else if (tileCounter <= 0) {
- tile = 0;
- } else {
- tileCounter--;
- }
-
- if (!userInput && std::abs(xv) < 2) {
- xv = 0;
- }
- if (xv < 0) {
- transform.Scale(-1, 1);
- }
- transform.Translate(x, y);
- }
-
- void Programmer::Draw()
- {
- int xOff = xv < 0 ? -1 : 0;
- if (std::abs(xv) < 1) {
- olc::GFX2D::DrawPartialSprite(&game->playerSprite, skin * w + xOff, h + tile * h, w - xOff, h, transform, true);
- } else {
- olc::GFX2D::DrawPartialSprite(&game->playerSprite, skin * w + xOff, 0 + tile * h, w - xOff, h, transform, true);
- }
- #ifdef _DEBUG
- game->DrawRect(x - w / 2, y - h / 2, w, h, olc::GREEN);
- #endif
- }
- }
|