Klasa Crab - Inf512-MotorolaScienceCup/gra-PANG GitHub Wiki
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);
}