/**\brief Update function on every frame. */ void Ship::Update( lua_State *L ) { Sprite::Update( L ); // update momentum and other generic sprite attributes if( status.isAccelerating == false && status.isRotatingLeft == false && status.isRotatingRight == false) { flareAnimation->Reset(); } flareAnimation->Update(); Coordinate momentum = GetMomentum(); momentum.EnforceMagnitude( shipStats.GetMaxSpeed()*engineBooster ); // Show the hits taken as part of the radar color if(IsDisabled()) SetRadarColor( GREY ); else SetRadarColor( RED * GetHullIntegrityPct() ); // Ship has taken as much damage as possible... // It Explodes! if( status.hullDamage >= (float)shipStats.GetHullStrength() ) { SpriteManager *sprites = Simulation_Lua::GetSimulation(L)->GetSpriteManager(); Camera* camera = Simulation_Lua::GetSimulation(L)->GetCamera(); // Play explode sound if(OPTION(int, "options/sound/explosions")) { Sound *explodesnd = Sound::Get("Resources/Audio/Effects/18384__inferno__largex.wav.ogg"); explodesnd->Play( GetWorldPosition() - camera->GetFocusCoordinate()); } // Create Explosion sprites->Add( new Effect( GetWorldPosition(), "Resources/Animations/explosion1.ani", 0) ); // Remove this Sprite from the SpriteManager sprites->Delete( (Sprite*)this ); }
/**\brief Accelerates the ship. * \sa Model::GetAcceleration */ void Ship::Accelerate( void ) { Trig *trig = Trig::Instance(); Coordinate momentum = GetMomentum(); float angle = static_cast<float>(trig->DegToRad( GetAngle() )); float speed = shipStats.GetMaxSpeed()*engineBooster; float acceleration = (shipStats.GetForceOutput() *engineBooster ) / shipStats.GetMass(); momentum += Coordinate( trig->GetCos( angle ) * acceleration * Timer::GetDelta(), -1 * trig->GetSin( angle ) * acceleration * Timer::GetDelta() ); momentum.EnforceMagnitude(speed); SetMomentum( momentum ); status.isAccelerating = true; // Play engine sound float engvol = OPTION(float,"options/sound/engines"); Coordinate offset = GetWorldPosition() - Camera::Instance()->GetFocusCoordinate(); if ( this->GetDrawOrder() == DRAW_ORDER_SHIP ) engvol = engvol * NON_PLAYER_SOUND_RATIO ; this->engine->GetSound()->SetVolume( engvol ); this->engine->GetSound()->PlayNoRestart( offset ); }