src/GameState.cc
author Tero Marttila <terom@fixme.fi>
Tue, 27 Jan 2009 00:25:58 +0200
changeset 439 9823e6cd1086
parent 423 947ab54de4b7
permissions -rw-r--r--
some README text

#include "GameState.hh"
#include "Engine.hh"
#include "Config.hh"
#include "Error.hh"

GameState::GameState (Terrain &terrain) : 
    world(Vector(0, MAP_GRAVITY), Vector((float) terrain.getWidth(), (float) terrain.getHeight()), terrain), 
    terrain(terrain),
    local_player(NULL), event_handler(NULL)
{ 

}
    
void GameState::setEventHandler (GameStateEventHandler *handler) {
    if (handler && event_handler != NULL)
        throw Error("event_handler already set");

    event_handler = handler;
}

void GameState::addProjectile (Projectile *projectile) {
    projectiles.push_back(projectile);
}

LocalPlayer *GameState::getLocalPlayer (void) {
    return local_player;
}

void GameState::setLocalPlayer (LocalPlayer *player) {
    if (local_player)
        throw std::logic_error("newLocalPlayer called even though we already have a local player");
    
    local_player = player;
}
    
void GameState::addPlayer (Player *player) {
    player_list.push_back(player);

    if (event_handler)
        event_handler->on_player_joined(player);
}

void GameState::removePlayer (Player *player) { 
    if (player == local_player)
        local_player = NULL;

    player_list.remove(player);
    
    if (event_handler)
        event_handler->on_player_left(player);
}

#if GRAPHICS_ENABLED
void GameState::draw (graphics::Display &display, PixelCoordinate camera, bool displayWeapon) {
    // Draw terrain
    terrain.draw(display, camera);

    // Draw players
    for (std::list<Player*>::iterator it = player_list.begin(); it != player_list.end(); it++) {
        Player *p = *it;
        
        // our LocalPlayer has it's own draw method
        if (p == local_player)
            local_player->draw(display, displayWeapon, camera);
        else
            p->draw(display, camera);
    }

    // Draw projectiles
    for (std::list<Projectile*>::iterator it = projectiles.begin(); it != projectiles.end(); it++) {
        (*it)->draw(display, camera);
    }
}
#endif