diff --git a/HopsonArcade.vcxproj b/HopsonArcade.vcxproj index 7d69b00..a1dfbe8 100644 --- a/HopsonArcade.vcxproj +++ b/HopsonArcade.vcxproj @@ -138,8 +138,9 @@ + - + @@ -168,7 +169,8 @@ - + + diff --git a/Source/Arcade/Game.cpp b/Source/Arcade/Game.cpp index c50ac60..faeb2d8 100644 --- a/Source/Arcade/Game.cpp +++ b/Source/Arcade/Game.cpp @@ -1,16 +1,16 @@ #include "Game.h" -#include "../SpaceInvaders/States/StateMainMenu.h" +#include "GameSelection/StateGameSelect.h" #include "../SpaceInvaders/DisplayInfo.h" #include Game::Game() -: m_window ({ 1600, 900}, "Hopson Arcade") +: m_window ({ 1280, 720}, "Hopson Arcade") { m_window.setPosition({m_window.getPosition().x, 0}); m_window.setFramerateLimit(60); - pushState(*this); + pushState(*this); sf::Image icon; icon.loadFromFile("res/txrs/icon.png"); diff --git a/Source/Arcade/GameSelection/GameSelect.cpp b/Source/Arcade/GameSelection/GameSelect.cpp new file mode 100644 index 0000000..4841ff0 --- /dev/null +++ b/Source/Arcade/GameSelection/GameSelect.cpp @@ -0,0 +1,44 @@ +#include "GameSelect.h" + +#include "../../Framework/ResourceManager/ResourceHolder.h" + +GameSelect::GameSelect(const std::string& name) +{ + m_container.setSize({ WIDTH, HEIGHT }); + m_thumbnail.setSize({ 256, 256 }); + + m_container.setOutlineThickness(2); + m_container.setOutlineColor({ 100, 100, 100 }); + m_container.setFillColor({ 200, 200, 200 }); + + m_thumbnail.setOutlineThickness(1); + m_thumbnail.setOutlineColor({ 100, 100, 100 }); + m_thumbnail.setTexture(&ResourceHolder::get().textures.get("thumbnails/" + name)); +} + +bool GameSelect::isClicked(const sf::Vector2i& mousePositon) +{ + return m_container + .getGlobalBounds() + .contains((float)mousePositon.x, (float)mousePositon.y); +} + +void GameSelect::setPosition(const sf::Vector2f position) +{ + m_container.setPosition(position); + m_thumbnail.setPosition(position); +} + +void GameSelect::draw(sf::RenderTarget & renderer) +{ + renderer.draw(m_container); + renderer.draw(m_thumbnail); +} + +SpaceInvadersSelect::SpaceInvadersSelect(const std::string & name) +: GameSelect(name) { } + +std::unique_ptr SpaceInvadersSelect::getInitState() +{ + return std::unique_ptr(); +} diff --git a/Source/Arcade/GameSelection/GameSelect.h b/Source/Arcade/GameSelection/GameSelect.h new file mode 100644 index 0000000..ac0f9a2 --- /dev/null +++ b/Source/Arcade/GameSelection/GameSelect.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include + +#include "../../Framework/States/StateBase.h" + +class GameSelect +{ + public: + constexpr static float WIDTH = 512; + constexpr static float HEIGHT = 256; + + GameSelect(const std::string& name); + bool isClicked(const sf::Vector2i& mousePositon); + + void setPosition(const sf::Vector2f position); + void draw(sf::RenderTarget& renderer); + + virtual std::unique_ptr getInitState() = 0; + + private: + sf::RectangleShape m_container; + sf::RectangleShape m_thumbnail; +}; + +struct SpaceInvadersSelect : public GameSelect +{ + SpaceInvadersSelect(const std::string& name); + std::unique_ptr getInitState() override; +}; \ No newline at end of file diff --git a/Source/Arcade/GameSelection/StateGameSelect.cpp b/Source/Arcade/GameSelection/StateGameSelect.cpp new file mode 100644 index 0000000..11c5cb4 --- /dev/null +++ b/Source/Arcade/GameSelection/StateGameSelect.cpp @@ -0,0 +1,39 @@ +#include "StateGameSelect.h" + +#include "../Game.h" + +StateGameSelect::StateGameSelect(Game& game) + : StateBase(game, "Game Select", 1280, 720) +{ + registerGame(std::make_unique("SpaceInvaders")); + registerGame(std::make_unique("SpaceInvaders")); + registerGame(std::make_unique("SpaceInvaders")); + registerGame(std::make_unique("SpaceInvaders")); + registerGame(std::make_unique("SpaceInvaders")); +} + +void StateGameSelect::onOpen() +{ + m_pGame->resizeWindow(1280, 720); +} + + +void StateGameSelect::handleEvent(sf::Event e) +{ +} + +void StateGameSelect::render(sf::RenderTarget& target) +{ + for (auto& g : m_gameSelects) { + g->draw(target); + } +} + +void StateGameSelect::registerGame(std::unique_ptr gameSelect) +{ + float x = 123.0f + (m_gameSelects.size() % 2 == 0 ? 0 : GameSelect::WIDTH); + float y = int(m_gameSelects.size() / 2) * (GameSelect::HEIGHT); + + gameSelect->setPosition({ x, y }); + m_gameSelects.push_back(std::move(gameSelect)); +} diff --git a/Source/Arcade/GameSelection/StateGameSelect.h b/Source/Arcade/GameSelection/StateGameSelect.h new file mode 100644 index 0000000..5ac45fc --- /dev/null +++ b/Source/Arcade/GameSelection/StateGameSelect.h @@ -0,0 +1,23 @@ +#pragma once + +#include + +#include "GameSelect.h" + +class Game; + +class StateGameSelect : public StateBase +{ + public: + StateGameSelect(Game& game); + + void onOpen() override; + + void handleEvent(sf::Event e) override; + void render(sf::RenderTarget& target) override; + + private: + void registerGame(std::unique_ptr gameSelect); + + std::vector> m_gameSelects; +}; \ No newline at end of file diff --git a/Source/Arcade/StateGameSelect.cpp b/Source/Arcade/StateGameSelect.cpp deleted file mode 100644 index 68f5f23..0000000 --- a/Source/Arcade/StateGameSelect.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "StateGameSelect.h" - -#include "Game.h" - -StateGameSelect::StateGameSelect(Game& game) - : StateBase(game, "Game Select", 1280, 720) -{ -} - -void StateGameSelect::onOpen() -{ - m_pGame->resizeWindow(1280, 720); -} - - -void StateGameSelect::handleEvent(sf::Event e) -{ -} - -void StateGameSelect::render(sf::RenderTarget & target) -{ -} diff --git a/Source/Arcade/StateGameSelect.h b/Source/Arcade/StateGameSelect.h deleted file mode 100644 index 44a7533..0000000 --- a/Source/Arcade/StateGameSelect.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include "../Framework/States/StateBase.h" - -#include - -class Game; - -class StateGameSelect : public StateBase -{ - class GameSelect - { - public: - GameSelect(const std::string& name, const sf::Texture& thumbnail) - { } - - virtual std::unique_ptr getInitState() = 0; - - private: - sf::RectangleShape m_container; - sf::RectangleShape m_thumbnail; - }; - - public: - StateGameSelect(Game& game); - - void onOpen() override; - - void handleEvent(sf::Event e) override; - void render(sf::RenderTarget& target) override; - - private: - void registerGame(); - -}; \ No newline at end of file diff --git a/Source/SpaceInvaders/States/StateHighscores.cpp b/Source/SpaceInvaders/States/StateHighscores.cpp index ea919f4..e2c4c82 100644 --- a/Source/SpaceInvaders/States/StateHighscores.cpp +++ b/Source/SpaceInvaders/States/StateHighscores.cpp @@ -14,7 +14,7 @@ namespace SpaceInvaders { namespace { - const auto scoresPath = "res/si/scores.txt"; + const auto scoresPath = "res/SpaceInvaders/scores.txt"; } StateHighscores::StateHighscores(Game & game, int score) diff --git a/res/SpaceInvaders/info.txt b/res/SpaceInvaders/info.txt new file mode 100644 index 0000000..77d9929 --- /dev/null +++ b/res/SpaceInvaders/info.txt @@ -0,0 +1,6 @@ +name +Space Invaders + +desc +Based on the 1978 arcade game. +Shoot down aliens trying to invade the Earth! \ No newline at end of file diff --git a/res/si/scores.txt b/res/SpaceInvaders/scores.txt similarity index 100% rename from res/si/scores.txt rename to res/SpaceInvaders/scores.txt diff --git a/res/thumbnails/space_invaders.png b/res/txrs/thumbnails/SpaceInvaders.png similarity index 100% rename from res/thumbnails/space_invaders.png rename to res/txrs/thumbnails/SpaceInvaders.png