pingus-cvs
[Top][All Lists]
Advanced

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

[Pingus-CVS] CVS: Games/Pingus/src pingu_action.cxx,1.10,1.11 pingu_acti


From: torangan
Subject: [Pingus-CVS] CVS: Games/Pingus/src pingu_action.cxx,1.10,1.11 pingu_action.hxx,1.22,1.23
Date: 28 Oct 2002 15:41:44 -0000

Update of /usr/local/cvsroot/Games/Pingus/src
In directory dark:/tmp/cvs-serv14675

Modified Files:
        pingu_action.cxx pingu_action.hxx 
Log Message:
applied forces patch from Gervase


Index: pingu_action.cxx
===================================================================
RCS file: /usr/local/cvsroot/Games/Pingus/src/pingu_action.cxx,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- pingu_action.cxx    20 Oct 2002 18:28:49 -0000      1.10
+++ pingu_action.cxx    28 Oct 2002 15:41:42 -0000      1.11
@@ -79,6 +79,26 @@
   return false;
 }
 
+bool
+PinguAction::collision_on_walk (int x, int y)
+{
+  bool collision = false;
+  int pixel = Groundtype::GP_NOTHING;
+
+  for (int pingu_y = 0; pingu_y <= pingu_height; ++pingu_y)
+    {
+      pixel = rel_getpixel(x, y + pingu_y);
+
+      if (pixel != Groundtype::GP_NOTHING && pixel != Groundtype::GP_BRIDGE)
+       {
+         collision = true;
+         break;
+       }
+    }
+
+  return collision;
+}
+
 void
 PinguAction::move_with_forces (float x_to_add, float y_to_add)
 {
@@ -121,9 +141,11 @@
       y_inc = denominator;
     }
 
+  Vector force_counter = resultant_force;
+
   // Keep moving the Pingu until there is only a fraction left
-  while (resultant_force.x <= -1 || resultant_force.x >= 1
-         || resultant_force.y <= -1 || resultant_force.y >= 1)
+  while (force_counter.x <= -1 || force_counter.x >= 1
+         || force_counter.y <= -1 || force_counter.y >= 1)
     {
       x_numerator += x_inc;
 
@@ -134,29 +156,55 @@
          x_numerator -= denominator;
 
          // Move the Pingu depending on what the direction of the force is
-         if (resultant_force.x >= 1)
+         if (force_counter.x >= 1)
            {
-             // Check what is to the right of the Pingu
-             if (rel_getpixel(pingu->direction, 0) != Groundtype::GP_NOTHING
-                   || head_collision_on_walk(pingu->direction, 0))
+             // If there is something to the right of the Pingu
+             if (collision_on_walk(pingu->direction, 0))
                {
-                 break;
-               }
+                 // Make it so that the Pingu won't go right any further.
+                 force_counter.x = 0;
+                 resultant_force.x = 0;
 
-             pingu->set_x(pingu->get_x() + 1);
-             resultant_force.x--;
+                 // Stop Pingu from still going up
+                 if (force_counter.y < 0)
+                   {
+                     force_counter.y = 0;
+                     resultant_force.y = 0;
+                   }
+
+                 pingu->set_velocity(resultant_force);
+               }
+             else
+               {
+                 // Move the Pingu right
+                 pingu->set_x(pingu->get_x() + 1);
+                 force_counter.x--;
+               }
            }
-         else if (resultant_force.x <= -1)
+         else if (force_counter.x <= -1)
            {
-             // Check what is to the left of the Pingu
-             if (rel_getpixel(-(pingu->direction), 0) != Groundtype::GP_NOTHING
-                   || head_collision_on_walk(-(pingu->direction), 0) )
+             // If there is something to the left of the Pingu
+             if (collision_on_walk(-(pingu->direction), 0))
                {
-                 break;
-               }
+                 // Make it so that the Pingu won't go left any further.
+                 force_counter.x = 0;
+                 resultant_force.x = 0;
 
-             pingu->set_x(pingu->get_x() - 1);
-             resultant_force.x++;
+                 // Stop Pingu from still going up
+                 if (force_counter.y < 0)
+                   {
+                     force_counter.y = 0;
+                     resultant_force.y = 0;
+                   }
+
+                 pingu->set_velocity(resultant_force);
+               }
+             else
+               {
+                 // Move the Pingu left
+                 pingu->set_x(pingu->get_x() - 1);
+                 force_counter.x++;
+               }
            }
        }
 
@@ -169,21 +217,41 @@
          y_numerator -= denominator;
 
          // Move the Pingu depending on what the direction of the force is
-         if (resultant_force.y >= 1)
+         if (force_counter.y >= 1)
            {
+             // If there is something below the Pingu
              if (rel_getpixel(0, -1) != Groundtype::GP_NOTHING)
-               break;
+               {
+                 // Make it so that the Pingu won't go down any further.
+                 force_counter.y = 0;
+                 resultant_force.y = 0;
 
-             pingu->set_y(pingu->get_y() + 1);
-             resultant_force.y--;
+                 pingu->set_velocity(resultant_force);
+               }
+             else
+               {
+                 // Move the Pingu down
+                 pingu->set_y(pingu->get_y() + 1);
+                 force_counter.y--;
+               }
            }
-         else if (resultant_force.y <= -1)
+         else if (force_counter.y <= -1)
            {
+             // If there is something in the way above the Pingu
              if (head_collision_on_walk(0, 1))
-               break;
+               {
+                 // Make it so that the Pingu won't go up any further.
+                 force_counter.y = 0;
+                 resultant_force.y = 0;
 
-             pingu->set_y(pingu->get_y() - 1);
-             resultant_force.y++;
+                 pingu->set_velocity(resultant_force);
+               }
+             else
+               {
+                 // Move the Pingu up
+                 pingu->set_y(pingu->get_y() - 1);
+                 force_counter.y++;
+               }
            }
        }
     }

Index: pingu_action.hxx
===================================================================
RCS file: /usr/local/cvsroot/Games/Pingus/src/pingu_action.hxx,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- pingu_action.hxx    22 Oct 2002 19:31:11 -0000      1.22
+++ pingu_action.hxx    28 Oct 2002 15:41:42 -0000      1.23
@@ -103,13 +103,16 @@
   /// True if Pingu in specified position would bang its head if it were 
walking
   bool head_collision_on_walk (int x, int y);
   
+  /// True if Pingu in specified position would have a collision if it were 
walking
+  bool collision_on_walk (int x, int y);
+  
   /** Called if the action was successfully applied via request_set_action */
   virtual void on_successfull_apply () { }
 
   /** Called if the request_set_action failded to apply this action */
   virtual void on_failed_apply (Pingu*) { }
   
-  /** FIXME: document me */
+  /** Move Pingu according to the forces applied to it */
   void move_with_forces (float x_to_add, float y_to_add);
 
 private:





reply via email to

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