Skip to content
Snippets Groups Projects
Commit 8d1b0eae authored by Nicolas Will's avatar Nicolas Will
Browse files

add event handling for selecting and menuActive

parent 3ab8bbe4
Branches
No related tags found
2 merge requests!29Merge main into box2d to implement physics,!20Level event handler
......@@ -22,8 +22,9 @@ const int RENDERING_SCALE = 3;
Level::Level(
std::string name, int width, int height, std::vector<Tile> tiles,
std::vector<Building> buildings, std::vector<Unit> units, std::vector<Effect> effects)
: m_name(name), m_width(width), m_height(height), m_tiles(tiles), m_contextMenu(ContextMenu()),
m_state(LevelState::SELECTING_STATE), m_id(0)
: m_name(name), m_width(width), m_height(height), m_tiles(tiles), m_selectedUnit(-1),
m_selectedBuilding(-1), m_contextMenu(ContextMenu()), m_id(0),
m_state(LevelState::SELECTING_STATE)
{
m_contextMenu.setOptions({"Move", "Info", "Wait"});
......@@ -95,31 +96,27 @@ Level Level::loadLevel(std::string path)
return Level(name, width, height, tiles, buildings, {}, {});
};
void Level::selectEntity(int x, int y)
std::pair<int, int> Level::calcTilePos(int mouseX, int mouseY)
{
int tileSize = (16 * RENDERING_SCALE);
int tileX = x / tileSize;
int tileY = y / tileSize;
int tileX = mouseX / tileSize;
int tileY = mouseY / tileSize;
if (m_selectedUnit = selectUnit(tileX, tileY))
{
return;
}
if (m_selectedBuilding = selectBuilding(tileX, tileY))
{
return;
}
return {tileX, tileY};
}
bool Level::clickCheckRight(int tileX, int tileY)
void Level::selectEntity(int x, int y)
{
std::pair<int, int> tilePos = calcTilePos(x, y);
if (targetUnit(tileX, tileY))
if (!(m_selectedUnit = selectUnit(tilePos.first, tilePos.second)))
{
return true;
return;
}
if (!(m_selectedBuilding = selectBuilding(tilePos.first, tilePos.second)))
{
return;
}
return false;
}
int Level::selectUnit(int tileX, int tileY)
......@@ -134,25 +131,6 @@ int Level::selectUnit(int tileX, int tileY)
return -1;
}
bool Level::targetUnit(int tileX, int tileY)
{
// std::cout << "tileX:" << tileX << "tileX:" << tileY << std::endl;
for (auto& [id, unit] : m_units)
{
if (unit.m_x == tileX && unit.m_y == tileY)
{
// std::cout << "unitX:" << unit.x << "unitY:" << unit.y << std::endl;
m_targetedUnit = id;
return true;
}
}
return false;
}
int Level::selectBuilding(int tileX, int tileY)
{
for (auto& [id, building] : m_buildings)
......@@ -189,24 +167,19 @@ void Level::handleEvent(Engine& engine, SDL_Event& event)
switch (m_state)
{
case LevelState::MENUACTIVE_STATE:
/*
Escape
Key Down
Key up
Enter
*/
handleMenuActiveEvents(engine, event);
break;
case LevelState::SELECTING_STATE:
/*
Mouse Left
Key up down right left
escape
enter
*/
handleSelectingEvents(engine, event);
break;
case LevelState::ANIMATING_STATE:
// maybe do nothing
break;
case LevelState::MOVEMENT_STATE:
/*
......@@ -415,7 +388,7 @@ void Level::handleSelectingEvents(Engine& engine, SDL_Event& event)
case SDL_KEYDOWN:
if (event.key.keysym.sym == SDLK_ESCAPE)
{
engine.pushScene(std::make_shared<PauseMenu>(0));
engine.pushScene(std::make_shared<PauseMenu>(0, nullptr));
}
break;
case SDL_MOUSEBUTTONDOWN:
......@@ -424,8 +397,49 @@ void Level::handleSelectingEvents(Engine& engine, SDL_Event& event)
selectEntity(event.button.x, event.button.y);
if (m_selectedUnit >= 0 || m_selectedBuilding >= 0)
{
std::pair<int, int> tilePos = calcTilePos(event.button.x, event.button.y);
m_contextMenu.update(
(tilePos.first * 16 + 15) * RENDERING_SCALE,
(tilePos.second * 16 + 15) * RENDERING_SCALE);
m_state = LevelState::MENUACTIVE_STATE;
}
else
{
m_state = LevelState::SELECTING_STATE;
}
}
default:
break;
}
}
void Level::handleMenuActiveEvents(Engine& engine, SDL_Event& event)
{
switch (event.type)
{
case SDL_KEYDOWN:
if (event.key.keysym.sym == SDLK_ESCAPE)
{
m_selectedUnit = -1;
m_selectedBuilding = -1;
m_state = LevelState::SELECTING_STATE;
}
if (event.key.keysym.sym == SDLK_UP || event.key.keysym.sym == SDLK_DOWN)
{
m_contextMenu.handleEvent(engine, event);
}
if (event.key.keysym.sym == SDLK_RETURN)
{
if (m_contextMenu.getSelectedOption() == "Wait")
{
m_state = LevelState::SELECTING_STATE;
}
}
break;
case SDL_MOUSEBUTTONDOWN:
if (event.button.button == SDL_BUTTON_LEFT)
{
}
default:
break;
......
......@@ -71,12 +71,14 @@ class Level : public Scene
int m_id;
LevelState m_state;
std::pair<int, int> calcTilePos(int mouseX, int mouseY);
void selectEntity(int x, int y);
int selectUnit(int tileX, int tileY);
bool targetUnit(int tileX, int tileY);
int selectBuilding(int tileX, int tileY);
void handleSelectingEvents(Engine& engine, SDL_Event& event);
void handleMenuActiveEvents(Engine& engine, SDL_Event& event);
bool clickCheckLeft(int mouseX, int mouseY);
bool clickCheckRight(int mouseX, int mouseY);
......
......@@ -99,7 +99,6 @@ void Menu::render(Engine& engine)
TTF_CloseFont(titleFont);
TTF_CloseFont(menuFont);
SDL_RenderPresent(engine.renderer());
TTF_Quit();
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment