00001 #include <SDL/SDL.h>
00002 #include <SDL/SDL_gfxPrimitives.h>
00003
00004 #include "constants.h"
00005 #include "player.h"
00006 #include "random.h"
00007 #include "animatedimage.h"
00008
00009 Player :: Player( int w, int h )
00010 {
00011 sWidth = w;
00012 sHeight = h;
00013
00014 thrust = 0.4;
00015 gravity = 0.6;
00016 maxUpSpeed = 4.0;
00017 maxDownSpeed = 5.0;
00018
00019 explosion = new AnimatedImage( IMAGES_PATH "explosion.bmp", 15 );
00020 init();
00021 }
00022
00023 Player :: ~Player()
00024 {
00025 if ( explosion )
00026 delete explosion;
00027 }
00028
00029 void Player :: init()
00030 {
00031
00032 pos.x( 50 );
00033 pos.y( sWidth/2 );
00034 pos.h( 2 );
00035 pos.w( 4 );
00036 currentThrust = 0;
00037 crashing = false;
00038 crashLineLength = 0;
00039 crashed = false;
00040 explosion->reset();
00041 allFaded = false;
00042 expNextFrame = false;
00043
00044
00045 for ( int i = 0 ; i < TRAILSIZE ; ++i )
00046 {
00047 trail[i].x( -1 );
00048 trail[i].y( 0 );
00049 trail[i].w( 2 );
00050 trail[i].h( 2 );
00051 }
00052 }
00053
00054 void Player :: draw( SDL_Surface *screen )
00055 {
00056 if ( !crashing )
00057 {
00058
00059
00060 filledEllipseRGBA( screen, pos.x() + pos.w(), pos.y(), pos.w(), pos.h(), 0, 255, 255, 255 );
00061
00062
00063 drawTrails( screen );
00064 }
00065 else
00066 {
00067 drawTrails( screen );
00068
00069 if ( !crashed )
00070 explosion->draw( screen, pos.x(), pos.y() );
00071 }
00072 }
00073
00074 void Player :: drawTrails( SDL_Surface *screen )
00075 {
00076 if ( allFaded && crashing )
00077 return;
00078
00079 for ( int i = 0 ; i < TRAILSIZE ; ++i )
00080 {
00081 if ( trail[i].x() >= 0 )
00082 {
00083 int c = (int)((150.0/50) * (50.0 - (pos.x() - trail[i].x() ) ));
00084 boxRGBA( screen, trail[i].x(), trail[i].y(), trail[i].x() + 2, trail[i].y() + 2, 255, (int)(1.5*c), 0, c );
00085 }
00086 }
00087 }
00088
00089 void Player :: move( bool up )
00090 {
00091
00092 moveTrails();
00093
00094 if ( up )
00095 currentThrust -= thrust;
00096 else
00097 currentThrust += gravity;
00098
00099 if ( currentThrust > maxDownSpeed )
00100 currentThrust = maxDownSpeed;
00101 else if ( currentThrust < -maxUpSpeed )
00102 currentThrust = -maxUpSpeed;
00103
00104 pos.moveBy( 0, (int)(currentThrust) );
00105 }
00106
00107 void Player :: moveTrails()
00108 {
00109 bool done = false;
00110 bool stillVisible = false;
00111
00112
00113 if ( allFaded && crashing )
00114 return;
00115
00116 for ( int i = 0 ; i < TRAILSIZE ; ++i )
00117 {
00118 if ( trail[i].x() < 0 )
00119 {
00120 stillVisible = true;
00121 if ( !crashing && !done )
00122 {
00123 trail[i].x( pos.x() - 5 );
00124 trail[i].y( pos.y() );
00125 done = true;
00126 }
00127 }
00128 else
00129 trail[i].x( trail[i].x() - 1 );
00130 }
00131
00132 if ( !stillVisible )
00133 allFaded = true;
00134 }
00135
00136 bool Player :: updateCrashing()
00137 {
00138 crashing = true;
00139
00140 moveTrails();
00141 if ( expNextFrame )
00142 {
00143 expNextFrame = false;
00144 crashed = !explosion->nextFrame();
00145 }
00146 else
00147 expNextFrame = true;
00148
00149 return crashed;
00150 }
00151
00152 void Player :: setMovementInfo( double up, double grav, double maxUp, double maxDown )
00153 {
00154 thrust = up;
00155 gravity = grav;
00156 maxUpSpeed = maxUp;
00157 maxDownSpeed = maxDown;
00158 }
00159
00160
00161 void Player :: incValue( int valueType )
00162 {
00163 switch( valueType )
00164 {
00165 case PLAYER_THRUST:
00166 thrust += 0.1;
00167 break;
00168 case PLAYER_GRAVITY:
00169 gravity += 0.1;
00170 break;
00171 case PLAYER_MAX_SPEED_UP:
00172 maxUpSpeed += 0.1;
00173 break;
00174 case PLAYER_MAX_SPEED_DOWN:
00175 maxDownSpeed += 0.1;
00176 break;
00177 }
00178 }
00179
00180 void Player :: decValue( int valueType )
00181 {
00182 switch( valueType )
00183 {
00184 case PLAYER_THRUST:
00185 thrust -= 0.1;
00186 break;
00187 case PLAYER_GRAVITY:
00188 gravity -= 0.1;
00189 break;
00190 case PLAYER_MAX_SPEED_UP:
00191 maxUpSpeed -= 0.1;
00192 break;
00193 case PLAYER_MAX_SPEED_DOWN:
00194 maxDownSpeed -= 0.1;
00195 break;
00196 }
00197 }
00198
00199 void Player :: setValue( int valueType, double val )
00200 {
00201 switch( valueType )
00202 {
00203 case PLAYER_THRUST:
00204 thrust = val;
00205 break;
00206 case PLAYER_GRAVITY:
00207 gravity = val;
00208 break;
00209 case PLAYER_MAX_SPEED_UP:
00210 maxUpSpeed = val;
00211 break;
00212 case PLAYER_MAX_SPEED_DOWN:
00213 maxDownSpeed = val;
00214 break;
00215 }
00216 }
00217
00218 double Player :: getValue( int valueType )
00219 {
00220 double val;
00221 switch( valueType )
00222 {
00223 case PLAYER_THRUST:
00224 val = thrust;
00225 break;
00226 case PLAYER_GRAVITY:
00227 val = gravity;
00228 break;
00229 case PLAYER_MAX_SPEED_UP:
00230 val = maxUpSpeed;
00231 break;
00232 case PLAYER_MAX_SPEED_DOWN:
00233 val = maxDownSpeed;
00234 break;
00235 }
00236
00237 return val;
00238 }
00239
00240 string Player :: getValueTypeString( int valueType )
00241 {
00242 string val;
00243 switch( valueType )
00244 {
00245 case PLAYER_THRUST:
00246 val = "thrust";
00247 break;
00248 case PLAYER_GRAVITY:
00249 val = "gravity";
00250 break;
00251 case PLAYER_MAX_SPEED_UP:
00252 val = "maxupspeed";
00253 break;
00254 case PLAYER_MAX_SPEED_DOWN:
00255 val = "maxdownspeed";
00256 break;
00257 }
00258
00259 return val;
00260 }
00261
00262 string Player :: getValueString( int valueType )
00263 {
00264 char val[50];
00265 switch( valueType )
00266 {
00267 case PLAYER_THRUST:
00268 sprintf( val, "Thrust - %lf", thrust );
00269 break;
00270 case PLAYER_GRAVITY:
00271 sprintf( val, "Gravity - %lf", gravity );
00272 break;
00273 case PLAYER_MAX_SPEED_UP:
00274 sprintf( val, "Max Speed Up - %lf", maxUpSpeed );
00275 break;
00276 case PLAYER_MAX_SPEED_DOWN:
00277 sprintf( val, "Max Speed Down - %lf", maxDownSpeed );
00278 break;
00279 }
00280
00281 string ret = val;
00282 return ret;
00283 }
00284