diff options
author | Damien Appert <dappert> | 2010-11-06 16:12:47 +0000 |
---|---|---|
committer | Damien Appert <dappert> | 2010-11-06 16:12:47 +0000 |
commit | cc5506a3ebc3a033c39d9ec9782ad9cbba56c8d1 (patch) | |
tree | b3a91499d5b181fd717f703726351e234971ea6c | |
parent | 6def15e34244c5b889f70724f0219afd16dbd6d4 (diff) | |
download | 2010-netlemmings-cc5506a3ebc3a033c39d9ec9782ad9cbba56c8d1.tar.gz 2010-netlemmings-cc5506a3ebc3a033c39d9ec9782ad9cbba56c8d1.tar.bz2 2010-netlemmings-cc5506a3ebc3a033c39d9ec9782ad9cbba56c8d1.zip |
Début d'intégration du chargement de la map dans le client. Amélioration de la machine à états, ajout de '-g' dans les paramètres de CMake
git-svn-id: file:///var/svn/2010-netlemmings/trunk@138 077b3477-7977-48bd-8428-443f22f7bfda
-rwxr-xr-x | doc/dependances-ubuntu.sh | 2 | ||||
-rw-r--r-- | sdl-test/SDL_tuto/TestParserLemmingsLVL/fonctions_non_integrees.c | 1 | ||||
-rw-r--r-- | src/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/netlem.c | 183 | ||||
-rw-r--r-- | src/netlem.h.in | 34 |
5 files changed, 159 insertions, 63 deletions
diff --git a/doc/dependances-ubuntu.sh b/doc/dependances-ubuntu.sh index 17f6801..385d854 100755 --- a/doc/dependances-ubuntu.sh +++ b/doc/dependances-ubuntu.sh @@ -1,2 +1,2 @@ #!/bin/sh -aptitude install libsdl1.2-dev libsdl-mixer1.2-dev libsdl-image1.2-dev libsdl-net1.2-dev libsdl-gfx1.2-dev +aptitude install libsdl1.2-dev libsdl-mixer1.2-dev libsdl-image1.2-dev libsdl-net1.2-dev libsdl-gfx1.2-dev bison flex cmake diff --git a/sdl-test/SDL_tuto/TestParserLemmingsLVL/fonctions_non_integrees.c b/sdl-test/SDL_tuto/TestParserLemmingsLVL/fonctions_non_integrees.c index 8d29498..26e1699 100644 --- a/sdl-test/SDL_tuto/TestParserLemmingsLVL/fonctions_non_integrees.c +++ b/sdl-test/SDL_tuto/TestParserLemmingsLVL/fonctions_non_integrees.c @@ -3161,6 +3161,7 @@ int lancement (){ //La structure d'evenement SDL_Event event; event.type=0; + //event.key.keysym.sym=0; //paint_stencil=1; diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a1741f8..52cff76 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -26,7 +26,7 @@ configure_file ( # add the binary tree to the search path for include files # so that we will find netlem.h and netlem_ds.h include_directories("${INCLUDE_DIRECTORIES}" "${PROJECT_BINARY_DIR}") -add_definitions(-Wall -Wextra -pedantic -Werror -std=c99) +add_definitions(-Wall -Wextra -pedantic -Werror -std=c99 -g) add_executable(netlem WIN32 netlem.c ${SRC_COMMON}) target_link_libraries(netlem SDL SDL_net) diff --git a/src/netlem.c b/src/netlem.c index 39b7913..beba79c 100644 --- a/src/netlem.c +++ b/src/netlem.c @@ -15,39 +15,30 @@ //TODO : Trucs brouillons à déplacer à terme typedef struct { - SDL_Rect screen; - -} gameConfig_t; - -typedef struct { - SDL_Surface *screen, *pTerrain, *pSpr_Lem, *pStencil, *pStencilFixe; - -} gameGraphics_t; - -typedef enum { - e_null, // Pseudo_state for getOrChangeState : do not change state, just return current state - e_launching, // Initial state, during system objects initialization - e_splash, // State for displaying Game Logo - e_menu_main, // State for main menu (next lines are sub-menus) - e_menu_options, // State for general options (screen resolution, music...) - e_menu_single, // State for single player options (level selection...) - e_menu_network_server, // State for network game server selection - e_menu_network_options, // State for network game options selection (level, players, speed...) - e_single_brief, // State for single player level briefing (number of Lemmings to save...) - e_single_game, // State for single player game (user is actually playing) - e_single_report, // State for single player game report (number of saved Lemmings, access code...) - e_multi_wait_start, // State for multi player level briefing and network synchronization - e_multi_game, // - e_multi_report, // - e_credits, // - e_end // State reached when this program is exiting -} state_t; + int todo; +} gameInit_t; // Fin trucs brouillon -struct _networkReadProc_args { client_t *client; int *tick; int *drift_ms; SDL_sem *semGameStart; }; +// Thread arguments structures +struct _networkReadProc_args { + client_t *client; + Uint32 *tick; + int *drift_ms; +}; + +struct _loadLevelProc_args { + serverParams_t *serverParams; + gameInit_t *gInit; + Uint8 *loadProgress; +}; + +// Material for thread synchronization and collaboration +SDL_sem *semGameStart; +SDL_sem *semLoadLevel; // Thread entry points int networkReadProc(void *a); +int loadLevelProc(void *a); // Client-specific functions void signals(int signum); @@ -61,16 +52,20 @@ int updateGraphics(); int main(int argc, char **argv) { - int drift_ms=0, tick=0, timeBefore_ms, delay_ms, result; + int drift_ms=0,result; + Uint32 tick=0, timeBefore_ms, delay_ms; + Uint8 loadProgress=0; client_t client; + serverParams_t serverParams; gameConfig_t conf; + gameInit_t gInit; gameGraphics_t graph; - struct _networkReadProc_args args; char logMsg[128]; + struct _networkReadProc_args args; + struct _loadLevelProc_args args2; - SDL_sem *semGameStart; IPaddress ip; if(argc!=2) { @@ -108,49 +103,67 @@ int main(int argc, char **argv) { // Synchronization tools intialization semGameStart=SDL_CreateSemaphore(0); + semLoadLevel=SDL_CreateSemaphore(0); // Network reader thread to process remote events and time sync args.client=&client; args.tick=&tick; args.drift_ms=&drift_ms; - args.semGameStart=semGameStart; SDL_Thread *networkReadThread = SDL_CreateThread(networkReadProc, &args); if(!networkReadThread) { logs2(LOG_ERROR,"main(), SDL_CreateThread()", SDL_GetError()); return 4; } - - //TODO : faire les menus et ne pas forcer ça ici - if ( getOrChangeState(e_multi_wait_start, client.sockClient) == e_null ) { - return 6; + // Worker thread for loading levels asynchronously (the thread begin with a SDL_Wait(semLevelLoadingStart)) + args2.serverParams=&serverParams; + args2.gInit=&gInit; + args2.loadProgress=&loadProgress; + SDL_Thread *loadLevelThread = SDL_CreateThread(loadLevelProc, &args2); + if(!loadLevelThread) { + logs2(LOG_ERROR,"getOrChangeState(), SDL_CreateThread()", SDL_GetError()); + return 4; //FIXME : autre num } - - logs(LOG_INFO, "Waiting game start"); - result=SDL_SemWait(semGameStart); - //FIXME Utiliser un SemWait avec un timeout de moins d'une seconde dans un while pour inclure la gestion des évènements (SQL_QUIT, touches clavier...) - //Enfait le besoin est plus compliqué : il faut toujours être dans la boucle events/action/refresh, mais les actions dépendent d'une machine à état (menus, attente jeu...) - if (result!=0) { - logs2(LOG_ERROR, "main(), SDL_SemWait()", SDL_GetError()); - return 7; + //TODO : faire les menus et ne pas forcer ça ici + if ( getOrChangeState(eMultiLoading, client.sockClient) == eNull ) { + return 6; } - logs(LOG_INFO, "Game started !"); // Main game loop - while(getOrChangeState(e_null,NULL)!=e_end) { + while(getOrChangeState(eNull,NULL)!=eEnd) { timeBefore_ms = SDL_GetTicks(); // Process local player keyboard and mouse events // (note: remote events are processed by network read thread) processLocalEvents(); - switch(getOrChangeState(e_null,NULL)) { - case e_single_game: - case e_multi_game: + switch(getOrChangeState(eNull,NULL)) { + case eMultiLoading: + printf("DEBUG : loadProgress==%i\n", loadProgress); + if(loadProgress==100) { + getOrChangeState(eMultiWaitLoading,client.sockClient); + } + break; + case eMultiWaitLoading: + result=SDL_SemTryWait(semGameStart); + switch (result) { + case -1: + logs2(LOG_ERROR, "main(), SDL_SemTryWaitTimeout()", SDL_GetError()); + return 7; + break; + case 0: + getOrChangeState(eMultiGame,NULL); + break; + default: + break; + } + break; + case eSingleGame: + case eMultiGame: // Make game evolve from the current state to the next time chunk (ie. frame, or tick) play(tick++); - break; + break; default: break; } @@ -175,23 +188,43 @@ int main(int argc, char **argv) { state_t getOrChangeState(state_t s, TCPsocket sockClient) { const event_t evReady = {0,0,0,eReady,0,0,NULL,NULL}; - static state_t state=e_launching; + static state_t state=eLaunching; int result; switch(s) { - case e_multi_wait_start: + case eMultiLoading: + //TODO : check current state before switching + logs(LOG_INFO, "Start game loading"); + result=SDL_SemPost(semLoadLevel); + if (result!=0) { + logs2(LOG_ERROR, "getOrChangeState()", SDL_GetError()); + return eNull; + } + + state=s; + break; + case eMultiWaitLoading: //TODO : check current state before switching + // Say to the server that we are ready to start the game and wait game start result=sendEvent(sockClient, &evReady); - if (result!=0) return e_null; - + if (result!=0) return eNull; + + state=s; + break; + case eMultiGame: + //TODO : check current state before switching + logs(LOG_INFO, "Game started !"); state=s; - case e_end: + break; + case eEnd: state=s; - case e_null: + break; + + case eNull: break; default: - return e_null; + return eNull; } return state; @@ -204,7 +237,7 @@ void signals(int signum) { logs(LOG_WARN, buf); if(!force) { - getOrChangeState(e_end,NULL); + getOrChangeState(eEnd,NULL); force=1; logs(LOG_WARN, "Trying to stop smoothly..."); } else { @@ -281,12 +314,12 @@ int networkReadProc(void *a) { struct _networkReadProc_args *args = (struct _networkReadProc_args *)a; - while( getOrChangeState(e_null,NULL) != e_end ) { + while( getOrChangeState(eNull,NULL) != eEnd ) { // logs(LOG_DEBUG, "Waiting event"); result=receiveEvent(args->client,&e); if (result != 0) { logs(LOG_WARN, "networkReadProc(), receiveEvents() error"); - getOrChangeState(e_end,NULL); + getOrChangeState(eEnd,NULL); continue; //TODO : je doute que ça skipe vriament la syncrho du temps :s } // logs(LOG_DEBUG, "Got event"); @@ -296,7 +329,7 @@ int networkReadProc(void *a) { logs(LOG_DEBUG, logMsg); - result=SDL_SemPost(args->semGameStart); + result=SDL_SemPost(semGameStart); if (result!=0) { logs2(LOG_ERROR, "main(), SDL_SemPost()", SDL_GetError()); return 1; @@ -318,6 +351,34 @@ int networkReadProc(void *a) { return 0; } +int loadLevelProc(void *a) { + int result,i; + //char logMsg[128]; + + struct _loadLevelProc_args *args = (struct _loadLevelProc_args *)a; + + logs(LOG_WARN, "loadLevelProc(), beginnng"); + while( getOrChangeState(eNull,NULL) != eEnd ) { + result=SDL_SemWait(semLoadLevel); + if (result!=0) { + logs2(LOG_ERROR, "main(), SDL_SemTryWaitTimeout()", SDL_GetError()); + + } + + logs(LOG_WARN, "loadLevelProc(), start load level"); + for(i=0;i<100;i+=(rand()%10)) { + SDL_Delay(rand()%100); + *(args->loadProgress)=i; + } + *(args->loadProgress)=100; + logs(LOG_WARN, "loadLevelProc(), end load level"); + + } + logs(LOG_WARN, "loadLevelProc(), end thread"); + + return 0; +} + void processLocalEvents() { /*TODO : intégration des variables manipulées dans des structs qui vont bien while( SDL_PollEvent( &event ) ) { diff --git a/src/netlem.h.in b/src/netlem.h.in index d7729aa..512746e 100644 --- a/src/netlem.h.in +++ b/src/netlem.h.in @@ -8,5 +8,39 @@ #define SCREEN_BPP 24 #define WIN_CAPTION "NetLemmings v@NetLemmings_VERSION_MAJOR@.@NetLemmings_VERSION_MINOR@" +typedef enum { + eNull, // Pseudo_state for getOrChangeState : do not change state, just return current state + eLaunching, // Initial state, during system objects initialization + eSplash, // State for displaying Game Logo + eMenuMain, // State for main menu (next lines are sub-menus) + eMenuOptions, // State for general options (screen resolution, music...) + eMenuSingle, // State for single player options (level selection...) + eMenuMultiChooseServer, // State for network game server selection + eMenuMultiChooseOptions, // State for network game options selection (level, players, speed...) + eMultiWaitPlayers, // State for + eMultiLoading, // + eMultiWaitLoading, // + eMultiGame, // + eMultiReport, // + eSingleBrief, // State for single player level briefing (number of Lemmings to save...) + eSingleGame, // State for single player game (user is actually playing) + eSingleReport, // State for single player game report (number of saved Lemmings, access code...) + eCredits, // + eEnd // State reached when this program is exiting +} state_t; + +typedef struct { + SDL_Rect screen; + +} gameConfig_t; + +typedef struct { + SDL_Surface *screen, *pTerrain, *pSpr_Lem, *pStencil, *pStencilFixe; + +} gameGraphics_t; + +typedef struct { + id_t level; +} serverParams_t; #endif /*NETLEM_H*/ |