aboutsummaryrefslogtreecommitdiff
path: root/sons_of_sol/private_db/PlayerShip.cpp
diff options
context:
space:
mode:
authorJoshua Rahm <joshua.rahm@colorado.edu>2013-12-10 19:19:26 -0700
committerJoshua Rahm <joshua.rahm@colorado.edu>2013-12-10 19:19:26 -0700
commit010f829485d570afb66c630026504fec63f93cdd (patch)
treed5e42e333178794377c05a99b5bf0c034485bcb6 /sons_of_sol/private_db/PlayerShip.cpp
parent7be3bda2b664068bf47404278fa9ee1ce552ea0e (diff)
downloadSonsOfSol-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.cpp70
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();
+ }
+ }
+}