src/PhysicsWorld.cc
author Tero Marttila <terom@fixme.fi>
Tue, 20 Jan 2009 23:30:18 +0200
changeset 408 e6cfc44266af
parent 351 7e6d373d8c98
child 423 947ab54de4b7
permissions -rw-r--r--
reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     1
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     2
#include "PhysicsWorld.hh"
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     3
#include "Engine.hh"
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     4
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: 208
diff changeset
     5
#include <functional>
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: 208
diff changeset
     6
408
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 351
diff changeset
     7
PhysicsWorld::PhysicsWorld (Vector gravity, Vector dimensions, Terrain &terrain) :
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 351
diff changeset
     8
    terrain(terrain),
282
e0e4dfc3e528 compiles cleanly with -Wall -Wextra -Wconversion, not tested, but that shouldn't break anything :)
terom
parents: 255
diff changeset
     9
    dimensions(dimensions), 
e0e4dfc3e528 compiles cleanly with -Wall -Wextra -Wconversion, not tested, but that shouldn't break anything :)
terom
parents: 255
diff changeset
    10
    gravity(gravity),
e0e4dfc3e528 compiles cleanly with -Wall -Wextra -Wconversion, not tested, but that shouldn't break anything :)
terom
parents: 255
diff changeset
    11
    tick_timer(PHYSICS_TICK_MS)
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: 208
diff changeset
    12
{
408
e6cfc44266af reorganize Terrain/PhysicsWorld/GameState/Engine to use NetworkClientConnect, and hence handle the connection process asynchronously, and finally properly implement receiving the terrain data from the server
Tero Marttila <terom@fixme.fi>
parents: 351
diff changeset
    13
    // wire up our timer
205
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents: 204
diff changeset
    14
    slots.connect(tick_timer.sig_tick(), this, &PhysicsWorld::tick);
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents: 204
diff changeset
    15
    tick_timer.start();
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    16
}
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    17
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: 208
diff changeset
    18
void PhysicsWorld::addPhysicsObject (PhysicsObject *po) {
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: 208
diff changeset
    19
    objects.push_back(po);
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    20
}
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    21
225
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
    22
void PhysicsWorld::removePhysicsObject (PhysicsObject *po) {
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
    23
    objects.remove(po);
22ecb9cb9245 Rope can be drawn.
ekku
parents: 222
diff changeset
    24
}
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    25
288
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    26
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    27
float distancePointToLine(Vector l1, Vector l2, Vector p) {
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    28
    Vector v(l2.y - l1.y, -(l2.x - l1.x));
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    29
    Vector r(l1.x-p.x, l1.y-p.y);
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    30
    v = v/v.length();
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    31
    float dist = v*r/v.sqrLength();
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    32
    return dist;
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    33
}
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    34
205
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents: 204
diff changeset
    35
void PhysicsWorld::tick (TimeMS tick_length) {
255
99431fdb0dc8 add PixelDimension/PixelCoordinate types, convert Terrain to use them, and convert/clean up drawing code
terom
parents: 225
diff changeset
    36
    // tick each object in turn
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: 208
diff changeset
    37
    for (std::list<PhysicsObject*>::iterator i = objects.begin(); i != objects.end(); i++) {
205
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents: 204
diff changeset
    38
        (*i)->tick(tick_length); 
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    39
    }
351
7e6d373d8c98 cleaned object-object collision detection in PhysicsWorld.cc:tick
nireco
parents: 300
diff changeset
    40
    // Object - object collision detection
288
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    41
    for (std::list<PhysicsObject*>::iterator i = objects.begin(); i != objects.end(); i++) {
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    42
        for (std::list<PhysicsObject*>::iterator j = i; j != objects.end(); j++) {
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    43
            if(i == j)
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    44
                continue;
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    45
            float range_sum_sqr = 2;
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    46
            if((*i)->getType() == PLAYER) {
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    47
                range_sum_sqr += PLAYER_RADIUS-1;
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    48
            }
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    49
            if((*j)->getType() == PLAYER) {
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    50
                range_sum_sqr += PLAYER_RADIUS-1;
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    51
            }
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    52
            range_sum_sqr *= range_sum_sqr;
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    53
            bool collision = false;
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    54
            Vector a2 = (*i)->getPosition();
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    55
            Vector b2 = (*j)->getPosition();
351
7e6d373d8c98 cleaned object-object collision detection in PhysicsWorld.cc:tick
nireco
parents: 300
diff changeset
    56
            float dab = (a2-b2).sqrLength();
7e6d373d8c98 cleaned object-object collision detection in PhysicsWorld.cc:tick
nireco
parents: 300
diff changeset
    57
            if(dab < range_sum_sqr) {
7e6d373d8c98 cleaned object-object collision detection in PhysicsWorld.cc:tick
nireco
parents: 300
diff changeset
    58
                collision = true;
7e6d373d8c98 cleaned object-object collision detection in PhysicsWorld.cc:tick
nireco
parents: 300
diff changeset
    59
            }
288
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    60
            if(collision) {
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    61
                (*i)->onCollision(a2, *j);
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    62
                (*j)->onCollision(b2, *i);
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    63
            }
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    64
        }
47a5d7896aec some collisions on PhysicsWorld::tick
nireco
parents: 282
diff changeset
    65
    }
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    66
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: 208
diff changeset
    67
    // Delete destroyed objects
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: 208
diff changeset
    68
    objects.remove_if(std::mem_fun(&PhysicsObject::removeIfDestroyed));
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    69
}
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    70
300
417183866f35 suicide key and respawning
terom
parents: 288
diff changeset
    71
TickCount PhysicsWorld::getTicks (void) {
417183866f35 suicide key and respawning
terom
parents: 288
diff changeset
    72
    return tick_timer.get_ticks();
417183866f35 suicide key and respawning
terom
parents: 288
diff changeset
    73
}
417183866f35 suicide key and respawning
terom
parents: 288
diff changeset
    74