/* game/ship.cc This file is part of the Osirion project and is distributed under the terms and conditions of the GNU General Public License version 2 */ // project headers #include "game/game.h" #include "game/ship.h" #include "math/mathlib.h" // C++ headers #include using math::degrees360f; using math::degrees180f; namespace game { Ship::Ship(core::Player *owner, std::string const & model) : core::EntityControlable(owner, ship_enttype) { // entity properties entity_owner = owner; // ship model if (model.size()) { entity_modelname = "ships/" + model; entity_name = model + ": <" + owner->name() + ">"; } else { entity_modelname = "ships/micron_vector"; entity_name = "micron_vector: <" + owner->name() + ">"; } // ship specs acceleration = 1.5f; max_speed = 4.0f; turn_speed = 0.5f; } Ship::~Ship() { } void Ship::frame(float seconds) { // update thrust entity_thrust = target_thrust; if (entity_thrust < 0) entity_thrust = 0.0f; else if(entity_thrust > 1) entity_thrust = 1.0f; // update direction float direction_offset = degrees180f(target_direction - entity_direction); float d = turn_speed * seconds * direction_offset; entity_direction = degrees360f(entity_direction + d); // update speed if (entity_speed < entity_thrust * max_speed) { entity_speed += acceleration * seconds; if (entity_speed > entity_thrust * max_speed) { entity_speed = entity_thrust * max_speed; } } else if(entity_speed > entity_thrust * max_speed) { entity_speed -= acceleration * seconds; if (entity_speed < 0) entity_speed = 0; } // location TODO avoid sin/cos calculations entity_location.x += cosf(entity_direction * M_PI / 180) * entity_speed * seconds; entity_location.y += sinf(entity_direction * M_PI / 180) * entity_speed * seconds; entity_dirty = true; } } // namespace game