Mario Editor: refactoring
This commit is contained in:
parent
83cda5f860
commit
ede8bbbe8b
103
mario/editor.cpp
103
mario/editor.cpp
@ -30,25 +30,38 @@ struct MouseInfo {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct MapInfo {
|
||||||
|
enum Value {
|
||||||
|
CUR_PAGE = 0,
|
||||||
|
MAX_PAGE = 1,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ToolInfo {
|
||||||
|
enum Value {
|
||||||
|
INDEX = 0,
|
||||||
|
CUR_PAGE = 1,
|
||||||
|
MAX_PAGE = 2,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
std::shared_ptr< SDLPP::Renderer > g_renderer = nullptr;
|
std::shared_ptr< SDLPP::Renderer > g_renderer = nullptr;
|
||||||
bool g_quit = false;
|
bool g_quit = false;
|
||||||
bool g_update_size = false;
|
bool g_update_size = false;
|
||||||
std::vector< mapColumnType > g_objects = {};
|
std::vector< mapColumnType > g_objects = {};
|
||||||
|
std::vector< std::shared_ptr< SDLPP::RenderObject > > g_tools{};
|
||||||
|
std::shared_ptr< SDLPP::RenderObject > g_current_tool = nullptr;
|
||||||
|
|
||||||
std::mutex g_destruction_mutex;
|
std::mutex g_destruction_mutex;
|
||||||
|
|
||||||
// current mouse flags, previous mouse flags, selected edit box, selected tool
|
// current mouse flags, previous mouse flags, selected edit box, selected tool
|
||||||
// box
|
// box
|
||||||
std::tuple< uint64_t, uint64_t, SDLPP::Vec2D< int >, SDLPP::Vec2D< int > >
|
std::tuple< uint64_t, uint64_t, SDLPP::Vec2D< int >, SDLPP::Vec2D< int > >
|
||||||
g_mouse_info;
|
g_mouse_info;
|
||||||
|
// current page, max page
|
||||||
int g_current_start_index = 0;
|
std::tuple< int, int > g_map_info;
|
||||||
int g_current_max_index = 0;
|
// tool index (in possibleBlocks), current pange, max page
|
||||||
uint64_t g_current_block = 0;
|
std::tuple<uint64_t, int, int> g_tool_info;
|
||||||
|
|
||||||
std::vector< std::shared_ptr< SDLPP::RenderObject > > g_tools{};
|
|
||||||
std::shared_ptr< SDLPP::RenderObject > g_current_tool = nullptr;
|
|
||||||
int g_current_tool_index = 0;
|
|
||||||
int g_max_tool_index = 0;
|
|
||||||
|
|
||||||
std::shared_ptr< SDLPP::Texture > g_placeholder_texture = nullptr;
|
std::shared_ptr< SDLPP::Texture > g_placeholder_texture = nullptr;
|
||||||
std::shared_ptr< SDLPP::Texture > g_placeholder_mario = nullptr;
|
std::shared_ptr< SDLPP::Texture > g_placeholder_mario = nullptr;
|
||||||
@ -59,7 +72,7 @@ SDLPP::Vec2D< int > g_mario_pos = { 0, 0 };
|
|||||||
enum LandType::Value g_current_world_type = LandType::OVERWORLD;
|
enum LandType::Value g_current_world_type = LandType::OVERWORLD;
|
||||||
|
|
||||||
void updateTool() {
|
void updateTool() {
|
||||||
auto tool_role = getBlockRole( possibleBlocks[g_current_block] );
|
auto tool_role = getBlockRole( possibleBlocks[std::get<ToolInfo::INDEX>(g_tool_info)] );
|
||||||
std::shared_ptr< SDLPP::Texture > target_texture = nullptr;
|
std::shared_ptr< SDLPP::Texture > target_texture = nullptr;
|
||||||
switch ( tool_role ) {
|
switch ( tool_role ) {
|
||||||
case BlockRole::TERRAIN:
|
case BlockRole::TERRAIN:
|
||||||
@ -74,11 +87,11 @@ void updateTool() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
g_current_tool->setTexture(
|
g_current_tool->setTexture(
|
||||||
target_texture, getSourceRectByID( possibleBlocks[g_current_block],
|
target_texture, getSourceRectByID( possibleBlocks[std::get<ToolInfo::INDEX>(g_tool_info)],
|
||||||
g_current_world_type ) );
|
g_current_world_type ) );
|
||||||
g_current_tool->setId( possibleBlocks[g_current_block] );
|
g_current_tool->setId( possibleBlocks[std::get<ToolInfo::INDEX>(g_tool_info)] );
|
||||||
g_current_tool->getCollisions()[0]->setId(
|
g_current_tool->getCollisions()[0]->setId(
|
||||||
possibleBlocks[g_current_block] );
|
possibleBlocks[std::get<ToolInfo::INDEX>(g_tool_info)] );
|
||||||
}
|
}
|
||||||
|
|
||||||
void removeMario() {
|
void removeMario() {
|
||||||
@ -94,7 +107,7 @@ void removeMario() {
|
|||||||
|
|
||||||
void updateToolSelection( int prev_index ) {
|
void updateToolSelection( int prev_index ) {
|
||||||
size_t prev = prev_index * 8;
|
size_t prev = prev_index * 8;
|
||||||
size_t cur = g_current_tool_index * 8;
|
size_t cur = std::get<ToolInfo::CUR_PAGE>(g_tool_info) * 8;
|
||||||
for ( size_t i = prev;
|
for ( size_t i = prev;
|
||||||
i < ( g_tools.size() < prev + 8 ? g_tools.size() : prev + 8 ); i++ ) {
|
i < ( g_tools.size() < prev + 8 ? g_tools.size() : prev + 8 ); i++ ) {
|
||||||
g_tools[i]->setHidden( true );
|
g_tools[i]->setHidden( true );
|
||||||
@ -106,34 +119,34 @@ void updateToolSelection( int prev_index ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void moveToolsLeft() {
|
void moveToolsLeft() {
|
||||||
g_current_tool_index--;
|
std::get<ToolInfo::CUR_PAGE>(g_tool_info)--;
|
||||||
updateToolSelection( g_current_tool_index + 1 );
|
updateToolSelection( std::get<ToolInfo::CUR_PAGE>(g_tool_info) + 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
void moveToolsRight() {
|
void moveToolsRight() {
|
||||||
g_current_tool_index++;
|
std::get<ToolInfo::CUR_PAGE>(g_tool_info)++;
|
||||||
updateToolSelection( g_current_tool_index - 1 );
|
updateToolSelection( std::get<ToolInfo::CUR_PAGE>(g_tool_info) - 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO add red outline to currently selected tool
|
// TODO add red outline to currently selected tool
|
||||||
// add WSAD navigation for the red highlight
|
// add WSAD navigation for the red highlight
|
||||||
void selectPrevTool() {
|
void selectPrevTool() {
|
||||||
if ( g_current_block == 0 )
|
if ( std::get<ToolInfo::INDEX>(g_tool_info) == 0 )
|
||||||
return;
|
return;
|
||||||
if ( g_current_block % 8 == 0 ) {
|
if ( std::get<ToolInfo::INDEX>(g_tool_info) % 8 == 0 ) {
|
||||||
moveToolsLeft();
|
moveToolsLeft();
|
||||||
}
|
}
|
||||||
g_current_block--;
|
std::get<ToolInfo::INDEX>(g_tool_info)--;
|
||||||
updateTool();
|
updateTool();
|
||||||
}
|
}
|
||||||
|
|
||||||
void selectNextTool() {
|
void selectNextTool() {
|
||||||
if ( g_current_block == g_tools.size() - 1 )
|
if ( std::get<ToolInfo::INDEX>(g_tool_info) == g_tools.size() - 1 )
|
||||||
return;
|
return;
|
||||||
if ( g_current_block % 8 == 7 ) {
|
if ( std::get<ToolInfo::INDEX>(g_tool_info) % 8 == 7 ) {
|
||||||
moveToolsRight();
|
moveToolsRight();
|
||||||
}
|
}
|
||||||
g_current_block++;
|
std::get<ToolInfo::INDEX>(g_tool_info)++;
|
||||||
updateTool();
|
updateTool();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -178,33 +191,33 @@ void getMousePositionFlags( SDLPP::Scene &scene ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void mouseUpAction( uint64_t flags, SDLPP::Scene &scene ) {
|
void mouseUpAction( uint64_t flags, SDLPP::Scene &scene ) {
|
||||||
if ( MouseVisitor::moveMapLeft( flags ) && g_current_start_index != 0 ) {
|
if ( MouseVisitor::moveMapLeft( flags ) && std::get<MapInfo::CUR_PAGE>(g_map_info) != 0 ) {
|
||||||
g_current_start_index -= 1;
|
std::get<MapInfo::CUR_PAGE>(g_map_info)--;
|
||||||
scene.moveEverything( BLOCK_SIZE, 0 );
|
scene.moveEverything( BLOCK_SIZE, 0 );
|
||||||
}
|
}
|
||||||
if ( MouseVisitor::moveMapRight( flags ) ) {
|
if ( MouseVisitor::moveMapRight( flags ) ) {
|
||||||
if ( g_current_start_index == g_current_max_index ) {
|
if ( std::get<MapInfo::CUR_PAGE>(g_map_info) == std::get<MapInfo::MAX_PAGE>(g_map_info) ) {
|
||||||
// add column
|
// add column
|
||||||
// TODO 18 as constant
|
// TODO 18 as constant
|
||||||
g_objects.resize( g_current_max_index + 18 + 1 );
|
g_objects.resize( std::get<MapInfo::MAX_PAGE>(g_map_info) + 18 + 1 );
|
||||||
g_current_max_index++;
|
std::get<MapInfo::MAX_PAGE>(g_map_info)++;
|
||||||
}
|
}
|
||||||
g_current_start_index += 1;
|
std::get<MapInfo::CUR_PAGE>(g_map_info) += 1;
|
||||||
scene.moveEverything( -BLOCK_SIZE, 0 );
|
scene.moveEverything( -BLOCK_SIZE, 0 );
|
||||||
}
|
}
|
||||||
if ( MouseVisitor::moveToolsLeft( flags ) && g_current_tool_index != 0 ) {
|
if ( MouseVisitor::moveToolsLeft( flags ) && std::get<ToolInfo::CUR_PAGE>(g_tool_info) != 0 ) {
|
||||||
g_current_tool_index -= 1;
|
std::get<ToolInfo::CUR_PAGE>(g_tool_info) -= 1;
|
||||||
updateToolSelection( g_current_tool_index + 1 );
|
updateToolSelection( std::get<ToolInfo::CUR_PAGE>(g_tool_info) + 1 );
|
||||||
}
|
}
|
||||||
if ( MouseVisitor::moveToolsRight( flags ) &&
|
if ( MouseVisitor::moveToolsRight( flags ) &&
|
||||||
g_current_tool_index != g_max_tool_index ) {
|
std::get<ToolInfo::CUR_PAGE>(g_tool_info) != std::get<ToolInfo::MAX_PAGE>(g_tool_info) ) {
|
||||||
g_current_tool_index += 1;
|
std::get<ToolInfo::CUR_PAGE>(g_tool_info) += 1;
|
||||||
updateToolSelection( g_current_tool_index - 1 );
|
updateToolSelection( std::get<ToolInfo::CUR_PAGE>(g_tool_info) - 1 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SDLPP::Vec2D< int > getSelectedObjectPosition() {
|
SDLPP::Vec2D< int > getSelectedObjectPosition() {
|
||||||
return { g_current_start_index +
|
return { std::get<MapInfo::CUR_PAGE>(g_map_info) +
|
||||||
std::get< MouseInfo::EDIT_BOX >( g_mouse_info ).getX(),
|
std::get< MouseInfo::EDIT_BOX >( g_mouse_info ).getX(),
|
||||||
std::get< MouseInfo::EDIT_BOX >( g_mouse_info ).getY() };
|
std::get< MouseInfo::EDIT_BOX >( g_mouse_info ).getY() };
|
||||||
}
|
}
|
||||||
@ -320,7 +333,7 @@ void pollEvents( SDLPP::Scene &scene ) {
|
|||||||
std::get< MouseInfo::TOOL_BOX >( g_mouse_info );
|
std::get< MouseInfo::TOOL_BOX >( g_mouse_info );
|
||||||
size_t index = tool_box.getY() * 4 + tool_box.getX();
|
size_t index = tool_box.getY() * 4 + tool_box.getX();
|
||||||
if ( index < g_tools.size() ) {
|
if ( index < g_tools.size() ) {
|
||||||
g_current_block = g_current_tool_index * 8 + index;
|
std::get<ToolInfo::INDEX>(g_tool_info) = std::get<ToolInfo::CUR_PAGE>(g_tool_info) * 8 + index;
|
||||||
updateTool();
|
updateTool();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -446,10 +459,10 @@ int main() {
|
|||||||
mouse->setColiderColor( "#00FF00" );
|
mouse->setColiderColor( "#00FF00" );
|
||||||
mouse->addCollision( SDLPP::RectColider( { 0, 0 }, { 1, 1 } ) );
|
mouse->addCollision( SDLPP::RectColider( { 0, 0 }, { 1, 1 } ) );
|
||||||
scene->addObject( mouse );
|
scene->addObject( mouse );
|
||||||
g_current_max_index = g_objects.size() - 18;
|
std::get<MapInfo::MAX_PAGE>(g_map_info) = g_objects.size() - 18;
|
||||||
|
|
||||||
// tools
|
// tools
|
||||||
g_max_tool_index = ( possibleBlocks.size() - 1 ) / 8;
|
std::get<ToolInfo::MAX_PAGE>(g_tool_info) = ( possibleBlocks.size() - 1 ) / 8;
|
||||||
for ( int i = 0; i < 4; i++ ) {
|
for ( int i = 0; i < 4; i++ ) {
|
||||||
auto tool_box1 = std::make_shared< ToolBox >( i, 0, g_renderer );
|
auto tool_box1 = std::make_shared< ToolBox >( i, 0, g_renderer );
|
||||||
auto tool_box2 = std::make_shared< ToolBox >( i, 1, g_renderer );
|
auto tool_box2 = std::make_shared< ToolBox >( i, 1, g_renderer );
|
||||||
@ -539,7 +552,7 @@ int main() {
|
|||||||
g_placeholder_mario = std::make_shared< SDLPP::Texture >(
|
g_placeholder_mario = std::make_shared< SDLPP::Texture >(
|
||||||
g_renderer, "sprites/mario.png", MARIO_OVERWORLD_COLORKEY );
|
g_renderer, "sprites/mario.png", MARIO_OVERWORLD_COLORKEY );
|
||||||
g_placeholder_mario->setAlpha( 100 );
|
g_placeholder_mario->setAlpha( 100 );
|
||||||
g_current_tool = createTerrainBlock( possibleBlocks[g_current_block],
|
g_current_tool = createTerrainBlock( possibleBlocks[std::get<ToolInfo::INDEX>(g_tool_info)],
|
||||||
LandType::OVERWORLD, g_renderer,
|
LandType::OVERWORLD, g_renderer,
|
||||||
g_placeholder_texture, false );
|
g_placeholder_texture, false );
|
||||||
g_current_tool->addCollision( SDLPP::RectColider( 0.1, 0.1, 0.8, 0.8 ) );
|
g_current_tool->addCollision( SDLPP::RectColider( 0.1, 0.1, 0.8, 0.8 ) );
|
||||||
@ -570,24 +583,24 @@ int main() {
|
|||||||
frames = 0;
|
frames = 0;
|
||||||
base = SDL_GetTicks();
|
base = SDL_GetTicks();
|
||||||
}
|
}
|
||||||
if ( g_current_start_index == 0 ) {
|
if ( std::get<MapInfo::CUR_PAGE>(g_map_info) == 0 ) {
|
||||||
left->setTextColor( font, "#CCCCCC", "#CCCCCC", 0.05 );
|
left->setTextColor( font, "#CCCCCC", "#CCCCCC", 0.05 );
|
||||||
} else {
|
} else {
|
||||||
left->setTextColor( font, "#000000", "#282828", 0.05 );
|
left->setTextColor( font, "#000000", "#282828", 0.05 );
|
||||||
}
|
}
|
||||||
if ( g_current_start_index == g_current_max_index ) {
|
if ( std::get<MapInfo::CUR_PAGE>(g_map_info) == std::get<MapInfo::MAX_PAGE>(g_map_info) ) {
|
||||||
right->setTextColor( font, "#00FF00", "#000000", 0.1 );
|
right->setTextColor( font, "#00FF00", "#000000", 0.1 );
|
||||||
right->changeText( "+" );
|
right->changeText( "+" );
|
||||||
} else {
|
} else {
|
||||||
right->setTextColor( font, "#000000", "#282828", 0.05 );
|
right->setTextColor( font, "#000000", "#282828", 0.05 );
|
||||||
right->changeText( ">" );
|
right->changeText( ">" );
|
||||||
}
|
}
|
||||||
if ( g_current_tool_index == 0 ) {
|
if ( std::get<ToolInfo::CUR_PAGE>(g_tool_info) == 0 ) {
|
||||||
left_tool->setTextColor( font, "#CCCCCC", "#CCCCCC", 0.05 );
|
left_tool->setTextColor( font, "#CCCCCC", "#CCCCCC", 0.05 );
|
||||||
} else {
|
} else {
|
||||||
left_tool->setTextColor( font, "#000000", "#282828", 0.05 );
|
left_tool->setTextColor( font, "#000000", "#282828", 0.05 );
|
||||||
}
|
}
|
||||||
if ( g_current_tool_index == g_max_tool_index ) {
|
if ( std::get<ToolInfo::CUR_PAGE>(g_tool_info) == std::get<ToolInfo::MAX_PAGE>(g_tool_info) ) {
|
||||||
right_tool->setTextColor( font, "#CCCCCC", "#CCCCCC", 0.05 );
|
right_tool->setTextColor( font, "#CCCCCC", "#CCCCCC", 0.05 );
|
||||||
} else {
|
} else {
|
||||||
right_tool->setTextColor( font, "#000000", "#282828", 0.05 );
|
right_tool->setTextColor( font, "#000000", "#282828", 0.05 );
|
||||||
|
Loading…
Reference in New Issue
Block a user