pingus-cvs
[Top][All Lists]
Advanced

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

[Pingus-CVS] r3757 - in trunk/pingus/src: input screen


From: grumbel at BerliOS
Subject: [Pingus-CVS] r3757 - in trunk/pingus/src: input screen
Date: Thu, 10 Jul 2008 07:38:43 +0200

Author: grumbel
Date: 2008-07-10 07:38:42 +0200 (Thu, 10 Jul 2008)
New Revision: 3757

Modified:
   trunk/pingus/src/input/controller.cpp
   trunk/pingus/src/input/controller.hpp
   trunk/pingus/src/screen/screen_manager.cpp
   trunk/pingus/src/screen/screen_manager.hpp
Log:
Cleaned up Input recording code a bit

Modified: trunk/pingus/src/input/controller.cpp
===================================================================
--- trunk/pingus/src/input/controller.cpp       2008-07-10 05:37:25 UTC (rev 
3756)
+++ trunk/pingus/src/input/controller.cpp       2008-07-10 05:38:42 UTC (rev 
3757)
@@ -19,7 +19,7 @@
 #include "controller.hpp"
 
 namespace Input {
-
+
 Controller* Controller::current_ = 0;
 
 Controller* 
@@ -232,14 +232,21 @@
   events.push_back(makeKeyboardEvent(key));
 }
 
-std::vector<Event>
-Controller::poll_events()
+void
+Controller::clear_events()
 {
-  std::vector<Event> old_events = events;  
   events.clear();
-  return old_events;
 }
 
+void
+Controller::poll_events(std::vector<Event>& out_events)
+{
+  for(std::vector<Event>::iterator i = events.begin(); i != events.end(); ++i) 
 
+    out_events.push_back(*i);
+
+  events.clear();
+}
+
 } // namespace Input
 
 /* EOF */

Modified: trunk/pingus/src/input/controller.hpp
===================================================================
--- trunk/pingus/src/input/controller.hpp       2008-07-10 05:37:25 UTC (rev 
3756)
+++ trunk/pingus/src/input/controller.hpp       2008-07-10 05:38:42 UTC (rev 
3757)
@@ -29,7 +29,7 @@
 class ControllerPointer;
 class ControllerScroller;
 class ControllerKeyboard;
-
+
 class Controller
 {
 
@@ -48,7 +48,8 @@
   
   std::vector<Event> events;
 public:
-  std::vector<Event> poll_events();
+  void clear_events();
+  void poll_events(std::vector<Event>& events);
 
   Controller(const ControllerDescription& desc);
   ~Controller();
@@ -76,7 +77,7 @@
   Controller(const Controller&);
   Controller& operator= (const Controller&);
 };
-
+
 } // namespace Input
 
 #endif 

Modified: trunk/pingus/src/screen/screen_manager.cpp
===================================================================
--- trunk/pingus/src/screen/screen_manager.cpp  2008-07-10 05:37:25 UTC (rev 
3756)
+++ trunk/pingus/src/screen/screen_manager.cpp  2008-07-10 05:38:42 UTC (rev 
3757)
@@ -139,8 +139,10 @@
 ScreenManager* ScreenManager::instance_ = 0;
 
 ScreenManager::ScreenManager()
-  : display_gc(new DrawingContext())
-{  
+  : display_gc(new DrawingContext()),
+    record_input(false),
+    playback_input(false)
+{
   assert(instance_ == 0);
   instance_ = this;
     
@@ -168,18 +170,45 @@
   show_swcursor(swcursor_enabled);
   
   Uint32 last_ticks = SDL_GetTicks();
+  float delta;
+  std::vector<Input::Event> events;
 
   while (!screens.empty())
     {
-      Uint32 ticks = SDL_GetTicks();
-      float delta  = float(ticks - last_ticks)/1000.0f;
+      events.clear();
       
-      if (0)
-        if (0)
-          write(std::cerr, delta);
-        else
+      // Get time and update Input::Events
+      if (playback_input)
+        {
+          // Get Time
           read(std::cin, delta);
 
+          // Update InputManager so that SDL_QUIT and stuff can be handled, 
even if the basic events are taken from record
+          input_manager->update(delta);
+          input_controller->clear_events();
+          read_events(std::cin, events);
+        }
+      else
+        {
+          // Get Time
+          Uint32 ticks = SDL_GetTicks();
+          delta  = float(ticks - last_ticks)/1000.0f;
+          last_ticks = ticks;
+
+          // Update InputManager and get Events
+          input_manager->update(delta);
+          input_controller->poll_events(events);
+        }
+      
+      if (record_input)
+        {
+          write(std::cerr, delta);
+          write_events(std::cerr, events);
+        }
+
+      if (swcursor_enabled)
+        cursor.update(delta);
+
       // previous frame took more than one second
       if (delta > 1.0)
         {
@@ -188,11 +217,8 @@
                       << "), ignoring and doing frameskip" << std::endl;
         }
       else
-        {
-          if (swcursor_enabled)
-            cursor.update(delta);
-  
-          update(delta);
+        {  
+          update(delta, events);
       
           // cap the framerate at the desired value
           if (delta < 1.0f / desired_fps) {
@@ -200,34 +226,16 @@
             SDL_Delay(static_cast<Uint32>(1000 *((1.0f / desired_fps) - 
delta)));
           }
         }
-
-      last_ticks   = ticks;
     }
 }
  
 void
-ScreenManager::update(float delta)
+ScreenManager::update(float delta, const std::vector<Input::Event>& events)
 {
   ScreenPtr last_screen = get_current_screen();
-            
-  // update the input, break away as soon as the current screen changed
-  input_manager->update(delta);
-  std::vector<Input::Event> events;
-
-  if (1)
+  
+  for(std::vector<Input::Event>::const_iterator i = events.begin(); i != 
events.end(); ++i)
     {
-      events = input_controller->poll_events(); 
-      //write_events(std::cerr, events);
-    }
-  else
-    {
-      read_events(std::cin, events);
-    }
-
-  for(std::vector<Input::Event>::iterator i = events.begin(); 
-      i != events.end();
-      ++i)
-    {
       if (i->type == Input::POINTER_EVENT_TYPE && i->pointer.name == 
Input::STANDARD_POINTER)
         mouse_pos = Vector2f(i->pointer.x, i->pointer.y);                 
 
@@ -246,23 +254,23 @@
       return;
     }
 
-  // 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())));
-
-      if (swcursor_enabled)
-        {
-          cursor.draw(mouse_pos.x, mouse_pos.y, Display::get_screen());
-        }
-
-      if (print_fps)
-        fps_counter->draw();
-
-      Display::flip_display();
-      display_gc->clear();
-    }
+  // Draw screen to DrawingContext
+  get_current_screen()->draw(*display_gc);
+  
+  // Render the DrawingContext to the screen
+  display_gc->render(Display::get_screen(), Rect(Vector2i(0,0), 
Size(Display::get_width(),
+                                                                     
Display::get_height())));
+  display_gc->clear();
+  
+  // Draw the mouse pointer
+  if (swcursor_enabled)
+    cursor.draw(mouse_pos.x, mouse_pos.y, Display::get_screen());
+  
+  // Draw FPS Counter
+  if (print_fps)
+    fps_counter->draw();
+  
+  Display::flip_display();
 }
 
 ScreenPtr

Modified: trunk/pingus/src/screen/screen_manager.hpp
===================================================================
--- trunk/pingus/src/screen/screen_manager.hpp  2008-07-10 05:37:25 UTC (rev 
3756)
+++ trunk/pingus/src/screen/screen_manager.hpp  2008-07-10 05:38:42 UTC (rev 
3757)
@@ -26,6 +26,7 @@
 
 namespace Input {
 class Manager;
+class Event;
 class Controller;
 }
 
@@ -56,6 +57,9 @@
 
   Vector2f mouse_pos;
 
+  bool record_input;
+  bool playback_input;
+
 public:
   ScreenManager ();
   ~ScreenManager();
@@ -66,7 +70,7 @@
       not return until the somebody signals a quit() */
   void display();
 
-  void update(float delta);
+  void update(float delta, const std::vector<Input::Event>& events);
 
   /** Replace the current screen */
   void replace_screen(Screen*);
@@ -80,11 +84,11 @@
   /** Remove all screens */
   void pop_all_screens();
 
+  void show_swcursor(bool v);
+  
   /** @return a pointer to the current Screen */
   ScreenPtr get_current_screen();
 
-  void show_swcursor(bool v);
-  
 private:
   /** FadeOver test*/
   void fade_over(ScreenPtr old_screen, ScreenPtr new_screen);





reply via email to

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