Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | implemented the StateSplash class. setup gameloop and main function to load and unload the game properly. the game currently starts up and shows the splash screen for 60 frames before exiting. no art has been added yet so there is just a black screen, but the program is protected from segfaults due to missing images. next things to do are to add some basic art, implement STATE_PLAYING (jump straight there from splash, skip menus for now), and see if i can get the paddle on screen and rotating to mouse input |
---|---|
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
08b33617a4b7c0f75b79439632633f7c |
User & Date: | donnyjward@gmail.com 2010-09-10 07:16:12.000 |
Context
2010-09-11
| ||
20:07 | added some graphics to test the rotating the paddle in a level. the paddle is rotated and displayed corretly. it moves continuously in a circle in 1 degree increments. check-in: 1d10f47a25 user: donnyjward@gmail.com tags: trunk | |
2010-09-10
| ||
07:16 | implemented the StateSplash class. setup gameloop and main function to load and unload the game properly. the game currently starts up and shows the splash screen for 60 frames before exiting. no art has been added yet so there is just a black screen, but the program is protected from segfaults due to missing images. next things to do are to add some basic art, implement STATE_PLAYING (jump straight there from splash, skip menus for now), and see if i can get the paddle on screen and rotating to mouse input check-in: 08b33617a4 user: donnyjward@gmail.com tags: trunk | |
03:46 | condensed the gameobject subclasses into 1 header/source pair check-in: 4a58ed9d53 user: donnyjward@gmail.com tags: trunk | |
Changes
Changes to breach.cpp.
1 2 3 4 | #include <iostream> #include "SDL/SDL.h" #include "s_statemachine.h" | > > > > > > > | | > > > > > > > > > > > > > > > > > > > > > > < > | > > > > > > > | > > | > > > > > > > > > > > > > > > > > > > > > > > > > | > | > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | #include <iostream> #include "SDL/SDL.h" #include "s_statemachine.h" #include "r_graphics.h" #include <string> using namespace std; static const string fileID = "[breach.cpp]: "; int DEBUG = 0; int FULLSCREEN = 0; //const vars default to static default (which limits the scope to the file its defined) // so declare it extern in all files its used extern const int COLORKEY_R = 78; extern const int COLORKEY_G = 0; extern const int COLORKEY_B = 63; extern const int SCREEN_WIDTH = 800; extern const int SCREEN_HEIGHT = 600; extern const int SCREEN_BITDEPTH = 32; //how long splash screen shows before moving to the next state // (measured frames) extern const int SPLASH_DURATION = 60; //target frame rate extern const int FPS = 30; //the main screen surface that will be blitted onto // and flipped SDL_Surface * screen = NULL; //the little icon for the window/taskbar SDL_Surface * icon = NULL; //from s_statemachine.cpp extern StateMachine * gameState; void BreachLoop(); void ExitProgram(); int main( int argc, char * argv[] ) { int i; //parse command line arguments for ( i = 1; i < argc; i++ ) { if ( !strcmp(argv[i], "-dev") ) //strings equal DEBUG = 1; else if ( !strcmp(argv[i], "-fullscreen") ) FULLSCREEN = 1; } //startup sdl library if ( SDL_Init( SDL_INIT_EVERYTHING ) != 0 ) { if (DEBUG) cout << fileID << "SDL_Init failed, reason: " << SDL_GetError() << "\n"; return -1; } //set window/taskbar caption and icon icon = r_loadImage("./graphics/icon.bmp"); if (icon == NULL && DEBUG) cout << fileID << "load icon failed\n"; SDL_WM_SetCaption("Breach", "Breach"); SDL_WM_SetIcon(icon, NULL); //"must be done before first call to set video mode (below) //setup game window if (DEBUG) cout << fileID << "Setting video mode to " << SCREEN_WIDTH << "x" << SCREEN_HEIGHT << " resolution with " << SCREEN_BITDEPTH << " bit depth\n"; if (FULLSCREEN) screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BITDEPTH, SDL_SWSURFACE | SDL_FULLSCREEN); else screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BITDEPTH, SDL_SWSURFACE); if (screen == NULL) { if (DEBUG) cout << fileID << "SDL_SetVideoMode failed to set " << SCREEN_WIDTH << "x" << SCREEN_HEIGHT << " resolution with " << SCREEN_BITDEPTH << " bit depth\n"; return -1; } BreachLoop(); return 0; } void BreachLoop() { s_initStateMachine(); gameState = new StateSplash(); while ( s_getGameState() != STATE_EXIT ) { gameState->HandleInput(); gameState->UpdateGame(); s_changeState(); gameState->Render(); } ExitProgram(); } void ExitProgram() { if (DEBUG) cout << fileID << "preparing to exit...\n"; delete gameState; SDL_Quit(); } |
Changes to defs.h.
1 2 3 | #ifndef __DEFS_H__ #define __DEFS_H__ | > > | | > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #ifndef __DEFS_H__ #define __DEFS_H__ #include "SDL/SDL.h" extern int DEBUG; extern int FULLSCREEN; //const vars default to static default (which limits the scope to the file its defined) // so declare it extern in all files its used extern const int COLORKEY_R; extern const int COLORKEY_G; extern const int COLORKEY_B; //how long splash screen shows before moving to the next state // (in seconds) extern const int SPLASH_DURATION; //the main screen surface that will be blitted onto // and flipped extern SDL_Surface * screen; typedef enum objectType_e { // } objectType_t; typedef enum itemType_e |
︙ | ︙ |
Changes to g_gameobject.cpp.
1 2 3 4 5 6 7 8 9 10 | //focus on getting 1 class at a time to work completely #include "g_gameobject.h" //gameobject functions void GameObject::GetLoc(int & xloc, int & yloc) { xloc = x; yloc = y; } | > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //focus on getting 1 class at a time to work completely #include "g_gameobject.h" #include <iostream> #include <string> using namespace std; static string fileID = "[g_gameobject.cpp]: "; //gameobject functions void GameObject::GetLoc(int & xloc, int & yloc) { xloc = x; yloc = y; } |
︙ | ︙ |
Changes to g_gameobject.h.
1 2 3 4 5 6 7 8 9 10 11 | #ifndef __G_GAMEOBJECT_H__ #define __G_GAMEOBJECT_H__ #include "defs.h" class GameObject { public: virtual void Draw() =0; virtual void OnCollide(GameObject * otherObject) =0; void GetLoc(int & xloc, int & yloc); | > | 1 2 3 4 5 6 7 8 9 10 11 12 | #ifndef __G_GAMEOBJECT_H__ #define __G_GAMEOBJECT_H__ #include "defs.h" class GameObject { public: virtual void Draw() =0; virtual void OnCollide(GameObject * otherObject) =0; void GetLoc(int & xloc, int & yloc); |
︙ | ︙ |
Changes to r_graphics.cpp.
1 2 3 | #include "r_graphics.h" #include "defs.h" | > > > > > > > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include "r_graphics.h" #include "defs.h" #include <iostream> #include <string> using namespace std; static string fileID = "[r_graphics]: "; SDL_Surface * r_loadImage(const char * filename) { SDL_Surface * loaded = NULL; SDL_Surface * image = NULL; Uint32 colorkey; loaded = SDL_LoadBMP(filename); |
︙ | ︙ | |||
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | return NULL; return image; } bool r_blitSurface(int x, int y, SDL_Surface * source, SDL_Surface * dest, SDL_Rect * clip) { SDL_Rect offset; offset.x = x; offset.y = y; if ( SDL_BlitSurface(source, clip, dest, &offset) < 0 ) //<0 = fail return false; else return true; } | > > > > > > > > > > > > > | 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | return NULL; return image; } bool r_blitSurface(int x, int y, SDL_Surface * source, SDL_Surface * dest, SDL_Rect * clip) { if (source == NULL) { if (DEBUG) cout << fileID << "an invalid source image was requested to be blitted\n"; return false; } else if (dest == NULL) { if (DEBUG) cout << fileID << "an invalid surface was requested to be blitted on\n"; return false; } SDL_Rect offset; offset.x = x; offset.y = y; if ( SDL_BlitSurface(source, clip, dest, &offset) < 0 ) //<0 = fail return false; else return true; } |
Changes to r_graphics.h.
1 2 3 4 5 6 | #ifndef __R_GRAPHICS_H__ #define __R_GRAPHICS_H__ #include "SDL/SDL.h" //loads a bmp file and returns the SDL_Surface | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #ifndef __R_GRAPHICS_H__ #define __R_GRAPHICS_H__ #include "SDL/SDL.h" //loads a bmp file and returns the SDL_Surface SDL_Surface * r_loadImage(const char * filename); //Pastes a surface onto the screen with location from top left corner // and optionally only a partial section of the surface (clip). //Does not auto free source surface. //x and y had default parameters of 0, but in c++ all parameters // default parameters must be default as well, so I just left it out bool r_blitSurface(int x, int y, SDL_Surface * source, SDL_Surface * dest, SDL_Rect * clip = NULL); |
︙ | ︙ |
Changes to r_sound.cpp.
1 | #include "r_sound.h" | > > > > > > > | 1 2 3 4 5 6 7 8 | #include "r_sound.h" #include <iostream> #include <string> using namespace std; static string fileID = "[r_sound.cpp]: "; |
Changes to s_statemachine.cpp.
1 2 3 4 5 6 7 8 9 | #include "s_statemachine.h" /************************************************ * * * STATE_SPLASH * * * ************************************************/ StateSplash::StateSplash() { | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > | > > > > > > > > > > > > | > > | | > | > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | #include "s_statemachine.h" #include "r_graphics.h" #include <iostream> #include <string> using namespace std; static string fileID = "[s_statemachine.cpp]: "; gameState_t currentStateID = STATE_NULL; gameState_t nextStateID = STATE_NULL; StateMachine * gameState; void s_initStateMachine() { currentStateID = STATE_SPLASH; } gameState_t s_getGameState() { return currentStateID; } void s_setNextState( gameState_t requestedState) { //if exit was requested at all during this frame, // all other requests are ignored for this frame if (nextStateID != STATE_EXIT) nextStateID = requestedState; } void s_changeState() { if (nextStateID != STATE_NULL) { //STATE_EXIT is not deleted because its needed // for the final rendered frame in the // last loop of the game loop if (nextStateID != STATE_EXIT) delete gameState; switch (nextStateID) { case STATE_SPLASH: gameState = new StateSplash(); break; case STATE_MMAIN: gameState = new StateMenuMain(); break; case STATE_MCHOOSEDIFFICULTY: gameState = new StateMenuChooseDifficulty(); break; case STATE_MLISTSAVEGAMES: gameState = new StateMenuListSaveGames(); break; case STATE_MOPTIONS: gameState = new StateMenuOptions(); break; case STATE_MCONTROLS: gameState = new StateMenuControls(); break; case STATE_MCONFIMEXIT: gameState = new StateMenuConfirmExit(); break; case STATE_MCREDITS: gameState = new StateMenuCredits(); break; case STATE_MHIGHSCORES: gameState = new StateMenuHighScores(); break; case STATE_PLAYING: gameState = new StatePlaying(); break; //case STATE_EXIT: //case STATE_NULL: //default: } currentStateID = nextStateID; nextStateID = STATE_NULL; } } /************************************************ * * * STATE_SPLASH * * * ************************************************/ StateSplash::StateSplash() { if (DEBUG) cout << fileID << "splash screen activated\n"; background = r_loadImage("./graphics/background_splash.bmp"); if (background == NULL && DEBUG) cout << fileID << "load background image failed\n"; frame = 0; //hide cursor during splash screen SDL_ShowCursor(SDL_DISABLE); } StateSplash::~StateSplash() { SDL_FreeSurface(background); if (DEBUG) cout << fileID << "splash screen deactivated\n"; } void StateSplash::HandleInput() { SDL_Event event; while ( SDL_PollEvent(&event) ) //returns 1 until no more eventz { switch (event.type) { case SDL_QUIT: s_setNextState(STATE_EXIT); break; } } } void StateSplash::UpdateGame() { if (frame >= SPLASH_DURATION) s_setNextState(STATE_EXIT); else { cout << fileID << "frame = " << frame << "\n"; frame++; } } void StateSplash::Render() { //blit background image if ( !r_blitSurface(0, 0, background, screen) && DEBUG ) cout << fileID << "blit background image failed\n"; SDL_Flip(screen); } /************************************************ * * * STATE_MMAIN * * * ************************************************/ |
︙ | ︙ | |||
48 49 50 51 52 53 54 | { } void StateMenuMain::UpdateGame() { } | | | 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | { } void StateMenuMain::UpdateGame() { } void StateMenuMain::Render() { } /************************************************ * * * STATE_MCHOOSEDIFFICULTY * |
︙ | ︙ | |||
78 79 80 81 82 83 84 | } void StateMenuChooseDifficulty::UpdateGame() { } | | | 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 | } void StateMenuChooseDifficulty::UpdateGame() { } void StateMenuChooseDifficulty::Render() { } /************************************************ * * * STATE_MLISTSAVEGAMES * |
︙ | ︙ | |||
108 109 110 111 112 113 114 | } void StateMenuListSaveGames::UpdateGame() { } | | | 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 | } void StateMenuListSaveGames::UpdateGame() { } void StateMenuListSaveGames::Render() { } /************************************************ * * * STATE_MOPTIONS * |
︙ | ︙ | |||
138 139 140 141 142 143 144 | } void StateMenuOptions::UpdateGame() { } | | | 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 | } void StateMenuOptions::UpdateGame() { } void StateMenuOptions::Render() { } /************************************************ * * * STATE_MCONTROLS * |
︙ | ︙ | |||
168 169 170 171 172 173 174 | } void StateMenuControls::UpdateGame() { } | | | 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 | } void StateMenuControls::UpdateGame() { } void StateMenuControls::Render() { } /************************************************ * * * STATE_MCONFIRMEXIT * |
︙ | ︙ | |||
198 199 200 201 202 203 204 | } void StateMenuConfirmExit::UpdateGame() { } | | | 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 | } void StateMenuConfirmExit::UpdateGame() { } void StateMenuConfirmExit::Render() { } /************************************************ * * * STATE_MCREDITS * |
︙ | ︙ | |||
228 229 230 231 232 233 234 | } void StateMenuCredits::UpdateGame() { } | | | 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 | } void StateMenuCredits::UpdateGame() { } void StateMenuCredits::Render() { } /************************************************ * * * STATE_MHIGHSCORES * |
︙ | ︙ | |||
258 259 260 261 262 263 264 | } void StateMenuHighScores::UpdateGame() { } | | | 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 | } void StateMenuHighScores::UpdateGame() { } void StateMenuHighScores::Render() { } /************************************************ * * * STATE_PLAYING * |
︙ | ︙ | |||
288 289 290 291 292 293 294 | } void StatePlaying::UpdateGame() { } | | > > | 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 | } void StatePlaying::UpdateGame() { } void StatePlaying::Render() { } //STATE_EXIT //STATE_NULL |
Changes to s_statemachine.h.
1 2 3 4 5 6 7 8 9 10 11 | #ifndef __STATEMACHINE_H__ #define __STATEMACHINE_H__ #include "SDL/SDL.h" #include "defs.h" class StateMachine //abstract base class { public: virtual void HandleInput() =0; virtual void UpdateGame() =0; | > > > > > > > > > | > > > > | > | | | | | | | | | | < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | #ifndef __STATEMACHINE_H__ #define __STATEMACHINE_H__ #include "SDL/SDL.h" #include "defs.h" //sets up the initial state of this state machine void s_initStateMachine(); //used by main loop to fetch currentStateID gameState_t s_getGameState(); void s_setNextState(gameState_e requestedState); void s_changeState(); class StateMachine //abstract base class { public: virtual void HandleInput() =0; virtual void UpdateGame() =0; virtual void Render() =0; virtual ~StateMachine() { }; }; //splash screen // current behavior is to just display splash image // for about 2 seconds, ignoring all input (except exit) // and then moving to the next state class StateSplash : public StateMachine { public: StateSplash(); ~StateSplash(); void HandleInput(); void UpdateGame(); void Render(); private: SDL_Surface * background; int frame; }; class StateMenuMain : public StateMachine { public: StateMenuMain(); ~StateMenuMain(); void HandleInput(); void UpdateGame(); void Render(); private: SDL_Surface * background; }; class StateMenuChooseDifficulty : public StateMachine { public: StateMenuChooseDifficulty(); ~StateMenuChooseDifficulty(); void HandleInput(); void UpdateGame(); void Render(); private: SDL_Surface * background; }; class StateMenuListSaveGames : public StateMachine { public: StateMenuListSaveGames(); ~StateMenuListSaveGames(); void HandleInput(); void UpdateGame(); void Render(); private: SDL_Surface * background; }; class StateMenuOptions : public StateMachine { public: StateMenuOptions(); ~StateMenuOptions(); void HandleInput(); void UpdateGame(); void Render(); private: SDL_Surface * background; }; class StateMenuControls : public StateMachine { public: StateMenuControls(); ~StateMenuControls(); void HandleInput(); void UpdateGame(); void Render(); private: SDL_Surface * background; }; class StateMenuConfirmExit : public StateMachine { public: StateMenuConfirmExit(); ~StateMenuConfirmExit(); void HandleInput(); void UpdateGame(); void Render(); private: SDL_Surface * background; }; class StateMenuCredits : public StateMachine { public: StateMenuCredits(); ~StateMenuCredits(); void HandleInput(); void UpdateGame(); void Render(); private: SDL_Surface * background; }; class StateMenuHighScores : public StateMachine { public: StateMenuHighScores(); ~StateMenuHighScores(); void HandleInput(); void UpdateGame(); void Render(); private: SDL_Surface * background; }; class StatePlaying : public StateMachine { public: StatePlaying(); ~StatePlaying(); void HandleInput(); void UpdateGame(); void Render(); private: SDL_Surface * background; }; #endif |