Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

player.cpp

Go to the documentation of this file.
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         // Set player position
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         // Reset Trail
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                 // Draw Player
00059 //              ellipseRGBA( screen, pos.x(), pos.y(), pos.x()+ pos.width(), pos.y()+pos.height(), 0, 255, 255, 255 );
00060                 filledEllipseRGBA( screen, pos.x() + pos.w(), pos.y(), pos.w(), pos.h(), 0, 255, 255, 255 );
00061 
00062                 // Draw Trail
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     // Find enpty trail and move others
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         // Dont do anything here if all faded when were crashing
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 

Generated on Sat Nov 5 16:17:24 2005 for OPIE by  doxygen 1.4.2