src/PhysicsObject.hh
author terom
Mon, 08 Dec 2008 21:18:08 +0000
changeset 311 440763821484
parent 299 e4dacf550ba1
child 317 f325fad21f4f
permissions -rw-r--r--
make Input have its own timer, and add key-repeat handling, and fix some warnings
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 {
282
e0e4dfc3e528 compiles cleanly with -Wall -Wextra -Wconversion, not tested, but that shouldn't break anything :)
terom
parents: 279
diff changeset
    30
public:
e0e4dfc3e528 compiles cleanly with -Wall -Wextra -Wconversion, not tested, but that shouldn't break anything :)
terom
parents: 279
diff changeset
    31
    PhysicsWorld &world;
e0e4dfc3e528 compiles cleanly with -Wall -Wextra -Wconversion, not tested, but that shouldn't break anything :)
terom
parents: 279
diff changeset
    32
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    33
protected:
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    34
    Vector position;
285
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
    35
    Vector previousPosition;
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    36
    Vector velocity;
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    37
    float mass;
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    38
    bool inAir; // Is the object "on the ground"
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    39
    float collision_elasticity;
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    40
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    41
    // Attributes for players
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    42
    float aim; // Aim direction (half circle)
264
215de3d4de60 change facingRight from a bool to an
terom
parents: 257
diff changeset
    43
    FacingDirection facing; // Player facing
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    44
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
    bool alive;
225
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
    46
    bool shouldDelete;
265
d97bf6790c22 PhysicsObject enum
ekku
parents: 264
diff changeset
    47
    
d97bf6790c22 PhysicsObject enum
ekku
parents: 264
diff changeset
    48
    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
    49
228
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
    50
    PhysicsObject *pivot;
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
    51
279
e36f5e1a1c8d let projectiles bounce, the new BounceBounce weapon puts the Physics engine into an infinite loop
terom
parents: 273
diff changeset
    52
    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
    53
            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
    54
    virtual ~PhysicsObject (void);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    55
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    56
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    57
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    58
     * Add force to the force queue to be applied on next tick.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    59
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    60
     * @param force Force vector
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    61
     */
273
eeb699e1d908 Made forceq to contain time again.
saiam
parents: 272
diff changeset
    62
    void applyForce(Force force, TimeMS dt = PHYSICS_TICK_MS);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    63
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    64
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    65
     * Change player aim
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    66
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    67
     * @param da Aim angle change
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    68
     */
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    69
    void changeAim(float da);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    70
   
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    71
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    72
     * Set player facing.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    73
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    74
     * @param facingRight True if player is facing right.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    75
     */
264
215de3d4de60 change facingRight from a bool to an
terom
parents: 257
diff changeset
    76
    void setFacing (FacingDirection facing);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    77
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    78
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    79
     * Makes the player jump in the air.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    80
     * @param direction -1: jump left, 0: jump up, 1: jump right
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    81
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
    82
    void jump (int direction);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    83
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    84
    /** 
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    85
     * Handle ground-bounce
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    86
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    87
     * @param normal Normal vector relative to which to bounce
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    88
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
    89
    void bounce (Vector normal);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    90
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    91
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    92
     * Called on network clients to sync state from server
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    93
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    94
     * @param position New position
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    95
     * @param velocity New velocity
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    96
     * @param inAir New inAir value
200
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 197
diff changeset
    97
     * @param facingRight New facingRight value
2dbf40661580 better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents: 197
diff changeset
    98
     * @param aim New aim
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    99
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   100
    virtual void updatePhysics (Vector position, Vector velocity, bool inAir, FacingDirection facing, float aim);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   101
225
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   102
    /**
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   103
     * Put object to the objects list so that its movement will be calculated.
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   104
     */
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   105
    void enable (void);
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   106
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   107
    /**
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   108
     * Remove object from the objects list but don't delete the object itself.
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   109
     */
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   110
    void disable (void);
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
   111
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   112
private:
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   113
    // Shape of the object. Edge points of the shape polygon.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   114
    std::vector<Vector> shape;
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   115
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   116
    // Force queue that is emptied on every tick
273
eeb699e1d908 Made forceq to contain time again.
saiam
parents: 272
diff changeset
   117
    std::queue<std::pair<Force, TimeMS> > forceq;
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   118
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   119
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   120
     * Handle player movement and apply forces.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   121
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   122
    void updatePosition (TimeMS dt);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   123
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   124
    // TODO: Should these be moved to PhysicsWorld?
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   125
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   126
     * Use RK4 to integrate the effects of force over a time interwall.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   127
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   128
     * @param force Force to integrate
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   129
     * @param dt Time intervall
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   130
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   131
    void integrate (Force force, TimeMS dt, Vector &posAfterTick, Vector &velAfterTick);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   132
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   133
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   134
     * Evaluate the value of the derivative at given time
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   135
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   136
     * @param force Force
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   137
     * @param dt Time
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   138
     * @param d Previous derivative
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   139
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   140
    Derivative evaluate (Force force, TimeMS dt, Derivative &d, const Vector &posAfterTick, const Vector &velAfterTick);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   141
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   142
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   143
     * Return object acceleration with given force.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   144
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   145
     * @param force Force
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   146
     * @return Acceleration
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   147
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   148
    Vector acceleration (const Force &force);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   149
249
5647f58e37cd Removed some unnecessary TODOs
saiam
parents: 235
diff changeset
   150
     /**
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   151
     * Handle ground movement.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   152
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   153
     * @param right Boolean describing the movement direction.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   154
     * @return New position
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   155
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   156
    void walk (TimeMS, bool right);
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   157
    Vector walk_one_step (float, bool);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   158
288
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 287
diff changeset
   159
public:
249
5647f58e37cd Removed some unnecessary TODOs
saiam
parents: 235
diff changeset
   160
    /**
5647f58e37cd Removed some unnecessary TODOs
saiam
parents: 235
diff changeset
   161
     * Define object behaviour on collisions.
282
e0e4dfc3e528 compiles cleanly with -Wall -Wextra -Wconversion, not tested, but that shouldn't break anything :)
terom
parents: 279
diff changeset
   162
     *
e0e4dfc3e528 compiles cleanly with -Wall -Wextra -Wconversion, not tested, but that shouldn't break anything :)
terom
parents: 279
diff changeset
   163
     * XXX: make this pure-virtual
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   164
     */
288
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 287
diff changeset
   165
    virtual void onCollision (Vector collisionPoint, PhysicsObject *other = NULL);
272
97de051edbcf Added PhysicsObject* attribute to onCollision
saiam
parents: 268
diff changeset
   166
249
5647f58e37cd Removed some unnecessary TODOs
saiam
parents: 235
diff changeset
   167
    /**
287
f59c8dee7f91 getType added for physics object
ekku
parents: 285
diff changeset
   168
     * Return the type of the physics object (player, projectile...)
f59c8dee7f91 getType added for physics object
ekku
parents: 285
diff changeset
   169
     */
f59c8dee7f91 getType added for physics object
ekku
parents: 285
diff changeset
   170
    ObjectType getType (void) const;
f59c8dee7f91 getType added for physics object
ekku
parents: 285
diff changeset
   171
f59c8dee7f91 getType added for physics object
ekku
parents: 285
diff changeset
   172
    /**
249
5647f58e37cd Removed some unnecessary TODOs
saiam
parents: 235
diff changeset
   173
     * Checks if it is possible for the object to be in the given
5647f58e37cd Removed some unnecessary TODOs
saiam
parents: 235
diff changeset
   174
     * location.
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   175
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   176
    bool possibleLocation (Vector loc);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   177
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   178
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   179
     * Get current object position.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   180
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   181
     * @return Position vector
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   182
     */
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
   183
    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
   184
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 252
diff changeset
   185
    /**
285
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   186
     * Set previous object position.
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   187
     *
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   188
     * @param Position vector
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   189
     */
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   190
    void setPosition (Vector pos);
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   191
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   192
    /**
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   193
     * Get previous object position.
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   194
     *
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   195
     * @return Position vector
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   196
     */
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   197
    Vector getPreviousPosition (void) const;
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   198
c080c8c70333 Previous position added, and unsigned int bug fixed
ekku
parents: 282
diff changeset
   199
    /**
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 252
diff changeset
   200
     * 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
   201
     *
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 252
diff changeset
   202
     * @return PixelCoordinate position
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 252
diff changeset
   203
     */
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
   204
    PixelCoordinate getCoordinate (void) const;
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   205
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   206
    /**
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
   207
     * 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
   208
     *
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
   209
     * @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
   210
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   211
    Vector getVelocity (void) 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
   212
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
   213
    /**
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   214
     * Return object shape.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   215
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   216
     * @return Polygon points
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   217
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   218
    const std::vector<Vector>& getShape (void) const;
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   219
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   220
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   221
     * Set object shape.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   222
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   223
     * @param shape Vector containing polygon poinst
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   224
     */
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   225
    void setShape(std::vector<Vector> shape);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   226
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   227
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   228
     * Return object facing.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   229
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   230
     * @return Object facing (true if facing right)
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   231
     */
264
215de3d4de60 change facingRight from a bool to an
terom
parents: 257
diff changeset
   232
    FacingDirection getFacing() const;
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   233
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   234
    /**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   235
     * Return object aim angle.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   236
     *
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   237
     * @return Object aim angle
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   238
     */
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
   239
    float getAim() const;
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   240
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   241
    /**
235
0a0c729365ee code cleanup
terom
parents: 228
diff changeset
   242
     * Returns facing+aim as a unit vector
0a0c729365ee code cleanup
terom
parents: 228
diff changeset
   243
     */
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
   244
    Vector getDirection (void) const;
235
0a0c729365ee code cleanup
terom
parents: 228
diff changeset
   245
0a0c729365ee code cleanup
terom
parents: 228
diff changeset
   246
    /**
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
   247
     *  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
   248
     */
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
   249
    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
   250
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
   251
    /*
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
   252
     * 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
   253
     */
299
e4dacf550ba1 implement players dying
terom
parents: 288
diff changeset
   254
    bool isAlive (void);
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
   255
    
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
   256
    /**
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
   257
     * 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
   258
     */
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
   259
    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
   260
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
   261
    /**
228
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   262
     * 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
   263
     */
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   264
    void setPivot (PhysicsObject *pivot);
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   265
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   266
    /**
268
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   267
     * Checks if object collides with other objects
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   268
     *
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   269
     * @param obj Other PhysicsObject
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
    bool collides (const PhysicsObject &obj);
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   272
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   273
    /**
228
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   274
     * Compute the force that this object (as a pivot) exerts on the given object
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   275
     */
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   276
    virtual float getPivotForce (PhysicsObject *bob);
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   277
dbc1bb7a98b5 Rope has forces
ekku
parents: 225
diff changeset
   278
    /**
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   279
     * Update object in physics simulation.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   280
     */
221
fbc5db6fce45 reorganize the weapons code and input handling code
terom
parents: 209
diff changeset
   281
    virtual void tick (TimeMS tick_length);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   282
};
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   283
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   284
struct Derivative {
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   285
    Vector dx; // Velocity
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   286
    Vector dv; // Acceleration
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   287
};
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   288
268
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   289
/**
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   290
 * 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
   291
 * 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
   292
 * line drawn between p1 and p2 the point p3 is.
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   293
 *
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   294
 * @param p1 Line start point
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   295
 * @param p2 Line end point
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   296
 * @param p3 Point
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   297
 * @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
   298
 */
0b96b88af335 Added collision detection method to PhysicsObject. Not tested.
saiam
parents: 265
diff changeset
   299
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
   300
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
   301
#endif