Klasa Crab - Inf512-MotorolaScienceCup/gra-PANG GitHub Wiki

Klasa Crab

Tworzy kraba będącego utrudnieniem dla gracza. Działa na niego grawitacja, a po zderzeniu z boczną ścianką zmieniany jest znak aktualnej prędkości w pozycji x. Zmiana klatki następuje co 10 klatek.

class Crab : public Sprite {
public:
    Crab(Game* game, float x, float y, int heading);
    Crab(Game* game, std::ifstream&);
    virtual void Draw();
    virtual void Move();
    virtual void Collision(Sprite*);
    virtual void Save(std::ofstream&);

private:
    Texture2D * texture;
    Rectangle moveTexture;
    Vector2 speed;
    short int frameCounter;
    bool stopMoving = false;
};

Crab::Crab(Game* game, float x, float y, int heading)
    : Sprite(game, Position(x, y, 0, 0), Type::CRAB) {
    texture = &game->textures[CRAB];
    position.rectangle.width = texture->width / 4;
    position.hbRectangle.width = position.rectangle.width;
    position.rectangle.height = texture->height;
    position.hbRectangle.height = position.rectangle.height;
    moveTexture = { 0, 0, position.rectangle.width, position.rectangle.height };
    frameCounter = 0;

    speed.x = 1.7f * heading;
    speed.y = 0;
}

Crab::Crab(Game* game, std::ifstream& s)
    : Sprite(game, s, Type::CRAB) {
    Read(s, &speed);
    Read(s, &frameCounter);
    texture = &game->textures[CRAB];
    moveTexture = { 0, 0, position.rectangle.width, position.rectangle.height };
}

void Crab::Draw() {
    if (state == State::ACTIVE) {
        DrawTextureRec(*texture, moveTexture, { position.rectangle.x, position.rectangle.y }, WHITE);
        if (frameCounter++ % 10 == 0) {
            moveTexture.x = (moveTexture.x + moveTexture.width >= texture->width) ? moveTexture.x = 0 : moveTexture.x + moveTexture.width;
            frameCounter = 1;
        }
    }
}

void Crab::Move() {
    if (state == State::ACTIVE) {
        speed.y += 0.5;

        position.rectangle.x += speed.x;
        position.rectangle.y += speed.y;
    }
}

void Crab::Collision(Sprite* sprite) {
    if (state == State::ACTIVE) {
        if (sprite->type == Sprite::Type::BLOCK) {
            bool collision = CheckCollisionRecs({ position.rectangle.x, position.rectangle.y - speed.y, position.rectangle.width, position.rectangle.height }, sprite->position.rectangle);
            if (collision) {
                if (speed.x > 0) {
                    position.rectangle.x = sprite->position.rectangle.x - position.rectangle.width - 1;
                    speed.x *= -1;
                } else {
                    position.rectangle.x = sprite->position.rectangle.x + sprite->position.rectangle.width + 1;
                    speed.x *= -1;
                }
            } else {
                position.rectangle.y = sprite->position.rectangle.y - position.rectangle.height - 1;
                speed.y = 0;
            }
        } else if (sprite->type == Sprite::Type::WEAPON) {
            game->AddPowerup(position.rectangle.x, position.rectangle.y - 10);
            state = State::FINISHED;
        }
    }
}

void Crab::Save(std::ofstream& s) {
    Write(s, &type);
    position.Save(s);
    Write(s, &speed);
    Write(s, &frameCounter);
}
⚠️ **GitHub.com Fallback** ⚠️