pingus-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Pingus-CVS] r3749 - in trunk/pingus/src: . screen


From: grumbel at BerliOS
Subject: [Pingus-CVS] r3749 - in trunk/pingus/src: . screen
Date: Wed, 9 Jul 2008 03:21:47 +0200

Author: grumbel
Date: 2008-07-09 03:21:45 +0200 (Wed, 09 Jul 2008)
New Revision: 3749

Removed:
   trunk/pingus/src/delta_manager.hpp
Modified:
   trunk/pingus/src/globals.cpp
   trunk/pingus/src/pingus_main.cpp
   trunk/pingus/src/screen/screen_manager.cpp
   trunk/pingus/src/screen/screen_manager.hpp
Log:
Kind of bigish ScreenManager cleanup, might break some stuff, needs testing

Deleted: trunk/pingus/src/delta_manager.hpp
===================================================================
--- trunk/pingus/src/delta_manager.hpp  2008-07-08 23:42:42 UTC (rev 3748)
+++ trunk/pingus/src/delta_manager.hpp  2008-07-09 01:21:45 UTC (rev 3749)
@@ -1,84 +0,0 @@
-//  Pingus - A free Lemmings clone
-//  Copyright (C) 2000 Ingo Ruhnke <address@hidden>
-//
-//  This program is free software: you can redistribute it and/or modify
-//  it under the terms of the GNU General Public License as published by
-//  the Free Software Foundation, either version 3 of the License, or
-//  (at your option) any later version.
-//  
-//  This program is distributed in the hope that it will be useful,
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//  GNU General Public License for more details.
-//  
-//  You should have received a copy of the GNU General Public License
-//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-#ifndef HEADER_PINGUS_DELTA_MANAGER_HPP
-#define HEADER_PINGUS_DELTA_MANAGER_HPP
-
-#include "SDL.h"
-#include <assert.h>
-#include <iostream>
-#include "pingus.hpp"
-
-
-class DeltaManager
-{
-private:
-  unsigned int absolute_time; ///< time in milliseconds since the start of 
DeltaManager
-  unsigned int last_time; ///< number of ticks when we were last set
-public:
-  DeltaManager ()
-    : absolute_time(0),
-      last_time (SDL_GetTicks())
-  {}
-
-  /** @brief get the current delta and start a new one
-   * @return the current delta in seconds
-   */
-  float getset ()
-  {
-    float ret = get ();
-    set ();
-    return ret;
-  }
-
-  /** @brief set the start of the delta */
-  void set ()
-  {
-    unsigned int ticks = SDL_GetTicks();
-    absolute_time += ticks - last_time;
-    last_time = ticks;
-  }
-
-  /** @return the current delta in seconds */
-  float get () const
-  {
-    unsigned int t = SDL_GetTicks();
-    if (t < last_time)
-      { // catching time travel
-        std::cout << "Time Travel: first: " << last_time << " second: " << t 
<< std::endl;
-        return 0.0f;
-      }
-    else
-      {
-        return (SDL_GetTicks() - last_time) / 1000.0f;
-      }
-  }
-
-  /** @return time in miliseconds passed since the start of the DeltaManager */
-  unsigned int get_absolute() const
-  {
-    return absolute_time;
-  }
-
-private:
-  DeltaManager (const DeltaManager&);
-  DeltaManager& operator= (const DeltaManager&);
-};
-
-
-#endif
-
-/* EOF */

Modified: trunk/pingus/src/globals.cpp
===================================================================
--- trunk/pingus/src/globals.cpp        2008-07-08 23:42:42 UTC (rev 3748)
+++ trunk/pingus/src/globals.cpp        2008-07-09 01:21:45 UTC (rev 3749)
@@ -15,10 +15,9 @@
 //  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #include "globals.hpp"
-
-
+
 int         game_speed                      = 20;
-float         desired_fps                     = 40;
+float       desired_fps                     = 40;
 bool        print_fps                       = false;
 int         verbose                         = 0;
 bool        music_enabled                   = true;
@@ -46,5 +45,5 @@
 unsigned int pingus_debug_flags              = 0;
 
 bool        fullscreen_enabled              = false;
-
+
 /* EOF */

Modified: trunk/pingus/src/pingus_main.cpp
===================================================================
--- trunk/pingus/src/pingus_main.cpp    2008-07-08 23:42:42 UTC (rev 3748)
+++ trunk/pingus/src/pingus_main.cpp    2008-07-09 01:21:45 UTC (rev 3749)
@@ -741,7 +741,7 @@
 PingusMain::on_exit_press()
 {
   std::cout << "Exit pressed" << std::endl;
-  ScreenManager::instance()->clear();
+  ScreenManager::instance()->pop_all_screens();
 }
 
 void

Modified: trunk/pingus/src/screen/screen_manager.cpp
===================================================================
--- trunk/pingus/src/screen/screen_manager.cpp  2008-07-08 23:42:42 UTC (rev 
3748)
+++ trunk/pingus/src/screen/screen_manager.cpp  2008-07-09 01:21:45 UTC (rev 
3749)
@@ -16,7 +16,6 @@
 
 #include "SDL.h"
 #include <iostream>
-#include "../delta_manager.hpp"
 #include "../globals.hpp"
 #include "math/size.hpp"
 #include "pathname.hpp"
@@ -36,8 +35,7 @@
 {  
   assert(instance_ == 0);
   instance_ = this;
-  cached_action = CA_NONE;
-  
+    
   input_manager = std::auto_ptr<Input::Manager>(new Input::Manager());
 
   if (controller_file.empty())
@@ -51,7 +49,7 @@
   fps_counter = std::auto_ptr<FPSCounter>(new FPSCounter());
 }
 
-ScreenManager::~ScreenManager ()
+ScreenManager::~ScreenManager()
 {
   instance_ = 0;
 }
@@ -60,104 +58,83 @@
 ScreenManager::display()
 {
   show_swcursor(swcursor_enabled);
-  DeltaManager delta_manager;
+  
+  Uint32 last_ticks = SDL_GetTicks();
 
-  // Main loop for the menu
-  // and incidentally this is also the main loop for the whole game
   while (!screens.empty())
     {
-      // how long the previous frame (iteration) took (if any)
-      float time_delta = delta_manager.getset();
+      Uint32 ticks = SDL_GetTicks();
+      float delta  = float(ticks - last_ticks)/1000.0f;
 
       // previous frame took more than one second
-      if (time_delta > 1.0)
-       {
+      if (delta > 1.0)
+        {
           if (maintainer_mode)
-            std::cout << "ScreenManager: detected large delta (" << time_delta
+            std::cout << "ScreenManager: detected large delta (" << delta
                       << "), ignoring and doing frameskip" << std::endl;
-         continue; // skip this frame
-       }
+        }
+      else
+        {
+          if (swcursor_enabled)
+            cursor.update(delta);
+  
+          update(delta);
+      
+          // cap the framerate at the desired value
+          if (delta < 1.0f / desired_fps) {
+            // idle delay to make the frame take as long as we want it to
+            SDL_Delay(static_cast<Uint32>(1000 *((1.0f / desired_fps) - 
delta)));
+          }
+        }
 
-      last_screen = get_current_screen();
+      last_ticks   = ticks;
+    }
+}
+ 
+void
+ScreenManager::update(float delta)
+{
+  ScreenPtr last_screen = get_current_screen();
             
-      // update the input
-      input_manager->update(time_delta);
-      std::vector<Input::Event> events = input_controller->poll_events();
-      for(std::vector<Input::Event>::iterator i = events.begin(); 
-          i != events.end() && last_screen == get_current_screen(); 
-          ++i)
+  // update the input, break away as soon as the current screen changed
+  input_manager->update(delta);
+  std::vector<Input::Event> events = input_controller->poll_events();
+  for(std::vector<Input::Event>::iterator i = events.begin(); 
+      i != events.end();
+      ++i)
+    {
+      last_screen->update(*i);
+      if (last_screen != get_current_screen())
         {
-          get_current_screen()->update(*i);
+          fade_over(last_screen, get_current_screen());
+          return;
         }
-      get_current_screen()->update(time_delta);
+    }
 
-      if (swcursor_enabled)
-        cursor.update(time_delta);
+  last_screen->update(delta);
+  if (last_screen != get_current_screen())
+    {
+      fade_over(last_screen, get_current_screen());
+      return;
+    }
 
-      // Last screen has popped, so we are going to end here
-      if (screens.empty())
-       continue;
+  // Draw screen
+  if (get_current_screen()->draw(*display_gc))
+    {
+      display_gc->render(Display::get_screen(), Rect(Vector2i(0,0), 
Size(Display::get_width(),
+                                                                         
Display::get_height())));
 
-      while (cached_action != CA_NONE)
+      if (swcursor_enabled)
         {
-          switch (cached_action)
-            {
-            case CA_POP:
-              real_pop_screen();
-              break;
-            case CA_POP_ALL:
-              real_pop_all_screens();
-              break;
-            case CA_REPLACE:
-              real_replace_screen(replace_screen_arg);
-              break;
-            case CA_CLEAR:
-              real_clear();
-              break;
-            default:
-              break;
-            }
+          Vector2f mouse_pos = 
Input::Controller::current()->get_pointer(Input::STANDARD_POINTER)->get_pos();
+          cursor.draw(mouse_pos.x, mouse_pos.y, Display::get_screen());
         }
 
-      // FIXME: is there a more gentel way to do that instead of spreading the 
checks all around here?
-      // Last screen has poped, so we are going to end here
-      if (screens.empty())
-       continue;
+      if (print_fps)
+        fps_counter->draw();
 
-      // skip draw if the screen changed to avoid glitches
-      if (last_screen == get_current_screen())
-       {
-         if (get_current_screen()->draw(*display_gc))
-            {
-              display_gc->render(Display::get_screen(), Rect(Vector2i(0,0), 
Size(Display::get_width(),
-                                                                               
  Display::get_height())));
-
-              if (swcursor_enabled)
-                {
-                  Vector2f mouse_pos = 
Input::Controller::current()->get_pointer(Input::STANDARD_POINTER)->get_pos();
-                  cursor.draw(mouse_pos.x, mouse_pos.y, Display::get_screen());
-                }
-
-              if (print_fps)
-                fps_counter->draw();
-
-              Display::flip_display();
-              display_gc->clear();
-            }
-        }
-      else
-       {
-         //std::cout << "ScreenManager: fading screens" << std::endl;
-         //FIXME: this shouldn't be done in one iteration of this loop (one 
frame)
-         fade_over(last_screen, get_current_screen());
-       }
-
-      // save this value because it might change drastically within the if 
statement
-      // cap the framerate at the desired value
-      if (time_delta < 1 / desired_fps) {
-       // idle delay to make the frame take as long as we want it to
-       SDL_Delay(static_cast<Uint32>(1000 *((1 / desired_fps) - time_delta)));
-      }
+      Display::flip_display();
+      display_gc->clear();
     }
 }
 
@@ -165,70 +142,33 @@
 ScreenManager::get_current_screen()
 {
   assert(!screens.empty());
-  return screens.back ();
+  return screens.back();
 }
 
 ScreenManager*
-ScreenManager::instance ()
+ScreenManager::instance()
 {
   return instance_;
 }
 
 void
 ScreenManager::push_screen (Screen* screen)
-{
+{ 
   if (!screens.empty())
-    {
-      screens.back()->on_shutdown();
-    }
+    screens.back()->on_shutdown();
 
   screens.push_back(ScreenPtr(screen));
   screen->on_startup();
 }
 
 void
-ScreenManager::pop_screen ()
+ScreenManager::pop_screen()
 {
-  assert(cached_action == CA_NONE);
-  cached_action = CA_POP;
-}
-
-void
-ScreenManager::pop_all_screens()
-{
-  assert(cached_action == CA_NONE);
-  cached_action = CA_POP_ALL;
-}
-
-void
-ScreenManager::replace_screen (Screen* screen)
-{
-  assert(cached_action == CA_NONE);
-  cached_action = CA_REPLACE;
-  replace_screen_arg = ScreenPtr(screen);
-}
-
-void
-ScreenManager::real_replace_screen (ScreenPtr ptr)
-{
-  cached_action = CA_NONE;
-  screens.back()->on_shutdown ();
-  screens.back() = ptr;
-
-  if (screens.back()->get_size() != Display::get_size())
-    screens.back()->resize(Display::get_size());
-  screens.back()->on_startup();
-}
-
-void
-ScreenManager::real_pop_screen ()
-{
-  cached_action = CA_NONE;
-  ScreenPtr back = screens.back ();
+  ScreenPtr back = screens.back();
   screens.pop_back();
   back->on_shutdown();
 
-  if (!screens.empty ())
+  if (!screens.empty())
     {
       if (screens.back()->get_size() != Display::get_size())
         screens.back()->resize(Display::get_size());
@@ -237,9 +177,8 @@
 }
 
 void
-ScreenManager::real_pop_all_screens()
+ScreenManager::pop_all_screens()
 {
-  cached_action = CA_NONE;
   ScreenPtr back = screens.back();
   screens.pop_back();
   back->on_shutdown();
@@ -248,30 +187,24 @@
 }
 
 void
-ScreenManager::clear()
+ScreenManager::replace_screen (Screen* screen)
 {
-  cached_action = CA_CLEAR;
-}
+  screens.back()->on_shutdown();
+  screens.back() = ScreenPtr(screen);
 
-void
-ScreenManager::real_clear()
-{
-  cached_action = CA_NONE;
-  screens.clear();
-}
+  if (screens.back()->get_size() != Display::get_size())
+    screens.back()->resize(Display::get_size());
+  screens.back()->on_startup();
 
+}
+
 void
 ScreenManager::fade_over(ScreenPtr old_screen, ScreenPtr new_screen)
 {
-  DeltaManager delta_manager;
-  float passed_time = 0;
-
+  Uint32 last_ticks = SDL_GetTicks();
   float progress = 0.0f;
   while (progress <= 1.0f)
     {
-      float time_delta = delta_manager.getset ();
-      passed_time += time_delta;
-
       int border_x = int((Display::get_width()/2)  * (1.0f - progress));
       int border_y = int((Display::get_height()/2) * (1.0f - progress));
 
@@ -288,23 +221,24 @@
       display_gc->render(Display::get_screen(), Rect(Vector2i(0,0), 
Size(Display::get_width(),
                                                                          
Display::get_height())));
       display_gc->clear();
-
-      //GameDelta delta (time_delta, CL_System::get_time(), events);
-      // FIXME: Animation looks nifty but doesn't work all that good
-      //new_screen->update (delta);
-      //old_screen->update (delta);
       
       Display::pop_cliprect();
-      Display::flip_display ();
+      Display::flip_display();
       display_gc->clear();
       
-      progress = passed_time/1.0f;
+      progress = (SDL_GetTicks() - last_ticks)/1000.0f;
     }
 }
 
 void
-ScreenManager::resize(const Size& size)
+ScreenManager::resize(const Size& size_)
 {
+  Size size(size_);
+
+  // Limit Window size so some reasonable minimum
+  if (size.width  < 640) size.width  = 640;
+  if (size.height < 480) size.height = 480;
+
   display_gc->set_rect(Rect(Vector2i(0, 0), size));
 
   // FIXME: Calling this causes horrible flicker, since the screen

Modified: trunk/pingus/src/screen/screen_manager.hpp
===================================================================
--- trunk/pingus/src/screen/screen_manager.hpp  2008-07-08 23:42:42 UTC (rev 
3748)
+++ trunk/pingus/src/screen/screen_manager.hpp  2008-07-09 01:21:45 UTC (rev 
3749)
@@ -53,12 +53,6 @@
       or replaced) */
   std::vector<ScreenPtr> screens;
 
-  /** the screen that was used in the last update() */
-  ScreenPtr last_screen;
-
-  enum { CA_NONE, CA_POP, CA_POP_ALL, CA_REPLACE, CA_CLEAR } cached_action;
-  ScreenPtr replace_screen_arg;
-
 public:
   ScreenManager ();
   ~ScreenManager();
@@ -67,45 +61,33 @@
 
   /** Start the screen manager and let it take control, this will
       not return until the somebody signals a quit() */
-  void display ();
+  void display();
 
+  void update(float delta);
+
   /** Replace the current screen */
-  void replace_screen (Screen*);
+  void replace_screen(Screen*);
 
   /** Add a screen on top of another screen */
-  void push_screen (Screen*);
+  void push_screen(Screen*);
 
   /** Remove the current screen and fall back to the last one */
-  void pop_screen ();
+  void pop_screen();
 
   /** Remove all screens */
   void pop_all_screens();
 
-  /** Remove all screens from the stack */
-  void clear();
-
   /** @return a pointer to the current Screen */
   ScreenPtr get_current_screen();
 
   void show_swcursor(bool v);
   
 private:
-  void real_clear();
-
-  /** Replace the current screen */
-  void real_replace_screen (ScreenPtr);
-
-  /** Remove the current screen and fall back to the last one */
-  void real_pop_screen ();
-
-  /** Remove all screens */
-  void real_pop_all_screens();
-
   /** FadeOver test*/
-  void fade_over (ScreenPtr old_screen, ScreenPtr new_screen);
+  void fade_over(ScreenPtr old_screen, ScreenPtr new_screen);
 
 public:
-  static ScreenManager* instance ();
+  static ScreenManager* instance();
 
 private:
   ScreenManager (const ScreenManager&);





reply via email to

[Prev in Thread] Current Thread [Next in Thread]