Previous this patch the character got moved by the HandleKeyRefreshed_Move* 
methods.
Sending a character movement notification every frame would cause a lot of 
network traffic.
This patch let the turn master only send two actions for a simple movement:
One which starts the movement and one which stops it.
---
 lib/wormux/include/WORMUX_action.h |    4 +
 src/character/character.cpp        |  112 +++++++++++++++++++++++++++++-------
 src/character/character.h          |   15 ++++-
 src/include/action_handler.cpp     |   33 +++++++++++
 4 files changed, 139 insertions(+), 25 deletions(-)

diff --git a/lib/wormux/include/WORMUX_action.h 
b/lib/wormux/include/WORMUX_action.h
index 32460f3..1675417 100644
--- a/lib/wormux/include/WORMUX_action.h
+++ b/lib/wormux/include/WORMUX_action.h
@@ -74,6 +74,10 @@ public:
     ACTION_CHARACTER_JUMP,
     ACTION_CHARACTER_HIGH_JUMP,
     ACTION_CHARACTER_BACK_JUMP,
+    ACTION_CHARACTER_START_MOVING_LEFT,
+    ACTION_CHARACTER_STOP_MOVING_LEFT,
+    ACTION_CHARACTER_START_MOVING_RIGHT,
+    ACTION_CHARACTER_STOP_MOVING_RIGHT,
 
     // ########################################################
     // Using Weapon
diff --git a/src/character/character.cpp b/src/character/character.cpp
index 37aac08..f259f88 100644
--- a/src/character/character.cpp
+++ b/src/character/character.cpp
@@ -124,6 +124,10 @@ Character::Character (Team& my_team, const std::string 
&name, Body *char_body) :
   channel_step(-1),
   particle_engine(new ParticleEngine(500)),
   is_playing(false),
+  move_left_pressed(false),
+  move_left_slowly_pressed(false),
+  move_right_pressed(false),
+  move_right_slowly_pressed(false),
   previous_strength(0),
   body(NULL)
 {
@@ -180,6 +184,10 @@ Character::Character (const Character& acharacter) :
   channel_step(acharacter.channel_step),
   particle_engine(new ParticleEngine(250)),
   is_playing(acharacter.is_playing),
+  move_left_pressed(false),
+  move_left_slowly_pressed(false),
+  move_right_pressed(false),
+  move_right_slowly_pressed(false),
   previous_strength(acharacter.previous_strength),
   body(NULL)
 {
@@ -339,6 +347,11 @@ void Character::Die()
     SetMovement("breathe");
     SetCollisionModel(true, false, false);
 
+    move_left_pressed = false;
+    move_left_slowly_pressed = false;
+    move_right_pressed = false;
+    move_right_slowly_pressed = false;
+
     if(death_explosion)
       ApplyExplosion(GetCenter(), 
GameMode::GetInstance()->death_explosion_cfg);
     ASSERT(IsDead());
@@ -550,6 +563,16 @@ void Character::UpdateLastMovingTime()
 
 void Character::Refresh()
 {
+  if (IsImmobile()) {
+    bool left =(move_left_pressed || move_left_slowly_pressed);
+    bool right = (move_right_pressed || move_right_slowly_pressed);
+    if (left && !right) {
+      MoveLeft(move_left_slowly_pressed);
+    } else if (right && !left) {
+      MoveRight(move_right_slowly_pressed);
+    }
+  }
+
   if (IsGhost()) return;
 
   UpdatePosition();
@@ -814,6 +837,10 @@ void Character::StopPlaying()
   SetMovement("breathe");
   body->ResetWalk();
   SetRebounding(true);
+  move_left_pressed = false;
+  move_left_slowly_pressed = false;
+  move_right_pressed = false;
+  move_right_slowly_pressed = false;
 }
 
 // Begining of turn or changed to this character
@@ -939,52 +966,95 @@ void Character::SetCustomName(const std::string name)
 // ###################################################################
 // ###################################################################
 
+void Character::StopWalkingIfNecessary()
+{
+  bool right = move_right_pressed || move_right_slowly_pressed;
+  bool left = move_left_pressed || move_left_slowly_pressed;
+  if ((right == left) || (!left && !right))
+    body->StopWalk();
+}
+
 // #################### MOVE_RIGHT
-void Character::HandleKeyPressed_MoveRight(bool slowly)
+void Character::StartMovingRight(bool slowly)
 {
-  StartWalk(slowly);
+  if (slowly)
+    move_right_slowly_pressed = true;
+  else
+    move_right_pressed = true;
+  StopWalkingIfNecessary();
+}
 
-  HandleKeyRefreshed_MoveRight(slowly);
+void Character::StopMovingRight(bool slowly)
+{
+  if (slowly)
+    move_right_slowly_pressed = false;
+  else
+    move_right_pressed = false;
+  StopWalkingIfNecessary();
 }
 
-void Character::HandleKeyRefreshed_MoveRight(bool slowly)
+void Character::HandleKeyPressed_MoveRight(bool slowly)
 {
-  HideGameInterface();
+  Action a(Action::ACTION_CHARACTER_START_MOVING_RIGHT);
+  a.Push(slowly ? 1 : 0);
+  Network::GetInstance()->SendActionToAll(a);
 
-  ActiveTeam().crosshair.Hide();
+  StartMovingRight(slowly);
 
-  if (IsImmobile())
-    MoveRight(slowly);
+  HideGameInterface();
+  ActiveTeam().crosshair.Hide();
 }
 
-void Character::HandleKeyReleased_MoveRight(bool /*slowly*/)
+void Character::HandleKeyReleased_MoveRight(bool slowly)
 {
-  StopWalk();
+  Action a(Action::ACTION_CHARACTER_STOP_MOVING_RIGHT);
+  a.Push(slowly ? 1 : 0);
+  Network::GetInstance()->SendActionToAll(a);
+
+  StopMovingRight(slowly);
 
   ActiveTeam().crosshair.Show();
 }
 
 // #################### MOVE_LEFT
-void Character::HandleKeyPressed_MoveLeft(bool slowly)
+
+void Character::StartMovingLeft(bool slowly)
 {
-  StartWalk(slowly);
+  if (slowly)
+    move_left_slowly_pressed = true;
+  else
+    move_left_pressed = true;
+  StopWalkingIfNecessary();
+}
 
-  HandleKeyRefreshed_MoveLeft(slowly);
+void Character::StopMovingLeft(bool slowly)
+{
+  if (slowly)
+    move_left_slowly_pressed = false;
+  else
+    move_left_pressed = false;
+  StopWalkingIfNecessary();
 }
 
-void Character::HandleKeyRefreshed_MoveLeft(bool slowly)
+void Character::HandleKeyPressed_MoveLeft(bool slowly)
 {
-  HideGameInterface();
+  Action a(Action::ACTION_CHARACTER_START_MOVING_LEFT);
+  a.Push(slowly ? 1 : 0);
+  Network::GetInstance()->SendActionToAll(a);
 
-  ActiveTeam().crosshair.Hide();
+  StartMovingLeft(slowly);
 
-  if (IsImmobile())
-    MoveLeft(slowly);
+  HideGameInterface();
+  ActiveTeam().crosshair.Hide();
 }
 
-void Character::HandleKeyReleased_MoveLeft(bool /*slowly*/)
+void Character::HandleKeyReleased_MoveLeft(bool slowly)
 {
-  body->StopWalk();
+  Action a(Action::ACTION_CHARACTER_STOP_MOVING_LEFT);
+  a.Push(slowly ? 1 : 0);
+  Network::GetInstance()->SendActionToAll(a);
+
+  StopMovingLeft(slowly);
 
   ActiveTeam().crosshair.Show();
 }
@@ -1064,5 +1134,3 @@ void Character::HandleKeyPressed_BackJump()
   }
 }
 
-
-
diff --git a/src/character/character.h b/src/character/character.h
index 9e7a0ea..0fe5daa 100644
--- a/src/character/character.h
+++ b/src/character/character.h
@@ -83,6 +83,10 @@ private:
   // this is needed because of network needing to know
   // if we have changed of active character
   bool is_playing;
+  bool move_left_pressed;
+  bool move_left_slowly_pressed;
+  bool move_right_pressed;
+  bool move_right_slowly_pressed;
 public:
 
   // Previous strength
@@ -108,7 +112,7 @@ private:
   void StartWalk(bool slowly);
   void StopWalk();
   bool IsWalking() const;
-
+  void StopWalkingIfNecessary();
 public:
 
   Character (Team& my_team, const std::string &name, Body *char_body);
@@ -177,6 +181,11 @@ public:
   void MoveRight(bool slowly);
   void MoveLeft(bool slowly);
 
+  void StartMovingLeft(bool slowly);
+  void StopMovingLeft(bool slowly);
+  void StartMovingRight(bool slowly);
+  void StopMovingRight(bool slowly);
+
   // Jumps
   void Jump(double strength, double angle);
   void Jump();
@@ -220,11 +229,11 @@ public:
 
   // Keyboard handling
   void HandleKeyPressed_MoveRight(bool slowly);
-  void HandleKeyRefreshed_MoveRight(bool slowly);
+  void HandleKeyRefreshed_MoveRight(bool /*slowly*/) {};
   void HandleKeyReleased_MoveRight(bool slowly);
 
   void HandleKeyPressed_MoveLeft(bool slowly);
-  void HandleKeyRefreshed_MoveLeft(bool slowly);
+  void HandleKeyRefreshed_MoveLeft(bool /*slowly*/) {};
   void HandleKeyReleased_MoveLeft(bool slowly);
 
   void HandleKeyPressed_Up(bool slowly) { HandleKeyRefreshed_Up(slowly); };
diff --git a/src/include/action_handler.cpp b/src/include/action_handler.cpp
index b802d5b..2653c42 100644
--- a/src/include/action_handler.cpp
+++ b/src/include/action_handler.cpp
@@ -575,6 +575,34 @@ static void Action_Character_BackJump (Action */*a*/)
   ActiveCharacter().BackJump();
 }
 
+static void Action_Character_StartMovingLeft(Action *a)
+{
+  ASSERT(!Network::GetInstance()->IsTurnMaster());
+  bool slowly = a->PopInt();
+  ActiveCharacter().StartMovingLeft(slowly);
+}
+
+static void Action_Character_StopMovingLeft(Action *a)
+{
+  ASSERT(!Network::GetInstance()->IsTurnMaster());
+  bool slowly = a->PopInt();
+  ActiveCharacter().StopMovingLeft(slowly);
+}
+
+static void Action_Character_StartMovingRight(Action *a)
+{
+  ASSERT(!Network::GetInstance()->IsTurnMaster());
+  bool slowly = a->PopInt();
+  ActiveCharacter().StartMovingRight(slowly);
+}
+
+static void Action_Character_StopMovingRight(Action *a)
+{
+  ASSERT(!Network::GetInstance()->IsTurnMaster());
+  bool slowly = a->PopInt();
+  ActiveCharacter().StopMovingRight(slowly);
+}
+
 static void Action_Weapon_Shoot (Action *a)
 {
   if (Game::GetInstance()->ReadState() != Game::PLAYING)
@@ -926,6 +954,11 @@ void Action_Handler_Init()
   ActionHandler::GetInstance()->Register (Action::ACTION_CHARACTER_JUMP, 
"CHARACTER_jump", &Action_Character_Jump);
   ActionHandler::GetInstance()->Register (Action::ACTION_CHARACTER_HIGH_JUMP, 
"CHARACTER_super_jump", &Action_Character_HighJump);
   ActionHandler::GetInstance()->Register (Action::ACTION_CHARACTER_BACK_JUMP, 
"CHARACTER_back_jump", &Action_Character_BackJump);
+ ActionHandler::GetInstance()->Register 
(Action::ACTION_CHARACTER_START_MOVING_LEFT, "CHARACTER_start_moving_left", 
&Action_Character_StartMovingLeft);
+ ActionHandler::GetInstance()->Register 
(Action::ACTION_CHARACTER_STOP_MOVING_LEFT, "CHARACTER_stop_moving_left", 
&Action_Character_StopMovingLeft);
+ ActionHandler::GetInstance()->Register 
(Action::ACTION_CHARACTER_START_MOVING_RIGHT, "CHARACTER_start_moving_right", 
&Action_Character_StartMovingRight);
+ ActionHandler::GetInstance()->Register 
(Action::ACTION_CHARACTER_STOP_MOVING_RIGHT, "CHARACTER_stop_moving_right", 
&Action_Character_StopMovingRight);
+
   // ########################################################
   // Using Weapon
   ActionHandler::GetInstance()->Register (Action::ACTION_WEAPON_SHOOT, 
"WEAPON_shoot", &Action_Weapon_Shoot);
-- 
1.6.0.4


_______________________________________________
Wormux-dev mailing list
Wormux-dev@gna.org
https://mail.gna.org/listinfo/wormux-dev

Répondre à