Mario: Fireball works
Some checks reported errors
continuous-integration/drone/push Build encountered an error
Some checks reported errors
continuous-integration/drone/push Build encountered an error
This commit is contained in:
parent
3cde73d1ed
commit
7bd652f4e9
@ -75,9 +75,11 @@ target_sources(mario
|
|||||||
PRIVATE visitors/goomba_visitor.cpp
|
PRIVATE visitors/goomba_visitor.cpp
|
||||||
PRIVATE visitors/bounce_visitor.cpp
|
PRIVATE visitors/bounce_visitor.cpp
|
||||||
PRIVATE visitors/visitor_generator.cpp
|
PRIVATE visitors/visitor_generator.cpp
|
||||||
|
PRIVATE visitors/projectile_visitor.cpp
|
||||||
PRIVATE blocks/coinblock.cpp
|
PRIVATE blocks/coinblock.cpp
|
||||||
PRIVATE blocks/mushroomblock.cpp
|
PRIVATE blocks/mushroomblock.cpp
|
||||||
PRIVATE blocks/goombablock.cpp
|
PRIVATE blocks/goombablock.cpp
|
||||||
|
PRIVATE blocks/fireball.cpp
|
||||||
PRIVATE scenes/load_scene.cpp
|
PRIVATE scenes/load_scene.cpp
|
||||||
PRIVATE scenes/game_main_menu.cpp
|
PRIVATE scenes/game_main_menu.cpp
|
||||||
PRIVATE editor_visitor.cpp # TODO
|
PRIVATE editor_visitor.cpp # TODO
|
||||||
|
@ -559,7 +559,7 @@ createBlockById(uint64_t id, int x, int y,
|
|||||||
break;
|
break;
|
||||||
case MARIO_ID:
|
case MARIO_ID:
|
||||||
result = std::static_pointer_cast<MarioBlock>(
|
result = std::static_pointer_cast<MarioBlock>(
|
||||||
std::make_shared<Mario>(x, y, renderer));
|
std::make_shared<Mario>(x, y, renderer, nullptr));
|
||||||
break;
|
break;
|
||||||
case GOOMBA_ID:
|
case GOOMBA_ID:
|
||||||
result = std::static_pointer_cast<MarioBlock>(
|
result = std::static_pointer_cast<MarioBlock>(
|
||||||
|
70
mario/blocks/fireball.cpp
Normal file
70
mario/blocks/fireball.cpp
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
#include "fireball.hpp"
|
||||||
|
#include "../sprites.hpp"
|
||||||
|
#include "../global_vars.hpp"
|
||||||
|
#include "../objectids.hpp"
|
||||||
|
#include "../visitors/projectile_visitor.hpp"
|
||||||
|
|
||||||
|
Fireball::Fireball(int x, int y, std::shared_ptr<SDLPP::Renderer> &renderer)
|
||||||
|
: MarioBlock(x, y, renderer, g_items_texture, FIRE_BALL_ANIM[3]) {
|
||||||
|
setHidden(true);
|
||||||
|
ensureCollision();
|
||||||
|
setSize({BLOCK_SIZE/2, BLOCK_SIZE/2});
|
||||||
|
setId(FIREBALL_ID);
|
||||||
|
setBouncable(true);
|
||||||
|
setAnimationFrames(FIRE_BALL_ANIM);
|
||||||
|
setAnimationSpeed(16);
|
||||||
|
resumeAnimation();
|
||||||
|
setOnGround(false);
|
||||||
|
|
||||||
|
auto bottom_detect = SDLPP::RectColider(0.2, 1, 0.6, 0, NPC_FLOOR_DETECT);
|
||||||
|
bottom_detect.setColor("#FF0000");
|
||||||
|
bottom_detect.setOutlineColor("#FF0000");
|
||||||
|
bottom_detect.setMinHeight(1);
|
||||||
|
addCollision(bottom_detect);
|
||||||
|
addCollision(SDLPP::RectColider(0, 0.25, 0.1, 0.6, NPC_LEFT_SIDE_DETECT));
|
||||||
|
addCollision(
|
||||||
|
SDLPP::RectColider(0.9, 0.25, 0.1, 0.6, NPC_RIGHT_SIDE_DETECT));
|
||||||
|
jump_movement = movementSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Fireball::custom_move(int ticks) {
|
||||||
|
ticks_till_death -= ticks;
|
||||||
|
if (ticks_till_death <= 0) {
|
||||||
|
destroy();
|
||||||
|
}
|
||||||
|
gravity(ticks);
|
||||||
|
MarioBlock::custom_move(ticks);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Fireball::setMovementDir(bool left) {
|
||||||
|
setMovement(movementSpeed / 2 * (left ? -1 : 1), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Fireball::handleVisitor(SDLPP::Visitor &visitor) {
|
||||||
|
#ifndef EDITOR
|
||||||
|
// TODO -
|
||||||
|
// https://web.archive.org/web/20130807122227/http://i276.photobucket.com/albums/kk21/jdaster64/smb_playerphysics.png
|
||||||
|
auto &p_visitor = dynamic_cast<ProjectileVisitor &>(visitor);
|
||||||
|
// handle gravity
|
||||||
|
setOnGround(p_visitor.isOnGround());
|
||||||
|
if(p_visitor.isOnGround() && jump_movement > movementSpeed/16) {
|
||||||
|
setMovement(getMovement().getX(), -jump_movement);
|
||||||
|
setPos(getPos() - SDLPP::Vec2D<double>(0, jump_movement * BLOCK_SIZE));
|
||||||
|
jump_movement /= 2;
|
||||||
|
setOnGround(false);
|
||||||
|
}
|
||||||
|
if (p_visitor.canGoLeft() != p_visitor.canGoRight()) {
|
||||||
|
if(p_visitor.canGoLeft()) {
|
||||||
|
// we only want to be the size of the fireball left of the blockage
|
||||||
|
setPos(-1 * getDoubleRect().second.getX() + p_visitor.getMovementBlockage().getX(), getPos().getY());
|
||||||
|
} else {
|
||||||
|
// we want to be size of the blockage away from the blockage
|
||||||
|
setPos(BLOCK_SIZE + p_visitor.getMovementBlockage().getX(), getPos().getY());
|
||||||
|
}
|
||||||
|
setMovementDir(getMovement().getX() > 0);
|
||||||
|
}
|
||||||
|
if (p_visitor.getDeath()) {
|
||||||
|
destroy();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
18
mario/blocks/fireball.hpp
Normal file
18
mario/blocks/fireball.hpp
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#ifndef FIREBALL_HPP
|
||||||
|
#define FIREBALL_HPP
|
||||||
|
|
||||||
|
#include "../blocks.hpp"
|
||||||
|
|
||||||
|
class Fireball : public MarioBlock {
|
||||||
|
public:
|
||||||
|
Fireball(int x, int y, std::shared_ptr<SDLPP::Renderer> &renderer);
|
||||||
|
void custom_move(int ticks) override;
|
||||||
|
void handleVisitor(SDLPP::Visitor &visitor) override;
|
||||||
|
void setMovementDir(bool left);
|
||||||
|
private:
|
||||||
|
double jump_movement;
|
||||||
|
bool jumping = false;
|
||||||
|
long ticks_till_death = 3100;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
@ -72,6 +72,9 @@ void GoombaBlock::handleVisitor(SDLPP::Visitor &visitor) {
|
|||||||
startDeath();
|
startDeath();
|
||||||
// destroy();
|
// destroy();
|
||||||
}
|
}
|
||||||
|
if (g_visitor.instantDeath()) {
|
||||||
|
destroy();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ std::shared_ptr<SDLPP::Texture> g_terrain_texture{};
|
|||||||
std::shared_ptr<SDLPP::Texture> g_mario_texture{};
|
std::shared_ptr<SDLPP::Texture> g_mario_texture{};
|
||||||
std::shared_ptr<SDLPP::Texture> g_mod_texture{};
|
std::shared_ptr<SDLPP::Texture> g_mod_texture{};
|
||||||
std::shared_ptr<SDLPP::Texture> g_enemies_texture{};
|
std::shared_ptr<SDLPP::Texture> g_enemies_texture{};
|
||||||
|
std::shared_ptr<SDLPP::Texture> g_items_texture{};
|
||||||
std::shared_ptr<SDLPP::Texture> g_translucent_terrain_texture{};
|
std::shared_ptr<SDLPP::Texture> g_translucent_terrain_texture{};
|
||||||
std::shared_ptr<SDLPP::Texture> g_translucent_mod_texture{};
|
std::shared_ptr<SDLPP::Texture> g_translucent_mod_texture{};
|
||||||
std::shared_ptr<SDLPP::Texture> g_translucent_enemies_texture;
|
std::shared_ptr<SDLPP::Texture> g_translucent_enemies_texture;
|
||||||
|
@ -7,6 +7,7 @@ extern std::shared_ptr<SDLPP::Texture> g_terrain_texture;
|
|||||||
extern std::shared_ptr<SDLPP::Texture> g_mario_texture;
|
extern std::shared_ptr<SDLPP::Texture> g_mario_texture;
|
||||||
extern std::shared_ptr<SDLPP::Texture> g_mod_texture;
|
extern std::shared_ptr<SDLPP::Texture> g_mod_texture;
|
||||||
extern std::shared_ptr<SDLPP::Texture> g_enemies_texture;
|
extern std::shared_ptr<SDLPP::Texture> g_enemies_texture;
|
||||||
|
extern std::shared_ptr<SDLPP::Texture> g_items_texture;
|
||||||
extern std::shared_ptr<SDLPP::Texture> g_translucent_terrain_texture;
|
extern std::shared_ptr<SDLPP::Texture> g_translucent_terrain_texture;
|
||||||
extern std::shared_ptr<SDLPP::Texture> g_translucent_mod_texture;
|
extern std::shared_ptr<SDLPP::Texture> g_translucent_mod_texture;
|
||||||
extern std::shared_ptr<SDLPP::Texture> g_translucent_enemies_texture;
|
extern std::shared_ptr<SDLPP::Texture> g_translucent_enemies_texture;
|
||||||
|
@ -72,6 +72,9 @@ void handleKeyDown(SDL_Keycode key, SDLPP::Scene &scene) {
|
|||||||
if (fps) {
|
if (fps) {
|
||||||
fps->setHidden(!fps->getHidden());
|
fps->setHidden(!fps->getHidden());
|
||||||
}
|
}
|
||||||
|
case SDLK_RETURN:
|
||||||
|
mario->fire();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -261,6 +264,24 @@ void mainGameAdditional(std::shared_ptr<SDLPP::Scene> & /*UNUSED*/) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void addObjectToScene(std::shared_ptr<MarioBlock> &object, bool moving) {
|
||||||
|
game_scenes.back().scene->addObject(object);
|
||||||
|
object->setAlignment(SDLPP::OBJ_CENTER, SDLPP::OBJ_CENTER);
|
||||||
|
if(moving) {
|
||||||
|
moving_objects.push_back(object);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void addObjectToSceneTop(std::shared_ptr<MarioBlock> &object, bool moving) {
|
||||||
|
addObjectToScene(object, moving);
|
||||||
|
game_scenes.back().scene->moveZTop(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
void addObjectToSceneBack(std::shared_ptr<MarioBlock> &object, bool moving) {
|
||||||
|
addObjectToScene(object, moving);
|
||||||
|
game_scenes.back().scene->moveZJustAboveBackground(object);
|
||||||
|
}
|
||||||
|
|
||||||
SceneStruct mainGameScene(const std::string &level_path) {
|
SceneStruct mainGameScene(const std::string &level_path) {
|
||||||
auto scene = std::make_shared<SDLPP::Scene>(renderer);
|
auto scene = std::make_shared<SDLPP::Scene>(renderer);
|
||||||
g_playground = scene;
|
g_playground = scene;
|
||||||
@ -272,7 +293,7 @@ SceneStruct mainGameScene(const std::string &level_path) {
|
|||||||
scene->addObject(bg);
|
scene->addObject(bg);
|
||||||
|
|
||||||
mario.reset();
|
mario.reset();
|
||||||
mario = std::make_shared<Mario>(renderer);
|
mario = std::make_shared<Mario>(renderer, addObjectToSceneTop);
|
||||||
scene->addObject(mario);
|
scene->addObject(mario);
|
||||||
|
|
||||||
auto defeat =
|
auto defeat =
|
||||||
@ -390,6 +411,8 @@ int main() {
|
|||||||
renderer, "sprites/terrain.png", MARIO_OVERWORLD_COLORKEY);
|
renderer, "sprites/terrain.png", MARIO_OVERWORLD_COLORKEY);
|
||||||
g_enemies_texture = std::make_shared<SDLPP::Texture>(
|
g_enemies_texture = std::make_shared<SDLPP::Texture>(
|
||||||
renderer, "sprites/enemies.png", MARIO_OVERWORLD_COLORKEY);
|
renderer, "sprites/enemies.png", MARIO_OVERWORLD_COLORKEY);
|
||||||
|
g_items_texture = std::make_shared<SDLPP::Texture>(
|
||||||
|
renderer, "sprites/items.png", MARIO_OVERWORLD_COLORKEY);
|
||||||
|
|
||||||
g_mario_texture = std::make_shared<SDLPP::Texture>(
|
g_mario_texture = std::make_shared<SDLPP::Texture>(
|
||||||
renderer, "sprites/mario.png", MARIO_OVERWORLD_COLORKEY);
|
renderer, "sprites/mario.png", MARIO_OVERWORLD_COLORKEY);
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#include "../sdlpp/sdlpp_rectrenderer.hpp"
|
#include "../sdlpp/sdlpp_rectrenderer.hpp"
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include "mario.hpp"
|
||||||
#include "sprites.hpp"
|
#include "sprites.hpp"
|
||||||
#include "blocks.hpp"
|
#include "blocks.hpp"
|
||||||
#include "objectids.hpp"
|
#include "objectids.hpp"
|
||||||
@ -188,10 +189,13 @@ void loadMapV01(std::shared_ptr<SDLPP::Scene> &scene,
|
|||||||
if (block.hasCharacter()) {
|
if (block.hasCharacter()) {
|
||||||
if (block.getCharacterId() == MARIO_ID) {
|
if (block.getCharacterId() == MARIO_ID) {
|
||||||
if (editor) {
|
if (editor) {
|
||||||
scene->addObject(createMario(block.getCharacterType(),
|
auto mario2 = createMario(block.getCharacterType(),
|
||||||
renderer, i, j, true));
|
renderer, i, j, true);
|
||||||
mario =
|
scene->addObject(mario2);
|
||||||
scene->getObject(scene->getObjects().size() - 1);
|
#ifndef EDITOR
|
||||||
|
std::dynamic_pointer_cast<Mario>(mario2)->setAddObjFunc(std::dynamic_pointer_cast<Mario>(mario)->getAddObjFunc());
|
||||||
|
#endif
|
||||||
|
mario = mario2;
|
||||||
} else {
|
} else {
|
||||||
mario->setPos(i * BLOCK_SIZE,
|
mario->setPos(i * BLOCK_SIZE,
|
||||||
1 - (16 - j) * BLOCK_SIZE);
|
1 - (16 - j) * BLOCK_SIZE);
|
||||||
|
@ -4,9 +4,10 @@
|
|||||||
#include "objectids.hpp"
|
#include "objectids.hpp"
|
||||||
#include "sprites.hpp"
|
#include "sprites.hpp"
|
||||||
#include "visitors/mario_visitor.hpp"
|
#include "visitors/mario_visitor.hpp"
|
||||||
|
#include "blocks/fireball.hpp"
|
||||||
|
|
||||||
Mario::Mario(int x, int y, const std::shared_ptr<SDLPP::Renderer> &renderer)
|
Mario::Mario(int x, int y, const std::shared_ptr<SDLPP::Renderer> &renderer, std::function<void(std::shared_ptr<MarioBlock>&, bool)> addObject)
|
||||||
: MarioBlock(x, y, renderer, g_mario_texture, MARIO_STANDING_SRC) {
|
: MarioBlock(x, y, renderer, g_mario_texture, MARIO_STANDING_SRC), _addObject(addObject) {
|
||||||
setAnimationFrames(*walk_anim);
|
setAnimationFrames(*walk_anim);
|
||||||
setId(MARIO_ID);
|
setId(MARIO_ID);
|
||||||
setAlignment(SDLPP::OBJ_CENTER, SDLPP::OBJ_CENTER);
|
setAlignment(SDLPP::OBJ_CENTER, SDLPP::OBJ_CENTER);
|
||||||
@ -32,8 +33,8 @@ Mario::Mario(int x, int y, const std::shared_ptr<SDLPP::Renderer> &renderer)
|
|||||||
setStatic(false);
|
setStatic(false);
|
||||||
bounce_speed *= 4;
|
bounce_speed *= 4;
|
||||||
}
|
}
|
||||||
Mario::Mario(const std::shared_ptr<SDLPP::Renderer> &renderer)
|
Mario::Mario(const std::shared_ptr<SDLPP::Renderer> &renderer, std::function<void(std::shared_ptr<MarioBlock>&, bool)> addObject)
|
||||||
: Mario(0, 0, renderer) {}
|
: Mario(0, 0, renderer, addObject) {}
|
||||||
void Mario::walkLeft() {
|
void Mario::walkLeft() {
|
||||||
if (!controllable) {
|
if (!controllable) {
|
||||||
return;
|
return;
|
||||||
@ -107,9 +108,7 @@ void Mario::handleVisitor(SDLPP::Visitor &visitor) {
|
|||||||
// TODO more readable function names
|
// TODO more readable function names
|
||||||
if (m_visitor.isStopped()) {
|
if (m_visitor.isStopped()) {
|
||||||
setPos(m_visitor.getStopX(), getPos().getY());
|
setPos(m_visitor.getStopX(), getPos().getY());
|
||||||
} else if (m_visitor.canGoLeft() != m_visitor.canGoRight() &&
|
} else if (m_visitor.canGoLeft() != m_visitor.canGoRight()) {
|
||||||
!(on_ground && m_visitor.getMovementBlockage().getY() >
|
|
||||||
getPos().getY() + BLOCK_SIZE / 2)) {
|
|
||||||
// only stop mario on ground if the block obstructs at least half of him
|
// only stop mario on ground if the block obstructs at least half of him
|
||||||
// (important for bug when mario lands from a high jump and is
|
// (important for bug when mario lands from a high jump and is
|
||||||
// teleported if visitor is fired at wrong moment)
|
// teleported if visitor is fired at wrong moment)
|
||||||
@ -169,6 +168,26 @@ void Mario::jump() {
|
|||||||
pauseAnimation();
|
pauseAnimation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef EDITOR
|
||||||
|
void Mario::fire() {
|
||||||
|
if (!hasFire()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto fireball = std::make_shared<Fireball>(0, 0, renderer);
|
||||||
|
fireball->setPos(getPos() + SDLPP::Vec2D<double>((faces_right ? 1 : -1) * BLOCK_SIZE, BLOCK_SIZE));
|
||||||
|
fireball->setMovementDir(!faces_right);
|
||||||
|
auto fireball_m = std::static_pointer_cast<MarioBlock>(fireball);
|
||||||
|
fireball->setHidden(false);
|
||||||
|
_addObject(fireball_m, true);
|
||||||
|
}
|
||||||
|
void Mario::setAddObjFunc(std::function<void(std::shared_ptr<MarioBlock>&, bool)> func) {
|
||||||
|
_addObject = func;
|
||||||
|
}
|
||||||
|
std::function<void(std::shared_ptr<MarioBlock>&, bool)> Mario::getAddObjFunc() {
|
||||||
|
return _addObject;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void Mario::stopJump() {
|
void Mario::stopJump() {
|
||||||
stop_jump = true;
|
stop_jump = true;
|
||||||
}
|
}
|
||||||
|
@ -11,13 +11,18 @@
|
|||||||
|
|
||||||
class Mario : public MarioBlock {
|
class Mario : public MarioBlock {
|
||||||
public:
|
public:
|
||||||
Mario(int x, int y, const std::shared_ptr<SDLPP::Renderer> &renderer);
|
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);
|
Mario(const std::shared_ptr<SDLPP::Renderer> &renderer, std::function<void(std::shared_ptr<MarioBlock>&, bool)> addObject);
|
||||||
void walkLeft();
|
void walkLeft();
|
||||||
void walkRight();
|
void walkRight();
|
||||||
void setStanding();
|
void setStanding();
|
||||||
void handleVisitor(SDLPP::Visitor &visitor) override;
|
void handleVisitor(SDLPP::Visitor &visitor) override;
|
||||||
void jump();
|
void jump();
|
||||||
|
#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 stopJump();
|
||||||
void custom_move(int ticks) override;
|
void custom_move(int ticks) override;
|
||||||
void visit(SDLPP::Visitor &visitor) override;
|
void visit(SDLPP::Visitor &visitor) override;
|
||||||
@ -48,6 +53,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
std::function<void(std::shared_ptr<MarioBlock>&, bool)> _addObject;
|
||||||
void setDeath(bool dead = true) {
|
void setDeath(bool dead = true) {
|
||||||
_death = dead;
|
_death = dead;
|
||||||
}
|
}
|
||||||
|
@ -90,6 +90,9 @@
|
|||||||
#define NPC_RIGHT_SIDE_DETECT 0x200A
|
#define NPC_RIGHT_SIDE_DETECT 0x200A
|
||||||
#define NPC_TOP_DETECT 0x200B
|
#define NPC_TOP_DETECT 0x200B
|
||||||
|
|
||||||
|
// projectiles
|
||||||
|
#define FIREBALL_ID 0x3001
|
||||||
|
|
||||||
// GUI
|
// GUI
|
||||||
#define BUTTON_ID 0xA000
|
#define BUTTON_ID 0xA000
|
||||||
|
|
||||||
|
@ -28,6 +28,12 @@ const std::vector<SDL_Rect> MARIO_WALK_FIRE_ANIM = { { 43, 157, 16, 32 },
|
|||||||
const SDL_Rect MARIO_CHANGE_DIR_FIRE_SRC = { 98, 157, 16, 32 };
|
const SDL_Rect MARIO_CHANGE_DIR_FIRE_SRC = { 98, 157, 16, 32 };
|
||||||
const SDL_Rect MARIO_JUMP_FIRE_SRC = { 119, 157, 16, 32 };
|
const SDL_Rect MARIO_JUMP_FIRE_SRC = { 119, 157, 16, 32 };
|
||||||
|
|
||||||
|
extern const std::vector<SDL_Rect> FIRE_BALL_ANIM = { {96, 144, 8, 8},
|
||||||
|
{104, 144, 8, 8},
|
||||||
|
{96, 152, 8, 8},
|
||||||
|
{104, 152, 8, 8},
|
||||||
|
};
|
||||||
|
|
||||||
const SDL_Rect FLOOR_SRC = { 1, 131, 16, 16 };
|
const SDL_Rect FLOOR_SRC = { 1, 131, 16, 16 };
|
||||||
const SDL_Rect HILL_INCLINE_SRC = { 137, 97, 16, 16 };
|
const SDL_Rect HILL_INCLINE_SRC = { 137, 97, 16, 16 };
|
||||||
const SDL_Rect HILL_DECLINE_SRC = { 205, 97, 16, 16 };
|
const SDL_Rect HILL_DECLINE_SRC = { 205, 97, 16, 16 };
|
||||||
|
@ -32,6 +32,8 @@ extern const SDL_Rect MARIO_DEATH_FIRE_SRC;
|
|||||||
extern const std::vector<SDL_Rect> MARIO_WALK_FIRE_ANIM;
|
extern const std::vector<SDL_Rect> MARIO_WALK_FIRE_ANIM;
|
||||||
extern const SDL_Rect MARIO_CHANGE_DIR_FIRE_SRC;
|
extern const SDL_Rect MARIO_CHANGE_DIR_FIRE_SRC;
|
||||||
extern const SDL_Rect MARIO_JUMP_FIRE_SRC;
|
extern const SDL_Rect MARIO_JUMP_FIRE_SRC;
|
||||||
|
//------------------ FIRE BALL ----------------------
|
||||||
|
extern const std::vector<SDL_Rect> FIRE_BALL_ANIM;
|
||||||
|
|
||||||
//------------------ TERRAIN ------------------------
|
//------------------ TERRAIN ------------------------
|
||||||
extern const SDL_Rect FLOOR_SRC;
|
extern const SDL_Rect FLOOR_SRC;
|
||||||
|
@ -57,6 +57,9 @@ void GoombaVisitor::visit(const SDLPP::RenderObject &obj) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case FIREBALL_ID:
|
||||||
|
instant_death = true;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,9 @@ public:
|
|||||||
bool isDead() const {
|
bool isDead() const {
|
||||||
return death;
|
return death;
|
||||||
}
|
}
|
||||||
|
bool instantDeath() const {
|
||||||
|
return instant_death;
|
||||||
|
}
|
||||||
void setFromId(uint64_t id) override {
|
void setFromId(uint64_t id) override {
|
||||||
from = id;
|
from = id;
|
||||||
}
|
}
|
||||||
@ -54,6 +57,7 @@ private:
|
|||||||
double groundY = 0;
|
double groundY = 0;
|
||||||
uint64_t _type{};
|
uint64_t _type{};
|
||||||
bool death = false;
|
bool death = false;
|
||||||
|
bool instant_death = false;
|
||||||
uint64_t from = -1;
|
uint64_t from = -1;
|
||||||
bool left = false;
|
bool left = false;
|
||||||
bool right = false;
|
bool right = false;
|
||||||
|
54
mario/visitors/projectile_visitor.cpp
Normal file
54
mario/visitors/projectile_visitor.cpp
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#include "projectile_visitor.hpp"
|
||||||
|
#include "../../sdlpp/sdlpp_renderobject.hpp"
|
||||||
|
#include "../objectids.hpp"
|
||||||
|
#include "../sprites.hpp"
|
||||||
|
|
||||||
|
void ProjectileVisitor::visit(const SDLPP::RenderObject &obj) {
|
||||||
|
auto id = obj.getId();
|
||||||
|
switch (id) {
|
||||||
|
case FLOOR_ID:
|
||||||
|
case BRICK_ID:
|
||||||
|
case BRICK_TOP_ID:
|
||||||
|
case PIPE_LEFT_BOTTOM_ID:
|
||||||
|
case PIPE_RIGHT_BOTTOM_ID:
|
||||||
|
case PIPE_LEFT_TOP_ID:
|
||||||
|
case PIPE_RIGHT_TOP_ID:
|
||||||
|
case STEP_ID:
|
||||||
|
case SIDEWAY_PIPE_END_TOP_ID:
|
||||||
|
case SIDEWAY_PIPE_END_BOTTOM_ID:
|
||||||
|
case SIDEWAY_PIPE_MIDDLE_BOTTOM_ID:
|
||||||
|
case SIDEWAY_PIPE_MIDDLE_TOP_ID:
|
||||||
|
case SIDEWAY_PIPE_CONNECTOR_BOTTOM_ID:
|
||||||
|
case SIDEWAY_PIPE_CONNECTOR_TOP_ID:
|
||||||
|
case TREE_PLATFORM_TOP_LEFT_ID:
|
||||||
|
case TREE_PLATFORM_TOP_RIGHT_ID:
|
||||||
|
case MUSHROOM_PLATFORM_TOP_MIDDLE_ID:
|
||||||
|
case MUSHROOM_PLATFORM_TOP_LEFT_ID:
|
||||||
|
case MUSHROOM_PLATFORM_TOP_RIGHT_ID:
|
||||||
|
case CANNON_TOWER_ID:
|
||||||
|
case CANNON_PEDESTAL_ID:
|
||||||
|
case CANNON_ID:
|
||||||
|
if (from == NPC_FLOOR_DETECT) {
|
||||||
|
onGround = true;
|
||||||
|
groundY = obj.getPos().getY();
|
||||||
|
} else if (from == NPC_LEFT_SIDE_DETECT) {
|
||||||
|
if (!left && !right) {
|
||||||
|
movement_blockage = obj.getPos();
|
||||||
|
validXPos = movement_blockage.getX() + BLOCK_SIZE;
|
||||||
|
}
|
||||||
|
left = true;
|
||||||
|
} else if (from == NPC_RIGHT_SIDE_DETECT) {
|
||||||
|
if (!left && !right) {
|
||||||
|
movement_blockage = obj.getPos();
|
||||||
|
validXPos = movement_blockage.getX() - BLOCK_SIZE;
|
||||||
|
}
|
||||||
|
right = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GOOMBA_ID:
|
||||||
|
std::cout << "DEATH" << std::endl;
|
||||||
|
death = true;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
60
mario/visitors/projectile_visitor.hpp
Normal file
60
mario/visitors/projectile_visitor.hpp
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
#ifndef PROJECTILE_VISITOR_H
|
||||||
|
#define PROJECTILE_VISITOR_H
|
||||||
|
|
||||||
|
#include "../../sdlpp/sdlpp_visitor.hpp"
|
||||||
|
#include "../../sdlpp/sdlpp_geometry.hpp"
|
||||||
|
#include "../../sdlpp/sdlpp_scene.hpp"
|
||||||
|
#include "../blocks.hpp"
|
||||||
|
|
||||||
|
class ProjectileVisitor : public SDLPP::Visitor {
|
||||||
|
public:
|
||||||
|
ProjectileVisitor() = default;
|
||||||
|
void visit(const SDLPP::RenderObject &obj) override;
|
||||||
|
bool isOnGround() const {
|
||||||
|
return onGround;
|
||||||
|
}
|
||||||
|
void setFromId(uint64_t id) override {
|
||||||
|
from = id;
|
||||||
|
}
|
||||||
|
uint64_t getFromId() const override {
|
||||||
|
return from;
|
||||||
|
}
|
||||||
|
void setVisitorType(uint64_t type) override {
|
||||||
|
_type = type;
|
||||||
|
}
|
||||||
|
uint64_t getVisitorType() const override {
|
||||||
|
return _type;
|
||||||
|
}
|
||||||
|
bool canGoLeft() const {
|
||||||
|
return !left;
|
||||||
|
}
|
||||||
|
bool canGoRight() const {
|
||||||
|
return !right;
|
||||||
|
}
|
||||||
|
double getGroundY() const {
|
||||||
|
return groundY;
|
||||||
|
}
|
||||||
|
const SDLPP::Vec2D<double> &getMovementBlockage() {
|
||||||
|
return movement_blockage;
|
||||||
|
}
|
||||||
|
bool getDeath() {
|
||||||
|
return death;
|
||||||
|
}
|
||||||
|
double getValidXPos() {
|
||||||
|
return validXPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool onGround = false;
|
||||||
|
double groundY = 0;
|
||||||
|
double validXPos = 0;
|
||||||
|
bool stop = false;
|
||||||
|
bool left = false;
|
||||||
|
bool right = false;
|
||||||
|
SDLPP::Vec2D<double> movement_blockage;
|
||||||
|
uint64_t from{};
|
||||||
|
uint64_t _type{};
|
||||||
|
bool death = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
@ -3,6 +3,7 @@
|
|||||||
#include "mario_visitor.hpp"
|
#include "mario_visitor.hpp"
|
||||||
#include "mushroom_visitor.hpp"
|
#include "mushroom_visitor.hpp"
|
||||||
#include "goomba_visitor.hpp"
|
#include "goomba_visitor.hpp"
|
||||||
|
#include "projectile_visitor.hpp"
|
||||||
#include "../mario.hpp"
|
#include "../mario.hpp"
|
||||||
|
|
||||||
std::shared_ptr<SDLPP::Visitor>
|
std::shared_ptr<SDLPP::Visitor>
|
||||||
@ -28,6 +29,10 @@ getVisitor(const MarioBlock &block, SDLPP::Scene &scene,
|
|||||||
result = std::static_pointer_cast<SDLPP::Visitor>(
|
result = std::static_pointer_cast<SDLPP::Visitor>(
|
||||||
std::make_shared<GoombaVisitor>(block.getPos()));
|
std::make_shared<GoombaVisitor>(block.getPos()));
|
||||||
break;
|
break;
|
||||||
|
case FIREBALL_ID:
|
||||||
|
result = std::static_pointer_cast<SDLPP::Visitor>(
|
||||||
|
std::make_shared<ProjectileVisitor>());
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user