Index: gui/game-screen.cpp
===================================================================
--- gui/game-screen.cpp	(revision 699e83a728c7db8f10c4637546020207c0b0d4c0)
+++ gui/game-screen.cpp	(revision 699e83a728c7db8f10c4637546020207c0b0d4c0)
@@ -0,0 +1,51 @@
+#include "game-screen.hpp"
+
+#include <iostream>
+
+#include <SDL2/SDL_ttf.h>
+
+#include "../vulkan-game.hpp"
+
+#include "button.hpp"
+#include "panel.hpp"
+
+using namespace std;
+
+// TODO: Figure out a good way to return errors instead of just printing them
+// Probably throw an exception in the constructor
+// Make sure to cleanup anythign that was initialized correctly before the error
+// since throwing an exception in the constructor means the destructor won't get called
+
+GameScreen::GameScreen(SDL_Renderer& renderer, VulkanGame& gameInfo) :
+      Screen(renderer, gameInfo) {
+   Panel *statsPanel = new Panel(10, 50, 95, 46, 0x161616FF, this->renderer);
+
+   // TODO: Add the button to the panel it's in, not directly to the window
+   addUIElement(statsPanel);
+   addUIElement(new Panel(540, 10, 250, 35, 0x161616FF, this->renderer));
+   addUIElement(new Panel(590, 60, 200, 200, 0x161616FF, this->renderer));
+   addUIElement(new Button("Main Menu", 708, 17, 8, 0x222299FF, 0xFFFFFFFF, this->gameInfo,
+      this->renderer, mainMenu_onMouseClick, nullptr, nullptr));
+}
+
+GameScreen::~GameScreen() {
+}
+
+void GameScreen::createRenderCommands(VkCommandBuffer& commandBuffer, uint32_t currentImage) {
+   gameInfo.modelPipeline.createRenderCommands(commandBuffer, currentImage);
+   gameInfo.shipPipeline.createRenderCommands(commandBuffer, currentImage);
+   gameInfo.asteroidPipeline.createRenderCommands(commandBuffer, currentImage);
+   gameInfo.laserPipeline.createRenderCommands(commandBuffer, currentImage);
+   gameInfo.explosionPipeline.createRenderCommands(commandBuffer, currentImage);
+
+   // Always render this pipeline last
+   gameInfo.overlayPipeline.createRenderCommands(commandBuffer, currentImage);
+}
+
+void GameScreen::handleEvent(UIEvent& e) {
+   Screen::handleEvent(e);
+}
+
+void mainMenu_onMouseClick(VulkanGame& gameInfo) {
+   gameInfo.goToScreen(gameInfo.screens[SCREEN_MAIN]);
+}
Index: gui/game-screen.hpp
===================================================================
--- gui/game-screen.hpp	(revision 699e83a728c7db8f10c4637546020207c0b0d4c0)
+++ gui/game-screen.hpp	(revision 699e83a728c7db8f10c4637546020207c0b0d4c0)
@@ -0,0 +1,20 @@
+#ifndef _GAME_SCREEN_H
+#define _GAME_SCREEN_H
+
+#include <map>
+
+#include "screen.hpp"
+
+class GameScreen : public Screen {
+   public:
+      GameScreen(SDL_Renderer& renderer, VulkanGame& gameInfo);
+      ~GameScreen() override;
+
+      void createRenderCommands(VkCommandBuffer& commandBuffer, uint32_t currentImage) override;
+
+      void handleEvent(UIEvent& e) override;
+};
+
+void mainMenu_onMouseClick(VulkanGame& gameInfo);
+
+#endif // _GAME_SCREEN_H
Index: gui/panel.cpp
===================================================================
--- gui/panel.cpp	(revision 699e83a728c7db8f10c4637546020207c0b0d4c0)
+++ gui/panel.cpp	(revision 699e83a728c7db8f10c4637546020207c0b0d4c0)
@@ -0,0 +1,74 @@
+#include "panel.hpp"
+
+#include <iostream>
+
+#include <SDL2/SDL2_gfxPrimitives.h>
+
+using namespace std;
+
+Panel::Panel(int x, int y, int width, int height, uint32_t color, SDL_Renderer& renderer) :
+      UIElement {x, y, width, height, renderer, nullptr, nullptr, nullptr},
+      color(color) {
+   this->texture = SDL_CreateTexture(&this->renderer, SDL_PIXELFORMAT_RGBA8888,
+      SDL_TEXTUREACCESS_TARGET, this->width, this->height);
+   if (this->texture == nullptr) {
+      cout << "Unable to create texture! SDL Error: " << SDL_GetError() << endl;
+   }
+}
+
+Panel::~Panel() {
+   for (UIElement*& uiElement : this->uiElements) {
+      delete uiElement;
+   }
+
+   if (this->texture != nullptr) {
+      SDL_DestroyTexture(this->texture);
+      this->texture = nullptr;
+   }
+}
+
+void Panel::addUIElement(UIElement* element) {
+   this->uiElements.push_back(element);
+}
+
+void Panel::render(int x, int y) {
+   SDL_Texture* renderTarget = SDL_GetRenderTarget(&this->renderer);
+
+   SDL_SetRenderTarget(&this->renderer, this->texture);
+
+   // clear the texture
+   SDL_SetRenderDrawBlendMode(&this->renderer, SDL_BLENDMODE_NONE);
+   SDL_SetRenderDrawColor(&this->renderer, 0x00, 0x00, 0x00, 0x00);
+   SDL_RenderClear(&this->renderer);
+
+   roundedBoxRGBA(&this->renderer, 0, 0, this->width, this->height,
+      8, 0x33, 0x33, 0x33, 0xFF);
+
+   int borderThickness = 1;
+
+   uint8_t colorR = (this->color >> 24) & 0xFF;
+   uint8_t colorG = (this->color >> 16) & 0xFF;
+   uint8_t colorB = (this->color >> 8) & 0xFF;
+   uint8_t colorA = this->color & 0xFF;
+
+   roundedBoxRGBA(&this->renderer, borderThickness, borderThickness,
+      this->width - borderThickness, this->height - borderThickness,
+      8, colorR, colorG, colorB, colorA);
+
+   for (UIElement*& uiElement : this->uiElements) {
+      uiElement->render(7, 7);
+   }
+   
+   SDL_SetRenderTarget(&this->renderer, renderTarget);
+   SDL_SetTextureBlendMode(this->texture, SDL_BLENDMODE_BLEND);
+
+   SDL_Rect rect = { this->x + x, this->y + y, this->width, this->height };
+
+   SDL_RenderCopy(&this->renderer, this->texture, nullptr, &rect);
+}
+
+void Panel::handleEvent(UIEvent& e) {
+   for (UIElement*& uiElement : this->uiElements) {
+      uiElement->handleEvent(e);
+   }
+}
Index: gui/panel.hpp
===================================================================
--- gui/panel.hpp	(revision 699e83a728c7db8f10c4637546020207c0b0d4c0)
+++ gui/panel.hpp	(revision 699e83a728c7db8f10c4637546020207c0b0d4c0)
@@ -0,0 +1,30 @@
+#ifndef _PANEL_HPP
+#define _PANEL_HPP
+
+#include <vector>
+
+#include <SDL2/SDL.h>
+
+#include "../game-gui.hpp"
+
+#include "ui-element.hpp"
+
+// TODO: Allow border color and width to be configurable
+class Panel : public UIElement {
+public:
+   Panel(int x, int y, int width, int height, uint32_t color, SDL_Renderer& renderer);
+   ~Panel() override;
+
+   void addUIElement(UIElement* element);
+
+   void render(int x, int y) override;
+   void handleEvent(UIEvent& e) override;
+
+private:
+   SDL_Texture* texture = nullptr;
+   uint32_t color = 0x00000000;
+
+   vector<UIElement*> uiElements;
+};
+
+#endif // _PANEL_HPP
