game/mario/mario.hpp
zv0n c453c2fe9a
All checks were successful
continuous-integration/drone/push Build is passing
Formatting
2022-11-19 23:10:33 +01:00

127 lines
3.5 KiB
C++

#ifndef MARIO_H
#define MARIO_H
#include "../sdlpp/sdlpp_rectrenderer.hpp"
#include "sprites.hpp"
#include "blocks.hpp"
#include <functional>
#define BIG_FLAG 0x0001
#define FIRE_FLAG 0x0002
#define STAR_FLAG 0x0004
class Mario : public MarioBlock {
public:
Mario(int x, int y, const std::shared_ptr<SDLPP::Renderer> &renderer,
std::function<void(std::shared_ptr<MarioBlock> &, bool)> addObject);
Mario(const std::shared_ptr<SDLPP::Renderer> &renderer,
std::function<void(std::shared_ptr<MarioBlock> &, bool)> addObject);
void walkLeft();
void walkRight();
void setStanding();
void handleVisitor(SDLPP::Visitor &visitor) override;
void jump();
void crouch();
void uncrouch();
#ifndef EDITOR
void fire();
void setAddObjFunc(
std::function<void(std::shared_ptr<MarioBlock> &, bool)> func);
std::function<void(std::shared_ptr<MarioBlock> &, bool)> getAddObjFunc();
#endif
void stopJump();
void custom_move(int ticks) override;
void visit(SDLPP::Visitor &visitor) override;
bool isDead() {
return _death;
}
void handleDeath();
void setBig();
void unsetBig();
void setStar() {
setStarFlag();
}
void unsetStar() {
unsetStarFlag();
}
bool isBig() const {
return special_flags & BIG_FLAG;
}
bool hasFire() const {
return special_flags & FIRE_FLAG;
}
bool hasStar() const {
return special_flags & STAR_FLAG;
}
bool isJumping() const {
return jumping;
}
bool isCrouching() const {
return _crouching;
}
bool walkingLeft() const {
return getMovement().getX() < 0;
}
bool walkingRight() const {
return getMovement().getX() > 0;
}
private:
std::function<void(std::shared_ptr<MarioBlock> &, bool)> _addObject;
void setDeath(bool dead = true) {
_death = dead;
}
bool _death = false;
bool controllable = true;
bool faces_right = true;
double side_movement = 0.3;
double jump_movement = 1.0;
bool jumping = false;
bool stop_jump = false;
bool _crouching = false;
double max_jump = 0;
double min_jump = 0;
double slow_jump = 0;
bool on_ground = true;
int ticks_till_gravity = 0;
int ticks_till_vulnurable = 0;
// gravity should be added every frame in 60fps game
const int base_gravity_ticks = 1000 / 60;
const int base_vulnurable_ticks = 1000;
const double gravity_add_jumping = jump_movement / 32.0;
const double gravity_add_falling = jump_movement / (64.0 / 7.0);
std::shared_ptr<SDLPP::RectColider> top_collision = nullptr;
void setWorldTypeSrc(LandType::Value world) override;
void stopMovement();
uint8_t special_flags = 0;
// SRCs
const SDL_Rect *standing_src = &MARIO_STANDING_SRC;
const SDL_Rect *death_src = &MARIO_DEATH_SRC;
const SDL_Rect *change_dir_src = &MARIO_CHANGE_DIR_SRC;
const SDL_Rect *jump_src = &MARIO_JUMP_SRC;
const std::vector<SDL_Rect> *walk_anim = &MARIO_WALK_ANIM;
void setBigFlag() {
special_flags = special_flags | BIG_FLAG;
}
void setFireFlag() {
special_flags = special_flags | FIRE_FLAG;
}
void setStarFlag() {
special_flags = special_flags | STAR_FLAG;
}
void unsetBigFlag() {
special_flags = special_flags & ~BIG_FLAG;
}
void unsetFireFlag() {
special_flags = special_flags & ~FIRE_FLAG;
}
void unsetStarFlag() {
special_flags = special_flags & ~STAR_FLAG;
}
};
#endif