src/PhysicsObject.hh
author terom
Mon, 08 Dec 2008 01:38:43 +0000
changeset 279 e36f5e1a1c8d
parent 273 eeb699e1d908
child 282 e0e4dfc3e528
permissions -rw-r--r--
let projectiles bounce, the new BounceBounce weapon puts the Physics engine into an infinite loop
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     1
#ifndef PHYSICS_OBJECT_HH
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     2
#define PHYSICS_OBJECT_HH
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     3
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     4
#include <ClanLib/display.h>
273
eeb699e1d908 Made forceq to contain time again.
saiam
parents: 272
diff changeset
     5
#include <utility>
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     6
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     7
// Forward declares
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     8
class PhysicsObject;
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     9
struct Derivative;
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    10
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    11
#include "PhysicsWorld.hh"
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    12
#include "Vector.hh"
205
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents: 200
diff changeset
    13
#include "Timer.hh"
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    14
#include "Config.hh"
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    15
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    16
// Type definitions
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    17
typedef Vector Force;
265
d97bf6790c22 PhysicsObject enum
ekku
parents: 264
diff changeset
    18
    
d97bf6790c22 PhysicsObject enum
ekku
parents: 264
diff changeset
    19
enum ObjectType { PLAYER, PROJECTILE, ROPE };
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    20
264
215de3d4de60 change facingRight from a bool to an
terom
parents: 257
diff changeset
    21
enum FacingDirection {
215de3d4de60 change facingRight from a bool to an
terom
parents: 257
diff changeset
    22
    FACING_LEFT,
215de3d4de60 change facingRight from a bool to an
terom
parents: 257
diff changeset
    23
    FACING_RIGHT
215de3d4de60 change facingRight from a bool to an
terom
parents: 257
diff changeset
    24
};
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    25
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    26
/**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    27
 * PhysicObject class. A basic PhysicsObject class.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    28
 */
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    29
class PhysicsObject {
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    30
protected:
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    31
    Vector position;
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    32
    Vector velocity;
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    33
    float mass;
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    34
    bool inAir; // Is the object "on the ground"
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    35
    float collision_elasticity;
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    36
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    37
    // Attributes for players
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    38
    float aim; // Aim direction (half circle)
264
215de3d4de60 change facingRight from a bool to an
terom
parents: 257
diff changeset
    39
    FacingDirection facing; // Player facing
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    40
222
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
    41
    bool alive;
225
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
    42
    bool shouldDelete;
265
d97bf6790c22 PhysicsObject enum
ekku
parents: 264
diff changeset
    43
    
d97bf6790c22 PhysicsObject enum
ekku
parents: 264
diff changeset
    44
    ObjectType type;
222
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
    45
228
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
    46
    PhysicsObject *pivot;
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
    47
279
e36f5e1a1c8d let projectiles bounce, the new BounceBounce weapon puts the Physics engine into an infinite loop
terom
parents: 273
diff changeset
    48
    PhysicsObject (PhysicsWorld &world, float mass, Vector position, Vector velocity, ObjectType type, 
e36f5e1a1c8d let projectiles bounce, the new BounceBounce weapon puts the Physics engine into an infinite loop
terom
parents: 273
diff changeset
    49
            float collision_elasticity, bool enabled = true);
222
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
    50
    virtual ~PhysicsObject (void);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    51
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    52
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    53
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    54
     * Add force to the force queue to be applied on next tick.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    55
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    56
     * @param force Force vector
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    57
     */
273
eeb699e1d908 Made forceq to contain time again.
saiam
parents: 272
diff changeset
    58
    void applyForce(Force force, TimeMS dt = PHYSICS_TICK_MS);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    59
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    60
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    61
     * Change player aim
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    62
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    63
     * @param da Aim angle change
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    64
     */
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    65
    void changeAim(float da);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    66
   
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    67
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    68
     * Set player facing.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    69
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    70
     * @param facingRight True if player is facing right.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    71
     */
264
215de3d4de60 change facingRight from a bool to an
terom
parents: 257
diff changeset
    72
    void setFacing (FacingDirection facing);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    73
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    74
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    75
     * Makes the player jump in the air.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    76
     * @param direction -1: jump left, 0: jump up, 1: jump right
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    77
     */
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    78
    void jump(int direction);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    79
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    80
    /** 
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    81
     * Handle ground-bounce
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    82
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    83
     * @param normal Normal vector relative to which to bounce
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    84
     */
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    85
    void bounce(Vector normal);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    86
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    87
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    88
     * Called on network clients to sync state from server
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    89
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    90
     * @param position New position
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    91
     * @param velocity New velocity
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    92
     * @param inAir New inAir value
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 197
diff changeset
    93
     * @param facingRight New facingRight value
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 197
diff changeset
    94
     * @param aim New aim
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    95
     */
264
215de3d4de60 change facingRight from a bool to an
terom
parents: 257
diff changeset
    96
    virtual void updatePhysics(Vector position, Vector velocity, bool inAir, FacingDirection facing, float aim);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    97
225
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
    98
    /**
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
    99
     * Put object to the objects list so that its movement will be calculated.
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   100
     */
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   101
    void enable (void);
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   102
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   103
    /**
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   104
     * Remove object from the objects list but don't delete the object itself.
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   105
     */
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   106
    void disable (void);
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   107
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   108
private:
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   109
    // Shape of the object. Edge points of the shape polygon.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   110
    std::vector<Vector> shape;
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   111
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   112
    // Force queue that is emptied on every tick
273
eeb699e1d908 Made forceq to contain time again.
saiam
parents: 272
diff changeset
   113
    std::queue<std::pair<Force, TimeMS> > forceq;
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   114
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   115
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   116
     * Handle player movement and apply forces.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   117
     */
205
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents: 200
diff changeset
   118
    void updatePosition(TimeMS dt);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   119
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   120
    // TODO: Should these be moved to PhysicsWorld?
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   121
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   122
     * Use RK4 to integrate the effects of force over a time interwall.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   123
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   124
     * @param force Force to integrate
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   125
     * @param dt Time intervall
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   126
     */
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   127
    void integrate(Force force, TimeMS dt, Vector &posAfterTick, Vector &velAfterTick);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   128
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   129
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   130
     * Evaluate the value of the derivative at given time
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   131
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   132
     * @param force Force
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   133
     * @param dt Time
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   134
     * @param d Previous derivative
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   135
     */
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   136
    Derivative evaluate(Force force, TimeMS dt, Derivative &d, const Vector &posAfterTick, const Vector &velAfterTick);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   137
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   138
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   139
     * Return object acceleration with given force.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   140
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   141
     * @param force Force
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   142
     * @return Acceleration
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   143
     */
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   144
    Vector acceleration(const Force &force);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   145
249
5647f58e37cd Removed some unnecessary TODOs
saiam
parents: 235
diff changeset
   146
     /**
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   147
     * Handle ground movement.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   148
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   149
     * @param right Boolean describing the movement direction.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   150
     * @return New position
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   151
     */
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   152
    void walk(TimeMS, bool right);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   153
    Vector walk_one_step(float, bool);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   154
249
5647f58e37cd Removed some unnecessary TODOs
saiam
parents: 235
diff changeset
   155
    /**
5647f58e37cd Removed some unnecessary TODOs
saiam
parents: 235
diff changeset
   156
     * Define object behaviour on collisions.
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   157
     */
272
97de051edbcf Added PhysicsObject* attribute to onCollision
saiam
parents: 268
diff changeset
   158
    virtual void onCollision (Vector collisionPoint, PhysicsObject *other) {}
97de051edbcf Added PhysicsObject* attribute to onCollision
saiam
parents: 268
diff changeset
   159
97de051edbcf Added PhysicsObject* attribute to onCollision
saiam
parents: 268
diff changeset
   160
public:
97de051edbcf Added PhysicsObject* attribute to onCollision
saiam
parents: 268
diff changeset
   161
    PhysicsWorld &world;
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   162
249
5647f58e37cd Removed some unnecessary TODOs
saiam
parents: 235
diff changeset
   163
    /**
5647f58e37cd Removed some unnecessary TODOs
saiam
parents: 235
diff changeset
   164
     * Checks if it is possible for the object to be in the given
5647f58e37cd Removed some unnecessary TODOs
saiam
parents: 235
diff changeset
   165
     * location.
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   166
     */
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   167
    bool possibleLocation(Vector loc);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   168
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   169
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   170
     * Get current object position.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   171
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   172
     * @return Position vector
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   173
     */
257
549783d71e51 add a handful of consts to PhysicsObject and modify draw to use getCoordinate, and replace old skin.png with new skin.png
terom
parents: 255
diff changeset
   174
    Vector getPosition (void) const;
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 252
diff changeset
   175
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 252
diff changeset
   176
    /**
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 252
diff changeset
   177
     * Get current object screen coordinates
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 252
diff changeset
   178
     *
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 252
diff changeset
   179
     * @return PixelCoordinate position
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 252
diff changeset
   180
     */
257
549783d71e51 add a handful of consts to PhysicsObject and modify draw to use getCoordinate, and replace old skin.png with new skin.png
terom
parents: 255
diff changeset
   181
    PixelCoordinate getCoordinate (void) const;
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   182
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   183
    /**
222
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   184
     * Get current object velocity.
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   185
     *
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   186
     * @return Velocity vector
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   187
     */
257
549783d71e51 add a handful of consts to PhysicsObject and modify draw to use getCoordinate, and replace old skin.png with new skin.png
terom
parents: 255
diff changeset
   188
    Vector getVelocity() const;
222
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   189
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   190
    /**
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   191
     * Return object shape.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   192
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   193
     * @return Polygon points
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   194
     */
257
549783d71e51 add a handful of consts to PhysicsObject and modify draw to use getCoordinate, and replace old skin.png with new skin.png
terom
parents: 255
diff changeset
   195
    const std::vector<Vector>& getShape() const;
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   196
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   197
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   198
     * Set object shape.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   199
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   200
     * @param shape Vector containing polygon poinst
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   201
     */
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   202
    void setShape(std::vector<Vector> shape);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   203
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   204
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   205
     * Return object facing.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   206
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   207
     * @return Object facing (true if facing right)
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   208
     */
264
215de3d4de60 change facingRight from a bool to an
terom
parents: 257
diff changeset
   209
    FacingDirection getFacing() const;
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   210
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   211
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   212
     * Return object aim angle.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   213
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   214
     * @return Object aim angle
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   215
     */
257
549783d71e51 add a handful of consts to PhysicsObject and modify draw to use getCoordinate, and replace old skin.png with new skin.png
terom
parents: 255
diff changeset
   216
    float getAim() const;
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   217
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   218
    /**
235
0a0c729365ee code cleanup
terom
parents: 228
diff changeset
   219
     * Returns facing+aim as a unit vector
0a0c729365ee code cleanup
terom
parents: 228
diff changeset
   220
     */
257
549783d71e51 add a handful of consts to PhysicsObject and modify draw to use getCoordinate, and replace old skin.png with new skin.png
terom
parents: 255
diff changeset
   221
    Vector getDirection (void) const;
235
0a0c729365ee code cleanup
terom
parents: 228
diff changeset
   222
0a0c729365ee code cleanup
terom
parents: 228
diff changeset
   223
    /**
222
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   224
     *  Mark object as destroyed, it will be delete'd later
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   225
     */
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   226
    void destroy (void);
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   227
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   228
    /*
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   229
     * Had the object been destroyed?
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   230
     */
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   231
    bool isDestroyed (void);
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   232
    
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   233
    /**
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   234
     * Delete ourselves if we've been destroyed and return true, else return false
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   235
     */
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   236
    bool removeIfDestroyed (void);
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   237
293ddf4c067d reorganize PhysicsObject/Player/Projectile lists so that PhysicsObject doesn't need to know about its subclasses anymore, and PhysicsWorld doesn't need to know about GameState
ekku
parents: 221
diff changeset
   238
    /**
228
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   239
     * Sets this object's pivot to the given value, which will then exert a force on this object
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   240
     */
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   241
    void setPivot (PhysicsObject *pivot);
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   242
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   243
    /**
268
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   244
     * Checks if object collides with other objects
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   245
     *
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   246
     * @param obj Other PhysicsObject
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   247
     */
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   248
    bool collides (const PhysicsObject &obj);
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   249
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   250
    /**
228
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   251
     * Compute the force that this object (as a pivot) exerts on the given object
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   252
     */
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   253
    virtual float getPivotForce (PhysicsObject *bob);
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   254
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   255
    /**
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   256
     * Update object in physics simulation.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   257
     */
221
fbc5db6fce45 reorganize the weapons code and input handling code
terom
parents: 209
diff changeset
   258
    virtual void tick (TimeMS tick_length);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   259
};
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   260
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   261
struct Derivative {
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   262
    Vector dx; // Velocity
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   263
    Vector dv; // Acceleration
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   264
};
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   265
268
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   266
/**
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   267
 * Returns the "sign" of the cross product between given points. In
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   268
 * practice the sign of the return value tels on which side of the
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   269
 * line drawn between p1 and p2 the point p3 is.
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   270
 *
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   271
 * @param p1 Line start point
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   272
 * @param p2 Line end point
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   273
 * @param p3 Point
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   274
 * @return Variable, the sign of which tells on which side of the line p3 is.
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   275
 */
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   276
int8_t crossProduct(const Vector &p1, const Vector &p2, const Vector &p3);
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   277
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   278
#endif