|
SDLGameEngine
|
00001 /* 00002 * Copyright (c) 2007 Heiko Irrgang 00003 * 00004 * The license and distribution terms for this file may be 00005 * found in the file COPYING in this distribution or at 00006 * http://93-interactive.com/cms/products/software/sdl-game-engine/license/ 00007 */ 00008 00009 #include <sge.h> 00010 #include <assert.h> 00011 00012 SGEGAMESTATEMANAGER* sgeGameStateManagerNew(void) 00013 { 00014 SGEGAMESTATEMANAGER *ret; 00015 sgeNew(ret, SGEGAMESTATEMANAGER); 00016 return ret; 00017 } 00018 00019 SGEGAMESTATE* sgeGameStateNew(void) 00020 { 00021 SGEGAMESTATE *ret; 00022 sgeNew(ret, SGEGAMESTATE); 00023 return ret; 00024 } 00025 00026 void sgeGameStateManagerQuit(SGEGAMESTATEMANAGER *manager) 00027 { 00028 manager->quit = 1; 00029 } 00030 00031 int sgeGameStateManagerChange(SGEGAMESTATEMANAGER *manager, SGEGAMESTATE *next_state) 00032 { 00033 if (manager->current && manager->current->onStateChange) { 00034 if (!manager->current->onStateChange(manager->current, next_state)) { 00035 return 0; 00036 } 00037 } 00038 manager->current = next_state; 00039 next_state->manager = manager; 00040 return 1; 00041 } 00042 00043 void sgeGameStateManagerRun(SGEGAMESTATEMANAGER *manager, int fps) 00044 { 00045 SDL_Event event; 00046 SGETIMER t; 00047 sgeClearEvents(); 00048 t=sgeStartRedrawTimer(fps); 00049 00050 assert(manager->current); 00051 manager->quit = 0; 00052 00053 while (SDL_WaitEvent(&event) && !manager->quit) { 00054 switch (event.type) { 00055 case SDL_USEREVENT: 00056 if (event.user.code==SGEREDRAW && manager->current->onRedraw) { 00057 manager->current->onRedraw(manager->current); 00058 } 00059 sgeEventResetInputs(&manager->event_state); 00060 break; 00061 case SDL_KEYDOWN: 00062 if (manager->current->onKeyDown!=NULL) { 00063 if (manager->current->onKeyDown(manager->current, &event)) { 00064 break; 00065 } 00066 } 00067 sgeEventApply(&manager->event_state, &event); 00068 break; 00069 case SDL_KEYUP: 00070 if (manager->current->onKeyUp!=NULL) { 00071 if (manager->current->onKeyUp(manager->current, &event)) { 00072 break; 00073 } 00074 } 00075 sgeEventApply(&manager->event_state, &event); 00076 break; 00077 case SDL_JOYBUTTONUP: 00078 if (manager->current->onJoystickButtonUp!=NULL) { 00079 if (manager->current->onJoystickButtonUp(manager->current, &event)) { 00080 break; 00081 } 00082 } 00083 sgeEventApply(&manager->event_state, &event); 00084 break; 00085 case SDL_JOYBUTTONDOWN: 00086 if (manager->current->onJoystickButtonDown!=NULL) { 00087 if (manager->current->onJoystickButtonDown(manager->current, &event)) { 00088 break; 00089 } 00090 } 00091 sgeEventApply(&manager->event_state, &event); 00092 break; 00093 case SDL_MOUSEBUTTONDOWN: 00094 if (manager->current->onMouseDown!=NULL) { 00095 manager->current->onMouseDown(manager->current, &event); 00096 } 00097 break; 00098 case SDL_MOUSEBUTTONUP: 00099 if (manager->current->onMouseUp!=NULL) { 00100 manager->current->onMouseUp(manager->current, &event); 00101 } 00102 break; 00103 case SDL_MOUSEMOTION: 00104 if (manager->current->onMouseMove!=NULL) { 00105 manager->current->onMouseMove(manager->current, &event); 00106 } 00107 break; 00108 case SDL_JOYAXISMOTION: 00109 if (manager->current->onJoystickMove!=NULL) { 00110 manager->current->onJoystickMove(manager->current, &event); 00111 } 00112 break; 00113 case SDL_QUIT: 00114 manager->quit = 1; 00115 break; 00116 } 00117 } 00118 00119 sgeStopRedrawTimer(t); 00120 }