src/Rope.hh
author terom
Mon, 08 Dec 2008 12:46:37 +0000
changeset 283 7540b0859579
parent 273 eeb699e1d908
child 305 56799ec8d7be
permissions -rw-r--r--
start adding some documentation, most core classes (outside of Network) are now doxygen-enabled
#ifndef ROPE_HH
#define ROPE_HH

// Pre-declarations since rope wants to know the Player
// and the Player wants to know the rope.
class Rope;

#include "Player.hh"
#include "PhysicsObject.hh"
#include "GraphicsPointer.hh"

/**
 * The rope can be in one of three states...
 *
 * @see Rope
 */
enum RopeState {
    ROPE_FOLDED,    //<<< The rope is folded, out of sight, and not in use
    ROPE_FLYING,    //<<< The rope is flying through the air as a projectile
    ROPE_FIXED      //<<< The rope is attached to something
};

/**
 * A rope is a PhysicsObject that can be thrown, whereupon it then flies until it hits something, whereupon
 * it attaches to that, and sets itself as the player's pivot.
 */
class Rope : public PhysicsObject {
private:
    // the owner
    Player &player;

    // 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
     * @param collisionPoint Where the rope has hit the ground.
     */
    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);
        
    /*
     * Throw the rope, so it flies up and away: o._-*
     */
    void throwRope (void);

    /*
     * Release the rope, so if it's currently fixed or flying, then fold it 
     */
    void release (void);

    /*
     * Climb up/down the rope
     */
    void changeLength (float delta);
        
    /*
     * Current state
     */
    RopeState getState (void);

    /*
     * Current length
     */
    float getLength (void);

    /*
     * For use by NetworkClient
     */
    void updateState (RopeState state, Vector position, Vector velocity, float length);
    void updateLength (float length);
        
    virtual void tick (TimeMS dt);

    /*
     * Just draws it
     */ 
    virtual void draw (Graphics *c, PixelCoordinate camera);
};

#endif