Felix Bytow 1 год назад
Родитель
Сommit
2a9f7b3786

+ 4 - 0
CMakeLists.txt

@@ -71,6 +71,10 @@ add_executable(Snake WIN32 MACOSX_BUNDLE
 file(GLOB assets assets/*)
 target_sources(Snake PRIVATE ${assets})
 
+if (WIN32)
+  target_sources(Snake PRIVATE windows-resources.rc)
+endif (WIN32)
+
 set_target_properties(Snake PROPERTIES
     RUNTIME_OUTPUT_NAME snake
 )

BIN
assets/snake-icon.png


+ 5 - 2
game/AssetManager.cxx

@@ -102,14 +102,17 @@ SDL_Texture* AssetManager::get_texture_asset(std::string const& filepath)
 
     auto const texture = SDL_CreateTextureFromSurface(renderer_, surf_it->second);
     texture_assets_[filepath] = texture;
-    SDL_FreeSurface(surf_it->second);
-    surface_assets_.erase(surf_it);
 
     return texture;
   }
   return it->second;
 }
 
+SDL_Surface* AssetManager::get_surface_asset(std::string const& filepath)
+{
+  return surface_assets_[filepath];
+}
+
 TTF_Font* AssetManager::get_font_asset(std::string const& filepath)
 {
   return font_assets_[filepath];

+ 2 - 0
game/AssetManager.hxx

@@ -28,6 +28,8 @@ public:
 
   SDL_Texture* get_texture_asset(std::string const& filepath);
 
+  SDL_Surface* get_surface_asset(std::string const& filepath);
+
   TTF_Font* get_font_asset(std::string const& filepath);
 
 private:

+ 2 - 2
game/GameStateManager.cxx

@@ -2,8 +2,8 @@
 
 #include <cassert>
 
-GameStateManager::GameStateManager()
-    :states_{{GameStates::Loading}}
+GameStateManager::GameStateManager(SDLWindow& window)
+    :window_{window}, states_{{GameStates::Loading}}
 {
   loading_.on_enter(*this);
 }

+ 9 - 1
game/GameStateManager.hxx

@@ -15,6 +15,8 @@
 
 #include <boost/noncopyable.hpp>
 
+class SDLWindow;
+
 enum class GameStates {
   Loading,
   Splash,
@@ -27,7 +29,7 @@ enum class GameStates {
 
 class GameStateManager final : private boost::noncopyable {
 public:
-  GameStateManager();
+  explicit GameStateManager(SDLWindow& window);
 
   ~GameStateManager();
 
@@ -41,7 +43,13 @@ public:
 
   void replace_state(GameStates new_state);
 
+  SDLWindow& window()
+  {
+    return window_;
+  }
+
 private:
+  SDLWindow& window_;
   std::stack<GameStates> states_;
 
   GameState* enum_to_state(GameStates state);

+ 4 - 2
game/SplashState.cxx

@@ -80,8 +80,10 @@ void SplashState::render(SDLRenderer& renderer)
 
 void SplashState::on_enter(GameStateManager& gsm)
 {
-  (void) gsm;
+  auto& am = AssetManager::instance();
   time_in_state_ = 0ms;
-  logo_ = AssetManager::instance().get_texture_asset("logo.jpg");
+  logo_ = am.get_texture_asset("logo.jpg");
   SDL_SetTextureBlendMode(logo_, SDL_BLENDMODE_BLEND);
+
+  SDL_SetWindowIcon(gsm.window(), am.get_surface_asset("snake-icon.png"));
 }

+ 5 - 5
main.cxx

@@ -7,12 +7,12 @@
 
 #include <cstdlib>
 
-void main_loop(SDLRenderer& renderer)
+void main_loop(SDLWindow& window, SDLRenderer& renderer)
 {
   using namespace std::chrono;
 
   AssetManager am{renderer};
-  GameStateManager gsm{};
+  GameStateManager gsm{window};
 
   auto start = high_resolution_clock::now();
   for (;;) {
@@ -31,12 +31,12 @@ void main_loop(SDLRenderer& renderer)
     auto const delta_time = duration_cast<milliseconds>(end-start);
     start = end;
 
-    if (auto const state = gsm.current(); state != nullptr)
+    if (auto const state = gsm.current(); state!=nullptr)
       state->update(gsm, delta_time);
     else
       return;
 
-    if (auto const state = gsm.current(); state != nullptr)
+    if (auto const state = gsm.current(); state!=nullptr)
       state->render(renderer);
     else
       return;
@@ -54,7 +54,7 @@ int main(int argc, char** argv) try
   };
   SDLRenderer renderer{window};
 
-  main_loop(renderer);
+  main_loop(window, renderer);
   return EXIT_SUCCESS;
 } catch (std::exception const& ex) {
   SDL_LogError(SDL_LOG_CATEGORY_ERROR, "%s", ex.what());

BIN
snake-icon.ico


+ 1 - 0
windows-resources.rc

@@ -0,0 +1 @@
+1000 ICON "snake-icon.ico"