diff options
| author | Joshua Rahm <joshua.rahm@colorado.edu> | 2013-12-10 19:19:26 -0700 |
|---|---|---|
| committer | Joshua Rahm <joshua.rahm@colorado.edu> | 2013-12-10 19:19:26 -0700 |
| commit | 010f829485d570afb66c630026504fec63f93cdd (patch) | |
| tree | d5e42e333178794377c05a99b5bf0c034485bcb6 /sons_of_sol/private_db/PlayerShip.cpp | |
| parent | 7be3bda2b664068bf47404278fa9ee1ce552ea0e (diff) | |
| download | SonsOfSol-010f829485d570afb66c630026504fec63f93cdd.tar.gz SonsOfSol-010f829485d570afb66c630026504fec63f93cdd.tar.bz2 SonsOfSol-010f829485d570afb66c630026504fec63f93cdd.zip | |
Almost finished working commit
Diffstat (limited to 'sons_of_sol/private_db/PlayerShip.cpp')
| -rw-r--r-- | sons_of_sol/private_db/PlayerShip.cpp | 70 |
1 files changed, 64 insertions, 6 deletions
diff --git a/sons_of_sol/private_db/PlayerShip.cpp b/sons_of_sol/private_db/PlayerShip.cpp index f8d8ec1..14eff74 100644 --- a/sons_of_sol/private_db/PlayerShip.cpp +++ b/sons_of_sol/private_db/PlayerShip.cpp @@ -4,8 +4,13 @@ #include "glox/GloxColor.hpp" using namespace glox; +using namespace std; +float randomJitter( float jitter ) { + return (( rand() % 2000 - 1000 ) / 1000.0) * jitter ; +} + void PlayerShip::pitch( float angle ) { /* Update the forward vector */ m_forward *= (float)GloxCos( angle ); @@ -32,7 +37,12 @@ void PlayerShip::yaw( float angle ) { } void PlayerShip::renderPerspective( ) { - m_perspective.setLookAtPoint( m_position + m_forward.toPoint() ); + + GloxPoint<> noise( randomJitter( m_jitter ), randomJitter( m_jitter ), randomJitter( m_jitter ) ) ; + if( m_is_firing ) { + noise += GloxPointf( randomJitter(0.01),randomJitter(0.01),randomJitter(0.01) ); + } + m_perspective.setLookAtPoint( m_position + m_forward.toPoint() + noise ); m_perspective.setPosition( m_position + (m_forward.toPoint() * 0.2f) ); m_perspective.setUpVector( m_up.toPoint() ); @@ -57,28 +67,33 @@ void PlayerShip::onControlMotion( const ControlMotionEvent& evt ) { m_dpitch = update_val( evt.getMagnitude(), m_dpitch, 10 ); } - if( evt.getType() == ControlMotionEvent::THROTTLE ) { + else if( evt.getType() == ControlMotionEvent::THROTTLE ) { m_dforward_to = evt.getMagnitude(); } - if( evt.getType() == ControlMotionEvent::YAW ) { + else if( evt.getType() == ControlMotionEvent::YAW ) { m_dyaw = update_val( evt.getMagnitude(), m_dyaw, 10 ); } - if( evt.getType() == ControlMotionEvent::ROLL ) { + else if( evt.getType() == ControlMotionEvent::ROLL ) { m_droll_to = evt.getMagnitude(); } - if( evt.getType() == ControlMotionEvent::STRAFE_SIDE ) { + else if( evt.getType() == ControlMotionEvent::STRAFE_SIDE ) { m_dright_to = evt.getMagnitude(); } - if( evt.getType() == ControlMotionEvent::STRAFE_UP ) { + else if( evt.getType() == ControlMotionEvent::STRAFE_UP ) { m_dup_to = evt.getMagnitude(); } + + else if( evt.getType() == ControlMotionEvent::FIRE_PRIMARY ) { + m_is_firing = evt.getMagnitude() != 0 ; + } } void PlayerShip::update() { + static const float projectile_speed = 150; // printf( "dpitch: %f, droll: %f, dyaw: %f, dforward: %f, dright: %f, dup: %f\n", // m_dpitch, m_droll, m_dyaw, m_dforward, m_dright, m_dup ); @@ -86,6 +101,18 @@ void PlayerShip::update() { roll( m_droll ); yaw( m_dyaw ); + int i = 0; + for( vector<Projectile>::iterator itr = m_living_projectiles.begin(); + itr != m_living_projectiles.end() ; ++ itr ) { + if( ! (*itr).isDead() ) { + (*itr).update(); + if( (*itr).isDead() ) { + m_open_positions.push( i ); + } + } + ++ i; + } + m_position += (m_forward * m_dforward).toPoint(); m_position += (m_right * m_dright).toPoint(); m_position += (m_up * m_dup).toPoint(); @@ -93,11 +120,42 @@ void PlayerShip::update() { m_droll = update_val( m_droll_to, m_droll, 20 ); m_dup = update_val( m_dup_to, m_dup, 20 ); m_dright = update_val( m_dright_to, m_dright, 20 ); + + float last_dforward = m_dforward ; m_dforward = update_val( m_dforward_to, m_dforward, 200 ); + float accel = m_dforward - last_dforward ; + if( accel > 0 ) { + m_jitter = accel / 40.0 ; + } else { + m_jitter = 0.0 ; + } + // This is only the case if we are using a mouse m_dpitch = update_val( 0, m_dpitch, 100 ); m_dyaw = update_val( 0, m_dyaw, 100 ); // m_droll = (m_droll_to * ( 1 - exp( - m_droll_count ) ) + m_droll * ( 1 - exp( - m_droll_count ) ) )/ 2.0; + if( m_is_firing ) { + GloxPointf spread( randomJitter(0.03), randomJitter(0.03), randomJitter(0.03) ); + Projectile proj( (m_position - m_up.toPoint() - m_right.toPoint()), (m_forward.toPoint() + spread) * projectile_speed ) ; + + if( m_open_positions.empty() ) { + m_living_projectiles.push_back( proj ); + } else { + int idx = m_open_positions.front(); + m_open_positions.pop(); + m_living_projectiles[idx] = proj; + } + } + renderPerspective(); } + +void PlayerShip::drawProjectiles() { + for( vector<Projectile>::iterator itr = m_living_projectiles.begin(); + itr != m_living_projectiles.end() ; ++ itr ) { + if( ! (*itr).isDead() ) { + itr->draw(); + } + } +} |