src/PhysicsWorld.cc
author terom
Thu, 04 Dec 2008 21:59:23 +0000
changeset 200 2dbf40661580
parent 197 d9ac888de778
child 201 135616467a0a
permissions -rw-r--r--
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
197
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     1
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     2
#include "GameState.hh"
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     3
#include "PhysicsWorld.hh"
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     4
#include "Engine.hh"
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     5
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     6
PhysicsWorld::PhysicsWorld (Vector gravity, Vector dimensions)
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     7
    : Terrain(1337), tick_timer(PHYSICS_TICK_MS), tick_counter(0), dimensions(dimensions),
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     8
      gravity(gravity) {
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
     9
    slots.connect(tick_timer.sig_timer(), this, &PhysicsWorld::tick);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    10
    tick_timer.enable();
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    11
}
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    12
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    13
void PhysicsWorld::addPlayerObject (PhysicsObject *object) {
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    14
    players.push_back(object);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    15
}
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    16
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    17
void PhysicsWorld::addProjectile (Shot *projectile) {
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    18
    projectiles.push_back(projectile);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    19
}
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    20
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    21
/**
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    22
 * Function pointer used to clear the projectile list
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    23
 * from those that have already been destroyd.
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    24
 */
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    25
bool isDestroyedProjectile (Shot* po) { return (*po).isDestroyed(); }
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    26
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    27
void PhysicsWorld::tick () {
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    28
    //    Engine::log(DEBUG, "physics.apply_force") << "*tick*";
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    29
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    30
    for (std::list<PhysicsObject*>::iterator i = players.begin(); i != players.end(); i++) {
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    31
        (*i)->tick(); 
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    32
    }
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    33
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    34
    for (std::list<Shot*>::iterator i = projectiles.begin(); i != projectiles.end(); i++) {
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    35
        (*i)->tick();
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    36
    }
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    37
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    38
    // Delete destroyed projectiles
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    39
    std::list<Shot*>::iterator new_end = remove_if(projectiles.begin(), projectiles.end(), isDestroyedProjectile);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    40
    projectiles.erase(new_end, projectiles.end());
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    41
    
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    42
    tick_counter++;
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    43
}
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    44
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    45
uint32_t PhysicsWorld::getTick (void) {
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    46
    return tick_counter;
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    47
}
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    48
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    49
void PhysicsWorld::draw(CL_GraphicContext *gc) {
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    50
    Terrain::draw(gc);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    51
   
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    52
    // Draw players
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    53
    for (std::list<PhysicsObject*>::iterator it = players.begin(); it != players.end(); it++) {
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    54
        (*it)->draw(gc);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    55
    }
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    56
    // Draw projectiles
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    57
    for (std::list<Shot*>::iterator it = projectiles.begin(); it != projectiles.end(); it++) {
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    58
        (*it)->draw(gc);
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    59
    }
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    60
}
d9ac888de778 Hajotetaan lis??
ekku
parents:
diff changeset
    61