fix movement physics+network code to some degree, jumping is now buggy?
authorterom
Mon, 24 Nov 2008 17:14:29 +0000
changeset 96 4a801210096c
parent 95 10704e1df844
child 97 2e7c8ab485de
fix movement physics+network code to some degree, jumping is now buggy?
src/proto2/GameState.cc
src/proto2/GameState.hh
src/proto2/Graphics.cc
src/proto2/Input.hh
src/proto2/Network.hh
src/proto2/NetworkClient.cc
src/proto2/NetworkClient.hh
src/proto2/NetworkServer.cc
src/proto2/Physics.cc
src/proto2/Physics.hh
--- a/src/proto2/GameState.cc	Mon Nov 24 15:18:55 2008 +0000
+++ b/src/proto2/GameState.cc	Mon Nov 24 17:14:29 2008 +0000
@@ -2,35 +2,31 @@
 #include "GameState.hh"
 #include "Engine.hh"
 
-void LocalPlayer::handleMove (PlayerInput_Move input) {
-    float fx = 0, fy = 0;
+void Player::handleMove (PlayerInput_Move input) {
+    float fx = 0;
 
-    // handle up/down/left/right
-    if (input & INPUT_MOVE_UP)
-            fy -= PLAYER_MOVE_FORCE;
-    
-    if (input & INPUT_MOVE_DOWN)
-            fy += PLAYER_MOVE_FORCE;
-
+    // handle left/right
     if (input & INPUT_MOVE_LEFT)
             fx -= PLAYER_MOVE_FORCE;
 
     if (input & INPUT_MOVE_RIGHT)
             fx += PLAYER_MOVE_FORCE;
+    
+    // we behave differently depending on if we're in the air or on the ground
+    if (inAir) {
+        // apply horizontal force
+        if (fx)
+            applyForce(Vector(fx, 0), INPUT_INTERVAL_MS);
 
-	// If the player if on the ground make it crawl, jump or dig 
-	if(!inAir) {
-     	if(fy == 0)
-			this->position = moveVertically(fx > 0);
-		else
-			jump();
-	} else {
-
-    	if(fx) {
-        	// apply force
-        	applyForce(Vector(fx, 0), INPUT_INTERVAL_MS);
-    	}
-	}
+    } else {
+        // walk right
+        if (fx)
+            this->position = walk(fx > 0);
+        
+        // jump?
+        if (input & INPUT_MOVE_JUMP)
+            jump();    
+    }
 }
 
 void Player::debugInfo (void) {
--- a/src/proto2/GameState.hh	Mon Nov 24 15:18:55 2008 +0000
+++ b/src/proto2/GameState.hh	Mon Nov 24 17:14:29 2008 +0000
@@ -38,14 +38,14 @@
 		}
 
 		void debugInfo ();
+    
+    public:
+        virtual void handleMove (PlayerInput_Move input);
 };
 
 class LocalPlayer : public Player {
     protected:
         LocalPlayer (GameState &state, Vector pos, bool visible) : Player(state, pos, visible) { }
-    
-    public:
-        virtual void handleMove (PlayerInput_Move input);
 };
 
 class RemotePlayer : public Player {
--- a/src/proto2/Graphics.cc	Mon Nov 24 15:18:55 2008 +0000
+++ b/src/proto2/Graphics.cc	Mon Nov 24 17:14:29 2008 +0000
@@ -53,19 +53,16 @@
     if ((player = state.getLocalPlayer()) == NULL)
         return;
     
-    // handle up/down/left/right
-    if (keyboard.get_keycode(CL_KEY_UP))
-            input_move |= INPUT_MOVE_UP;
-
-    if (keyboard.get_keycode(CL_KEY_DOWN))
-            input_move |= INPUT_MOVE_DOWN;
-
+    // handle movement
     if (keyboard.get_keycode(CL_KEY_LEFT))
             input_move |= INPUT_MOVE_LEFT;
 
     if (keyboard.get_keycode(CL_KEY_RIGHT))
             input_move |= INPUT_MOVE_RIGHT;
 
+    if (keyboard.get_keycode(CL_KEY_RSHIFT))
+            input_move |= INPUT_MOVE_JUMP;
+
 	if (keyboard.get_keycode(CL_KEY_I))
 		player->debugInfo();
     
--- a/src/proto2/Input.hh	Mon Nov 24 15:18:55 2008 +0000
+++ b/src/proto2/Input.hh	Mon Nov 24 17:14:29 2008 +0000
@@ -4,10 +4,14 @@
 const uint16_t INPUT_INTERVAL_MS = 20;
 
 enum {
-    INPUT_MOVE_UP     = 0x01,
-    INPUT_MOVE_DOWN   = 0x02,
-    INPUT_MOVE_LEFT   = 0x04,
-    INPUT_MOVE_RIGHT  = 0x08,
+    // XXX: aiming is not movement?
+    INPUT_MOVE_UP       = 0x0001,
+    INPUT_MOVE_DOWN     = 0x0002,
+
+    INPUT_MOVE_LEFT     = 0x0004,
+    INPUT_MOVE_RIGHT    = 0x0008,
+
+    INPUT_MOVE_JUMP     = 0x0010,
 };
 
 typedef uint16_t PlayerInput_Move;
--- a/src/proto2/Network.hh	Mon Nov 24 15:18:55 2008 +0000
+++ b/src/proto2/Network.hh	Mon Nov 24 17:14:29 2008 +0000
@@ -55,8 +55,7 @@
     /*
      * Client has moved
      *
-     *  Vector      impulse_force
-     *  uint16_t    impulse_ms
+     *  uint16_t    PlayerInput_Move
      */
     NETMSG_CLIENT_MOVE  = 0x0201,
     
--- a/src/proto2/NetworkClient.cc	Mon Nov 24 15:18:55 2008 +0000
+++ b/src/proto2/NetworkClient.cc	Mon Nov 24 17:14:29 2008 +0000
@@ -92,11 +92,10 @@
     slots.connect(obj->sig_message(NETMSG_PLAYER_POSITION), this, &NetworkClientLocalPlayer::on_position);
 }
         
-void NetworkClientLocalPlayer::applyForce (Vector force, uint16_t dt) {
+void NetworkClientLocalPlayer::handleMove (PlayerInput_Move input) {
     // always send move, in all cases
     NetworkPacket pkt;
-    pkt.write_vector(force);
-    pkt.write_uint16(dt);
+    pkt.write_uint16(input);
 
     obj->send(NETMSG_CLIENT_MOVE, pkt, false);
     
--- a/src/proto2/NetworkClient.hh	Mon Nov 24 15:18:55 2008 +0000
+++ b/src/proto2/NetworkClient.hh	Mon Nov 24 17:14:29 2008 +0000
@@ -45,7 +45,7 @@
     public:
         NetworkClientLocalPlayer (NetworkClient &client, NetworkObject_Client *obj, Vector position);
         
-        virtual void applyForce (Vector force, uint16_t dt);
+        virtual void handleMove (PlayerInput_Move input);
     
     private:
         void on_position (NetworkPacket &pkt);
--- a/src/proto2/NetworkServer.cc	Mon Nov 24 15:18:55 2008 +0000
+++ b/src/proto2/NetworkServer.cc	Mon Nov 24 17:14:29 2008 +0000
@@ -84,17 +84,18 @@
 }
 
 void NetworkServerPlayer::on_move (NetworkNode *src, NetworkPacket &pkt) {
-    // sanity-check
-    if (src != node)
+    // sanity-check, other players shouldn't move
+    if (src != node) {
+        Engine::log(WARN, "server_player.on_move") << "packet from wrong src=" << src << ", node=" << node;
         return;
+    }
     
-    Vector impulse_force = pkt.read_vector();
-    uint16_t impulse_ms = pkt.read_uint16();
+    PlayerInput_Move input = pkt.read_uint16();
 
-    Engine::log(INFO, "server_player.on_move") << "player=" << obj << ", old_pos=" << position << ", impulse=" << impulse_force << "@" << impulse_ms << "ms";
+    Engine::log(INFO, "server_player.on_move") << "player=" << obj << ", old_pos=" << position << ", input=" << input;
     
-    // apply force
-    applyForce(impulse_force, impulse_ms);
+    // apply input
+    handleMove(input);  
 
     // send position update
     send_position_update();
--- a/src/proto2/Physics.cc	Mon Nov 24 15:18:55 2008 +0000
+++ b/src/proto2/Physics.cc	Mon Nov 24 17:14:29 2008 +0000
@@ -41,7 +41,7 @@
  * Make the worm walk on the ground.
  * @return Final position.
  */
-Vector PhysicsObject::moveVertically (bool right) {
+Vector PhysicsObject::walk (bool right) {
 	Vector cursor = right ? this->position + Vector(1,0) : this->position + Vector(-1,0);
 	Vector reached = this->position;
 
@@ -101,8 +101,8 @@
 }
 
 void PhysicsObject::jump () {
- 	this->velocity.y = -100;
-	this->inAir = true;
+ 	velocity.y = -100;
+	inAir = true;
 }
 
 bool PhysicsObject::possibleLocation (Vector loc) {
@@ -332,7 +332,8 @@
  * @param dt The time the force is applied.
  */
 void PhysicsObject::applyForce (Force force, TimeMS dt) {
-
+    // XXX: dt is not used? Is it assumed to be the same as the integrate() dt?
+    
     // Add applied force to the queue
     forceq.push(force);
 	this->inAir = true;
--- a/src/proto2/Physics.hh	Mon Nov 24 15:18:55 2008 +0000
+++ b/src/proto2/Physics.hh	Mon Nov 24 17:14:29 2008 +0000
@@ -77,11 +77,28 @@
 	 */
     PhysicsObject (PhysicsWorld &world, float mass, Vector position, Vector velocity);
     
+    /**
+     * Used to handle in-air movement
+     */    
     virtual void applyForce (Force force, TimeMS dt);
+
+    /**
+     * Called on network clients to sync state from server
+     */
     void updatePhysics (Vector position, Vector velocity);
-	Vector moveVertically (bool right);
+
+    /**
+     * Handle ground movement
+     *
+     * @return new position
+     */
+	Vector walk (bool right);
+
+    /**
+     * Handle ground-jumping
+     */
 	void jump (void);
-    
+
 private:
     void updatePosition (void);
 	bool possibleLocation (Vector loc);