Compare commits

...

2 Commits

Author SHA1 Message Date
f0182cf4d4 Mario: add turtle enemy 2023-03-10 16:45:26 +01:00
fd96a1c2cc SDLPP: don't colide with self 2023-03-10 16:45:10 +01:00
11 changed files with 38 additions and 1 deletions

View File

@ -73,12 +73,14 @@ target_sources(mario
PRIVATE visitors/mario_visitor.cpp PRIVATE visitors/mario_visitor.cpp
PRIVATE visitors/mushroom_visitor.cpp PRIVATE visitors/mushroom_visitor.cpp
PRIVATE visitors/goomba_visitor.cpp PRIVATE visitors/goomba_visitor.cpp
PRIVATE visitors/turtle_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 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/turtleblock.cpp
PRIVATE blocks/fireball.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
@ -91,6 +93,7 @@ target_sources(editor
PRIVATE ${CommonFiles} PRIVATE ${CommonFiles}
PRIVATE blocks/coineditorblock.cpp PRIVATE blocks/coineditorblock.cpp
PRIVATE blocks/goombablock.cpp PRIVATE blocks/goombablock.cpp
PRIVATE blocks/turtleblock.cpp
PRIVATE editor.cpp PRIVATE editor.cpp
PRIVATE edit_box.cpp PRIVATE edit_box.cpp
PRIVATE tool_box.cpp PRIVATE tool_box.cpp

View File

@ -13,6 +13,7 @@
#include "blocks/coinblock.hpp" #include "blocks/coinblock.hpp"
#include "blocks/mushroomblock.hpp" #include "blocks/mushroomblock.hpp"
#include "blocks/goombablock.hpp" #include "blocks/goombablock.hpp"
#include "blocks/turtleblock.hpp"
#include "mario.hpp" #include "mario.hpp"
#define CAN_BE_DESTROYED_FLAG 0x0000000000000001 #define CAN_BE_DESTROYED_FLAG 0x0000000000000001
@ -322,6 +323,7 @@ const std::vector<uint64_t> possibleMods = {
const std::vector<uint64_t> possibleCharacters = { const std::vector<uint64_t> possibleCharacters = {
MARIO_ID, MARIO_ID,
GOOMBA_ID, GOOMBA_ID,
TURTLE_ID,
}; };
const std::vector<LandType::Value> possibleLands = { const std::vector<LandType::Value> possibleLands = {
@ -573,6 +575,10 @@ createBlockById(uint64_t id, int x, int y,
result = std::static_pointer_cast<MarioBlock>( result = std::static_pointer_cast<MarioBlock>(
std::make_shared<GoombaBlock>(x, y, renderer)); std::make_shared<GoombaBlock>(x, y, renderer));
break; break;
case TURTLE_ID:
result = std::static_pointer_cast<MarioBlock>(
std::make_shared<TurtleBlock>(x, y, renderer));
break;
#ifdef EDITOR #ifdef EDITOR
case DESTRUCTIBLE_MODIFIER_ID: case DESTRUCTIBLE_MODIFIER_ID:
result = std::static_pointer_cast<MarioBlock>( result = std::static_pointer_cast<MarioBlock>(

View File

@ -371,6 +371,7 @@ SceneStruct mainGameScene(const std::string &level_path) {
moving_objects.push_back(mario); moving_objects.push_back(mario);
std::unordered_set<int> moving_object_ids = { std::unordered_set<int> moving_object_ids = {
GOOMBA_ID, GOOMBA_ID,
TURTLE_ID,
}; };
for (auto &obj : scene->getObjects(moving_object_ids)) { for (auto &obj : scene->getObjects(moving_object_ids)) {
moving_objects.push_back(std::dynamic_pointer_cast<MarioBlock>(obj)); moving_objects.push_back(std::dynamic_pointer_cast<MarioBlock>(obj));

View File

@ -74,6 +74,7 @@
// character IDs // character IDs
#define MARIO_ID 0x0F #define MARIO_ID 0x0F
#define GOOMBA_ID 0x0E #define GOOMBA_ID 0x0E
#define TURTLE_ID 0x0D
#define DEATH_ID 0x1001 #define DEATH_ID 0x1001
#define STOP_MOVEMENT 0x2000 #define STOP_MOVEMENT 0x2000

View File

@ -111,3 +111,8 @@ const SDLPP::Vec2D<uint64_t> BOWSER_SHIFT = { 0, 173 };
const std::vector<SDL_Rect> GOOMBA_WALK_ANIM = { { 1, 28, 16, 16 }, const std::vector<SDL_Rect> GOOMBA_WALK_ANIM = { { 1, 28, 16, 16 },
{ 18, 28, 16, 16 } }; { 18, 28, 16, 16 } };
const SDL_Rect GOOMBA_DEATH_SRC = { 39, 28, 16, 16 }; const SDL_Rect GOOMBA_DEATH_SRC = { 39, 28, 16, 16 };
const std::vector<SDL_Rect> TURTLE_WALK_ANIM = { { 60, 12, 16, 32 },
{ 77, 12, 16, 32 } };
const std::vector<SDL_Rect> TURTLE_SHELL_ANIM = { { 136, 28, 16, 16},
{ 136, 28, 16, 16},
{ 153, 28, 16, 16} };

View File

@ -107,6 +107,8 @@ extern const SDL_Rect MOD_TELEPORT_SRC;
//------------------ ENEMIES ------------------------- //------------------ ENEMIES -------------------------
extern const SDL_Rect GOOMBA_DEATH_SRC; extern const SDL_Rect GOOMBA_DEATH_SRC;
extern const std::vector<SDL_Rect> GOOMBA_WALK_ANIM; extern const std::vector<SDL_Rect> GOOMBA_WALK_ANIM;
extern const std::vector<SDL_Rect> TURTLE_WALK_ANIM;
extern const std::vector<SDL_Rect> TURTLE_SHELL_ANIM;
extern const SDLPP::Vec2D<uint64_t> OVERWORLD_SHIFT; extern const SDLPP::Vec2D<uint64_t> OVERWORLD_SHIFT;
extern const SDLPP::Vec2D<uint64_t> UNDERWORLD_SHIFT; extern const SDLPP::Vec2D<uint64_t> UNDERWORLD_SHIFT;

View File

@ -3,6 +3,7 @@
#include "../objectids.hpp" #include "../objectids.hpp"
#include "../sprites.hpp" #include "../sprites.hpp"
#include "../mario.hpp" #include "../mario.hpp"
#include "../blocks/turtleblock.hpp"
void GoombaVisitor::visit(const SDLPP::RenderObject &obj) { void GoombaVisitor::visit(const SDLPP::RenderObject &obj) {
auto id = obj.getId(); auto id = obj.getId();
@ -47,7 +48,15 @@ void GoombaVisitor::visit(const SDLPP::RenderObject &obj) {
} }
break; break;
case DEATH_ID: case DEATH_ID:
death = true; instant_death = true;
break;
case TURTLE_ID:
{
auto &turtle = dynamic_cast<const TurtleBlock &>(obj);
if(turtle.isShell() && turtle.getMovement().getX() != 0) {
death = true;
}
}
break; break;
case MARIO_ID: case MARIO_ID:
{ {

View File

@ -62,6 +62,7 @@ void MarioVisitor::visit(const SDLPP::RenderObject &obj) {
_instant_death = true; _instant_death = true;
break; break;
case GOOMBA_ID: case GOOMBA_ID:
case TURTLE_ID:
if (from != MARIO_FLOOR_DETECT && from != MARIO_ENEMY_DETECT) { if (from != MARIO_FLOOR_DETECT && from != MARIO_ENEMY_DETECT) {
_death = true; _death = true;
} else if (from == MARIO_FLOOR_DETECT || from == MARIO_ENEMY_DETECT) { } else if (from == MARIO_FLOOR_DETECT || from == MARIO_ENEMY_DETECT) {

View File

@ -46,6 +46,7 @@ void ProjectileVisitor::visit(const SDLPP::RenderObject &obj) {
} }
break; break;
case GOOMBA_ID: case GOOMBA_ID:
case TURTLE_ID:
death = true; death = true;
default: default:
break; break;

View File

@ -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 "turtle_visitor.hpp"
#include "projectile_visitor.hpp" #include "projectile_visitor.hpp"
#include "../mario.hpp" #include "../mario.hpp"
@ -29,6 +30,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 TURTLE_ID:
result = std::static_pointer_cast<SDLPP::Visitor>(
std::make_shared<TurtleVisitor>(block.getPos()));
break;
case FIREBALL_ID: case FIREBALL_ID:
result = std::static_pointer_cast<SDLPP::Visitor>( result = std::static_pointer_cast<SDLPP::Visitor>(
std::make_shared<ProjectileVisitor>()); std::make_shared<ProjectileVisitor>());

View File

@ -119,6 +119,9 @@ Scene::getCollisions( RenderObject &r ) {
return {}; return {};
std::vector< std::pair< uint64_t, std::shared_ptr< RenderObject > > > ret{}; std::vector< std::pair< uint64_t, std::shared_ptr< RenderObject > > > ret{};
for ( const auto &x : collision_objects ) { for ( const auto &x : collision_objects ) {
if(x.get() == &r) {
continue;
}
for ( auto id : r.colidesWith( *x ) ) { for ( auto id : r.colidesWith( *x ) ) {
ret.emplace_back( id, x ); ret.emplace_back( id, x );
} }