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