# HG changeset patch # User ekku # Date 1228775847 0 # Node ID f94a5c1920973db8b565a47d71746626cfc60ff3 # Parent 69ed10f20a9ea795c452c0049909539d8b5484ee Rope fixing diff -r 69ed10f20a9e -r f94a5c192097 src/PhysicsObject.cc --- a/src/PhysicsObject.cc Mon Dec 08 22:34:28 2008 +0000 +++ b/src/PhysicsObject.cc Mon Dec 08 22:37:27 2008 +0000 @@ -130,13 +130,7 @@ // If the object (practically player) has a pivot point add // a force towards that if (pivot != NULL) { - Vector direction(pivot->getPosition()-position); - float magnitude = pivot->getPivotForce(this); - float length = direction.length(); - if (length > 0) { - direction = direction / length * magnitude; - applyForce(direction); - } + applyForce(getPivotForce()); } std::pair force; @@ -381,6 +375,10 @@ this->shape = shape; } +PhysicsObject *PhysicsObject::getPivot (void) { + return this->pivot; +} + void PhysicsObject::setPivot (PhysicsObject *pivot) { this->pivot = pivot; } @@ -428,10 +426,8 @@ } } -float PhysicsObject::getPivotForce (PhysicsObject *bob) { - (void) bob; - - return 0.0; +Vector PhysicsObject::getPivotForce (void) { + return Vector(0,0); } bool PhysicsObject::collides (const PhysicsObject &obj) { diff -r 69ed10f20a9e -r f94a5c192097 src/PhysicsObject.hh --- a/src/PhysicsObject.hh Mon Dec 08 22:34:28 2008 +0000 +++ b/src/PhysicsObject.hh Mon Dec 08 22:37:27 2008 +0000 @@ -314,6 +314,11 @@ void setPivot (PhysicsObject *pivot); /** + * Return the pivot object pointer. + */ + PhysicsObject *getPivot (void); + + /** * Checks if object collides with other objects * * @param obj Other PhysicsObject @@ -327,7 +332,7 @@ * @param bob Othe object * @return Force */ - virtual float getPivotForce (PhysicsObject *bob); + virtual Vector getPivotForce (void); /** * Update object in physics simulation. diff -r 69ed10f20a9e -r f94a5c192097 src/Player.cc --- a/src/Player.cc Mon Dec 08 22:34:28 2008 +0000 +++ b/src/Player.cc Mon Dec 08 22:37:27 2008 +0000 @@ -293,6 +293,15 @@ } } +Vector Player::getPivotForce () { + Vector direction = this->pivot->getPosition() - this->getPosition(); + float dirLength = direction.length(); + if (dirLength >= this->rope.getLength()) + return direction / dirLength * ROPE_FORCE; + else + return Vector(0,0); +} + void Player::takeDamage (Projectile *source) { health -= source->getDamage(); diff -r 69ed10f20a9e -r f94a5c192097 src/Player.hh --- a/src/Player.hh Mon Dec 08 22:34:28 2008 +0000 +++ b/src/Player.hh Mon Dec 08 22:37:27 2008 +0000 @@ -136,6 +136,11 @@ void takeDamage (Projectile *source); /** + * If the player has a pivot calculate the force it causes. + */ + Vector getPivotForce (void); + + /** * Gives player's health in percents from maximum */ float getHealthPercent() const; diff -r 69ed10f20a9e -r f94a5c192097 src/Rope.cc --- a/src/Rope.cc Mon Dec 08 22:34:28 2008 +0000 +++ b/src/Rope.cc Mon Dec 08 22:37:27 2008 +0000 @@ -8,7 +8,6 @@ Rope::Rope(Player &player) : PhysicsObject(player.state.world, ROPE_MASS, Vector(0,0), Vector(0,0), ROPE, 0.00, false), player(player), - pivotObject(NULL), state(ROPE_FOLDED) { // XXX: better shape @@ -41,15 +40,18 @@ } void Rope::onCollision (Vector collisionPoint, PhysicsObject *other) { + // Fix the rope to another player if collided with it if (other != NULL) { if (other->getType() == PLAYER) { Player *target = dynamic_cast(other); if (target == &(this->player)) return; - pivotObject = target; + this->player.pivot = target; } else if (other->getType() == PROJECTILE) { return; } + } else { // Collided with terrain + player.setPivot(this); } // attached to something! @@ -59,9 +61,6 @@ // Ropes location will be used as the pivot point, so move the location to the collisionPoint. // Currently the position is something like one pixel away from the collisionPoint where there isn't ground. setPosition (collisionPoint); - - // set player's pivot - player.setPivot(this); // inform network player.handleRopeState(state); @@ -128,13 +127,6 @@ this->length = length; } -float Rope::getPivotForce (PhysicsObject *bob) { - if ((position - bob->getPosition()).length() >= length) - return ROPE_FORCE; - else - return 0; -} - void Rope::draw (Graphics *g, PixelCoordinate camera) { if (state == ROPE_FOLDED) return; @@ -155,9 +147,20 @@ PhysicsObject::tick(dt); } else if (this->state == ROPE_FIXED) { + + this->position = player.getPivot()->getPosition(); + + // If players pivot is not this rope but some other player don't do anything + // (though it should be released atleast when the player dies) + if (player.getPivot() != this) + return; + // If there's not ground on the pivot point anymore, release the rope if (!world.collides(position)) { - this->state = ROPE_FLYING; + state = ROPE_FLYING; + length = ROPE_LENGTH; + inAir = true; + player.setPivot(NULL); player.handleRopeState(state); } } diff -r 69ed10f20a9e -r f94a5c192097 src/Rope.hh --- a/src/Rope.hh Mon Dec 08 22:34:28 2008 +0000 +++ b/src/Rope.hh Mon Dec 08 22:37:27 2008 +0000 @@ -29,15 +29,12 @@ // the owner Player &player; - // possible pivot point (rope is stuck on a player) - PhysicsObject *pivotObject; - // How long is the rope in its unstrected state float length; // basic state RopeState state; - + protected: /** * Attach the rope, so disable the PhysicsObject and change state @@ -45,11 +42,6 @@ */ virtual void onCollision (Vector collisionPoint, PhysicsObject *other); - /* - * If the rope is currently longer than length, this returns ROPE_FORCE, else 0 - */ - virtual float getPivotForce (PhysicsObject *bob); - public: Rope(Player &player);