/* base/spectator.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 */ #include "example/spectator.h" namespace example { core::Cvar *Spectator::g_spectatorspeed = 0; core::Cvar *Spectator::g_spectatorrotation = 0; Spectator::Spectator(core::Player *owner) : core::EntityControlable() { // default properties set_shape(core::Entity::Diamond); set_radius(0.25f); // the spectator gets player color if (owner) { set_owner(owner); get_color().assign(owner->color()); get_color_second().assign(owner->color_second()); } // set dirty flag set_dirty(); } Spectator::~Spectator() { } void Spectator::frame(const unsigned long elapsed) { // only update if necessary if (!entity_speed && ! target_thrust && !target_direction && !target_pitch && !target_roll && !target_strafe && !target_afterburner) return; // assign thrust value from input entity_thrust = target_thrust; const float seconds = (float) elapsed / 1000.0f; // rotate according to input float rotation = g_spectatorrotation->value() * seconds; get_axis().change_direction(target_direction * rotation); get_axis().change_pitch(target_pitch * rotation); get_axis().change_roll(target_roll * rotation); // assign speed from thruster float maxspeed = g_spectatorspeed->value(); entity_speed = entity_thrust * maxspeed; // assign new location if (entity_speed) get_location() += axis().forward() * entity_speed * seconds; if (target_afterburner) get_location() += axis().forward() * maxspeed * target_afterburner * seconds; if (target_strafe) get_location() += axis().left() * maxspeed * target_strafe * seconds; if (target_vstrafe) get_location() += axis().up() * maxspeed * target_vstrafe * seconds; // set dirty flag set_dirty(); } }