diff --git a/CMakeLists.txt b/CMakeLists.txt index 0baede4..6752c8c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,8 @@ cmake_minimum_required(VERSION 2.8) project(space-logic-adventure) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -Wextra") + FILE(GLOB SOURCES "*.cpp") add_executable(${PROJECT_NAME} ${SOURCES}) diff --git a/endscreen.cpp b/endscreen.cpp index 160f240..7ed9c70 100644 --- a/endscreen.cpp +++ b/endscreen.cpp @@ -14,8 +14,12 @@ void EndScreen::processEvent(const sf::Event &event) { case sf::Keyboard::Space: eventReceiver({Event::SHOW_CLEAN_MENU}); break; + default: + break; } break; + default: + break; } } diff --git a/level.cpp b/level.cpp index bf701cd..903042d 100644 --- a/level.cpp +++ b/level.cpp @@ -43,6 +43,8 @@ void Level::processEvent(const sf::Event &event) { case sf::Keyboard::Space: changeGameState(COUNTING); break; + default: + break; } break; case PLAYING: @@ -63,10 +65,16 @@ void Level::processEvent(const sf::Event &event) { case sf::Keyboard::S: movePlayer(BACK); break; + default: + break; } break; + default: + break; } break; + default: + break; } } @@ -110,6 +118,8 @@ bool Level::movePlayer(PlayerMove move) { } newPos.x = hero.getPos().x - 1; break; + default: + break; } break; case BACK: @@ -138,6 +148,8 @@ bool Level::movePlayer(PlayerMove move) { } newPos.x = hero.getPos().x + 1; break; + default: + break; } break; case ROTATE_CLOCKWISE: @@ -171,6 +183,9 @@ void Level::update() { switch (gameState) { + case SHOWING_INFO: + break; + case COUNTING: if (countingClock.getElapsedTime().asSeconds() >= countingLength) { changeGameState(PLAYING); @@ -208,6 +223,7 @@ void Level::update() { case AFTER_LOST: eventReceiver({ Event::GAME_OVER }); break; + } @@ -229,14 +245,17 @@ void Level::loadMapFromFile(std::string fileName) { void Level::closeMapBorders() { for (auto& [coords, field] : map) { auto& [row, column] = coords; + switch (field.tileAppearance) { - case FIELD_VERTICAL: + + case FIELD_VERTICAL: if (map.count(std::make_pair(row - 1, column)) == 0) { field.tileAppearance = FIELD_VERTICAL_OPENED_BOTTOM; } else if (map.count(std::make_pair(row + 1, column)) == 0) { field.tileAppearance = FIELD_VERTICAL_OPENED_TOP; } break; + case FIELD_HORIZONTAL: if (map.count(std::make_pair(row, column - 1)) == 0) { field.tileAppearance = FIELD_HORIZONTAL_OPENED_RIGHT; @@ -244,6 +263,10 @@ void Level::closeMapBorders() { field.tileAppearance = FIELD_HORIZONTAL_OPENED_LEFT; } break; + + default: + break; + } } } @@ -348,30 +371,41 @@ void Level::setFieldFunction(int row, int column, FieldFunction function) { } } -sf::Vector2f cartesianToIsometric(sf::Vector2f cartesian, Level::TileAppearance tileAppearance) { +sf::Vector2f cartesianToIsometric(sf::Vector2i cartesian, Level::TileAppearance tileAppearance) { sf::Vector2f mod(0, 0); + switch(tileAppearance) { // TODO this should probably be outside of the class + case Level::FIELD_DOWN_RIGHT_TURN: mod = {0, 2}; break; + case Level::FIELD_UP_RIGHT_TURN: mod = {4, 0}; break; + case Level::FIELD_HORIZONTAL_OPENED_RIGHT: mod = {4, 2}; break; + case Level::FIELD_VERTICAL_OPENED_TOP: mod = {4, 0}; break; + case Level::FIELD_VERTICAL_OPENED_BOTTOM: mod = {0, 2}; break; + case Level::PLAYER_FACED_TOP: case Level::PLAYER_FACED_BOTTOM: case Level::PLAYER_FACED_LEFT: case Level::PLAYER_FACED_RIGHT: mod = {20, -8}; break; + + default: + break; + } sf::Vector2f iso((cartesian.x - cartesian.y) * 38, (cartesian.x + cartesian.y) / 1.43f * 38); @@ -379,7 +413,7 @@ sf::Vector2f cartesianToIsometric(sf::Vector2f cartesian, Level::TileAppearance return iso + mod; } -void Level::addFieldToVertexArray(Field &field, sf::Vector2f pos) { +void Level::addFieldToVertexArray(Field &field, sf::Vector2i pos) { pos.x += 8; // TODO normalize coordinate system pos.y -= 2; auto leftTopPos = cartesianToIsometric(pos, field.tileAppearance); @@ -429,20 +463,29 @@ void Level::draw(sf::RenderTarget &target, sf::RenderStates states) const sf::VertexArray playerVertices; playerVertices.setPrimitiveType(sf::Quads); - TileAppearance playerTileAppearance; + TileAppearance playerTileAppearance = PLAYER_FACED_TOP; + switch(hero.face) { + case Hero::TOP: playerTileAppearance = PLAYER_FACED_TOP; break; + case Hero::BOTTOM: playerTileAppearance = PLAYER_FACED_BOTTOM; break; + case Hero::LEFT: playerTileAppearance = PLAYER_FACED_LEFT; break; + case Hero::RIGHT: playerTileAppearance = PLAYER_FACED_RIGHT; break; + + default: + break; + } const SpriteInfo &playerSpriteInfo = tilesSpriteInfo.at(playerTileAppearance); @@ -459,23 +502,36 @@ void Level::draw(sf::RenderTarget &target, sf::RenderStates states) const target.draw(playerVertices, states); switch (gameState) { + case SHOWING_INFO: drawCenteredText(target, states, "LEVEL CODE: " + code, 40, 1, 10); drawCenteredText(target, states, "PRESS ENTER/SPACEBAR TO START", 50, 1, target.getSize().y - 150); drawCenteredText(target, states, message, 40, 1, target.getSize().y - 100); break; + case COUNTING: { int secondsLeft = std::ceil(countingLength - countingClock.getElapsedTime().asSeconds()); drawCenteredText(target, states, std::to_string(secondsLeft), 80, 3, target.getSize().y / 2 - 80); break; } + + case PLAYING: + break; + case WON: drawCenteredText(target, states, "LEVEL FINISHED", 80, 3, target.getSize().y / 2 - 80); break; + case LOST: drawCenteredText(target, states, "YOU LOST", 80, 3, target.getSize().y / 2 - 80); break; + + case AFTER_WON: + break; + + case AFTER_LOST: + break; } } @@ -483,17 +539,31 @@ void Level::changeGameState(GameState newState) { gameState = newState; switch (newState) { + + case SHOWING_INFO: + break; + case COUNTING: countingClock.restart(); break; + case PLAYING: stepOnField(hero.getPos().y, hero.getPos().x); break; + case WON: wonClock.restart(); break; + case LOST: lostClock.restart(); break; + + case AFTER_WON: + break; + + case AFTER_LOST: + break; + } } diff --git a/level.hpp b/level.hpp index 7c5e369..5bf83d9 100644 --- a/level.hpp +++ b/level.hpp @@ -57,11 +57,11 @@ class Level : public Screen { struct Field { TileAppearance tileAppearance; FieldFunction fieldFunction = NORMAL; - size_t firstVertexIndex; // should be 4 of them + size_t firstVertexIndex = 0; // should be 4 of them bool stepped = false; bool active = true; - sf::Clock sinceStepped; + sf::Clock sinceStepped = {}; }; enum PlayerMove { @@ -90,7 +90,7 @@ class Level : public Screen { void addNewField(int row, int column, Field field); Field& getField(int row, int column); void setFieldFunction(int row, int column, FieldFunction function); - void addFieldToVertexArray(Field &field, sf::Vector2f pos); + void addFieldToVertexArray(Field &field, sf::Vector2i pos); void modifyFieldVertices(Field &field, std::function modifyVertex); void stepOnField(int row, int column); void changeGameState(GameState newState); @@ -99,8 +99,6 @@ class Level : public Screen { private: - Hero hero; - enum Direction { // TODO duplicate with Player::Face? TOP = 1, RIGHT = 2, @@ -133,9 +131,10 @@ class Level : public Screen { float fieldLifetimeSeconds; std::string code; std::string message; - LevelMap_t map; sf::Texture &tileset; TileAppearanceToSpriteInfoMap_t tilesSpriteInfo; + Hero hero; sf::VertexArray vertices; sf::Sprite &background_sp; + LevelMap_t map; }; diff --git a/main.cpp b/main.cpp index a9a0a00..cb1c786 100644 --- a/main.cpp +++ b/main.cpp @@ -100,10 +100,10 @@ int main() { switch (event.type) { case Event::MENU_START_NEW_GAME: currentLevelIndex = -1; - // no break here + // fallthrough case Event::LEVEL_FINISHED: currentLevelIndex += 1; - // no break here + // fallthrough case Event::MENU_TRY_AGAIN: if (currentLevelIndex < levelsData.size()) { const LevelData &levelData = levelsData[currentLevelIndex]; diff --git a/menuscreen.cpp b/menuscreen.cpp index 92c03ae..6f90f21 100644 --- a/menuscreen.cpp +++ b/menuscreen.cpp @@ -71,6 +71,8 @@ void MenuScreen::processEvent(const sf::Event &event) { eventReceiver({Event::MENU_QUIT}); break; } + default: + break; } break; case sf::Event::TextEntered: @@ -81,6 +83,8 @@ void MenuScreen::processEvent(const sf::Event &event) { levelCodeInput += static_cast(event.text.unicode - ('a' - 'A')); } break; + default: + break; } } diff --git a/screen.hpp b/screen.hpp index fa4a708..34cc248 100644 --- a/screen.hpp +++ b/screen.hpp @@ -24,10 +24,10 @@ class Screen : public sf::Drawable { public: Screen(const sf::Color &fillColor, const sf::Color &outlineColor, const sf::Font &font) - : fillColor(fillColor), + : eventReceiver([](Event){}), + fillColor(fillColor), outlineColor(outlineColor), - font(font), - eventReceiver([](Event){}) + font(font) { } void setEventReceiver(std::function receiver) {