/* 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, ShipModel *shipmodel) : core::EntityControlable(owner, ship_enttype) { entity_modelname = "ships/" + shipmodel->modelname(); entity_name = shipmodel->name() + ": <" + owner->name() + ">"; ship_shipmodel = shipmodel; entity_moduletypeid = ship_enttype; } Ship::~Ship() { if (entity_owner) entity_owner->remove_asset(this); } 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 if (target_direction > 1.0f) target_direction = 1.0f; else if (target_direction < -1.0f) target_direction = -1.0f; // turnspeed is rotations per second float direction_offset = 360.0f * ship_shipmodel->turnspeed() * seconds * target_direction; entity_direction = degrees360f(entity_direction + direction_offset); // update speed if (entity_speed < entity_thrust * ship_shipmodel->maxspeed()) { entity_speed += ship_shipmodel->acceleration() * seconds; if (entity_speed > entity_thrust * ship_shipmodel->maxspeed()) { entity_speed = entity_thrust * ship_shipmodel->maxspeed(); } } else if(entity_speed > entity_thrust * ship_shipmodel->maxspeed()) { entity_speed -= ship_shipmodel->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