From c1961c3669397b003df82ada7df14f3069b9beae Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Thu, 25 Jul 2013 17:58:43 +0200 Subject: Separation de quelques elemnts qui etaients un peu melanges en vue d'avancer sur ./testplay --- Makefile.am | 2 +- src/gamelogic.c | 7 +++++++ src/gameui.c | 25 ++++++++++++++++--------- src/graphic.c | 35 ++++++++++++++++++----------------- src/include/data_game.h | 38 ++++++++++++++++---------------------- src/include/data_ui.h | 38 ++++++++++++++++++++++++++++++++++++++ src/include/gamelogic.h | 10 ++++++++++ src/include/gameui.h | 9 +++------ src/include/graphic.h | 6 ++++-- src/test/testplay.c | 45 +++++++++++++-------------------------------- src/test/testrender.c | 48 +++++++++++++++++++++++++----------------------- 11 files changed, 151 insertions(+), 112 deletions(-) create mode 100644 src/gamelogic.c create mode 100644 src/include/data_ui.h create mode 100644 src/include/gamelogic.h diff --git a/Makefile.am b/Makefile.am index 4be3e49..78203fc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -10,7 +10,7 @@ noinst_PROGRAMS = sbmoose sbsprite sbspritegif testparseall testrender testplay AM_CFLAGS = -Wall -Werror -I src/include/ -I src/minini/dev/ $(DEPS_CFLAGS) LIBS = $(DEPS_LIBS) PARSER_MODULES = src/minini/dev/minIni.c src/minini/dev/my_SDL_stdinc.c src/parser.c -LOCALGAME_MODULES = $(PARSER_MODULES) src/loader.c src/graphic.c src/gameui.c +LOCALGAME_MODULES = $(PARSER_MODULES) src/loader.c src/graphic.c src/gameui.c src/gamelogic.c # Per target specs mplemmings_SOURCES = src/mplemmings.c diff --git a/src/gamelogic.c b/src/gamelogic.c new file mode 100644 index 0000000..d537fde --- /dev/null +++ b/src/gamelogic.c @@ -0,0 +1,7 @@ +#include "gamelogic.h" + +int setInitialState(gameIni_t *gIni, gameState_t *gState) { + //FIXME : all lemmings states, skill counters... + return 0; +} + diff --git a/src/gameui.c b/src/gameui.c index 1800af7..24eb9e0 100644 --- a/src/gameui.c +++ b/src/gameui.c @@ -1,16 +1,23 @@ #include "gameui.h" -int setInitialState(gameIni_t *gIni, gameState_t *gState) { - gState->cameraX = gIni->level.xPos; - //FIXME : all lemmings states, skill counters... - return 0; -} +#define SET_RENDER_ITEM(item,sp,px,py,f,abs,curid,mouseevt) \ +do { \ + item.sprite = sp; \ + item.x = px; item.y = py; \ + item.currframe = f; \ + item.absolute = abs; \ + item.onhovercursorid = curid; \ + item.onmousebuttonevent_proc = mouseevt; \ +} while(0) + +int buildGameRenderList(gameRess_t *gRess, gameUI_t *gUI) { + int cur=0; -int buildRenderList(gameIni_t *gIni, gameRess_t *gRess, gameState_t *gState) { - return -1; //FIXME : Not yet implemented -} + SET_RENDER_ITEM(gUI->renderList[cur++],&gUI->terrainSprite,0,0,0,0,0,NULL); -void disposeRenderList(gameState_t *gState) { + SET_RENDER_ITEM(gUI->renderList[cur++],&gRess->cursor,0,0,0,0,0,NULL); + return 0; } + diff --git a/src/graphic.c b/src/graphic.c index 54a7bd1..8c995b3 100644 --- a/src/graphic.c +++ b/src/graphic.c @@ -204,11 +204,11 @@ int paintTerrain(gameIni_t *gIni, gameRess_t *gRess, gameState_t *gState) { return 0; } -int renderTerrainToTexture(SDL_Renderer *rend, gameState_t *gState) { +int renderTerrainToTextures(SDL_Renderer *rend, SDL_Surface *terrain, gameUI_t *gUI) { int res, pitch; SDL_Rect src_rect, dst_rect; SDL_Surface *tmp_surf; - SDL_PixelFormat *pf = gState->terrain->format; + SDL_PixelFormat *pf = terrain->format; Uint32 *pixels; tmp_surf = SDL_CreateRGBSurface(0,MPL_WIN_W, LEVEL_HEIGHT, @@ -221,7 +221,7 @@ int renderTerrainToTexture(SDL_Renderer *rend, gameState_t *gState) { "Can't SDL_CreateRGBSurface() for converting terrain" ); - src_rect.x=gState->cameraX; + src_rect.x=gUI->cameraX; src_rect.y=0; src_rect.w=MPL_WIN_W; src_rect.h=LEVEL_HEIGHT; @@ -229,7 +229,7 @@ int renderTerrainToTexture(SDL_Renderer *rend, gameState_t *gState) { dst_rect=src_rect; dst_rect.x=0; - res = SDL_BlitSurface(gState->terrain, &src_rect, tmp_surf, &dst_rect); + res = SDL_BlitSurface(terrain, &src_rect, tmp_surf, &dst_rect); MPL_CHECK( res==0, { SDL_FreeSurface(tmp_surf); return 2; }, @@ -237,23 +237,23 @@ int renderTerrainToTexture(SDL_Renderer *rend, gameState_t *gState) { "Can't SDL_BlitSurface(terrain,...)" ); - if (gState->terrainSprite.t == NULL) { - gState->terrainSprite.t = SDL_CreateTexture(rend, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, dst_rect.w, dst_rect.h); + if (gUI->terrainSprite.t == NULL) { + gUI->terrainSprite.t = SDL_CreateTexture(rend, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, dst_rect.w, dst_rect.h); MPL_CHECK( - gState->terrainSprite.t, + gUI->terrainSprite.t, { SDL_FreeSurface(tmp_surf); return 3; }, SDL_LOG_PRIORITY_CRITICAL, "Can't SDL_CreateTexture for terrainSprite" ); - gState->terrainSprite.size = dst_rect; - gState->terrainSprite.frames = 1; + gUI->terrainSprite.size = dst_rect; + gUI->terrainSprite.frames = 1; } - res=SDL_LockTexture(gState->terrainSprite.t, NULL, (void **)&pixels, &pitch); + res=SDL_LockTexture(gUI->terrainSprite.t, NULL, (void **)&pixels, &pitch); MPL_CHECK( (res==0) && (pitch == dst_rect.w * sizeof(Uint32)), { SDL_FreeSurface(tmp_surf); - SDL_UnlockTexture(gState->terrainSprite.t); + SDL_UnlockTexture(gUI->terrainSprite.t); return 3; }, SDL_LOG_PRIORITY_CRITICAL, @@ -261,27 +261,28 @@ int renderTerrainToTexture(SDL_Renderer *rend, gameState_t *gState) { ); (void) SDL_memcpy(pixels, tmp_surf->pixels, dst_rect.h * pitch); - SDL_UnlockTexture(gState->terrainSprite.t); + SDL_UnlockTexture(gUI->terrainSprite.t); SDL_FreeSurface(tmp_surf); -// SDL_DestroyTexture(gState->terrainSprite.t); //TODO mais pas ici !! +// SDL_DestroyTexture(gUI->terrainSprite.t); //TODO mais pas ici !! + //TODO : faire le rendu de la minimap aussi return 0; } -int renderSprites(SDL_Renderer *rend, gameState_t *gState) { +int renderSprites(SDL_Renderer *rend, gameUI_t *gUI) { int i, res; SDL_Rect src,dst; - renderItem_t *renderList = gState->renderList; + renderItem_t *renderList = gUI->renderList; - for(i=0,res=0 ; i < gState->renderListSize && res==0 ; i++) { + for(i=0,res=0 ; i < gUI->renderListSize && res==0 ; i++) { src = dst = renderList[i].sprite->size; src.y = src.h * renderList[i].currframe; if ( renderList[i].absolute ) { dst.x = renderList[i].x; } else { - dst.x = renderList[i].x - gState->cameraX; + dst.x = renderList[i].x - gUI->cameraX; } dst.y = renderList[i].y; res=SDL_RenderCopy(rend, renderList[i].sprite->t, &src, &dst); diff --git a/src/include/data_game.h b/src/include/data_game.h index c3d4266..64b3827 100644 --- a/src/include/data_game.h +++ b/src/include/data_game.h @@ -3,39 +3,33 @@ #include -#define MAX_RENDERLIST_SIZE 256 +#include "data_ress.h" + +#define MAX_LEMMINGS_COUNT 100 /* Should be used also by the parser... */ typedef struct { - sprite_t *sprite; - int currframe; - int animate; /* Is currently animating ? */ - int x,y; - int absolute; /* 0 if level-based coords, 1 if camera-based */ - int onhovercursorid; - void (*onmousebuttonevent_proc)(Uint8 button, Uint8 state, void *userptr); + void *todo; + /* role, state, animframe... */ +} lemming_t; -} renderItem_t; +enum skills { + sk_climber=0, sk_floater, sk_blocker, sk_bomber, sk_builder, + sk_basher, sk_miner, sk_digger, sk_count +}; typedef struct { - /* Game frame counter */ + /* Game time counter */ int tick; - /* Current camera position */ - int cameraX; /* terrain & stencil - generated by paint_terrain() - update by ???() */ + generated by paintTerrain() + updated by ???() */ SDL_Surface *terrain, *stencil; - /* streamTerrain : viewable portion of terrain, in texture format - updated by render_terrain() */ - sprite_t terrainSprite; + lemming_t lemmings[MAX_LEMMINGS_COUNT]; + int remSkills[sk_count]; + int currReleaseRate; - /* Render list of all in-game sprites (for batch processing) - Items are in paint order - created by buildRenderList() */ - int renderListSize; - renderItem_t renderList[MAX_RENDERLIST_SIZE]; } gameState_t; #endif /*DATA_GAME_H*/ diff --git a/src/include/data_ui.h b/src/include/data_ui.h new file mode 100644 index 0000000..b8e83f8 --- /dev/null +++ b/src/include/data_ui.h @@ -0,0 +1,38 @@ +#ifndef DATA_UI_H +#define DATA_UI_H +#include + +#include "data_ress.h" + +#define MAX_RENDERLIST_SIZE 256 + +typedef struct { + sprite_t *sprite; + int currframe; + int animate; /* Is currently animating ? */ + int x,y; + int absolute; /* 0 if level-based coords, 1 if camera-based */ + int onhovercursorid; + void (*onmousebuttonevent_proc)(Uint8 button, Uint8 state, void *userptr); +} renderItem_t; + +typedef struct { + /* Render list of all in-game sprites (for batch processing) + Items are in paint order + created by buildRenderList() */ + int renderListSize; + renderItem_t renderList[MAX_RENDERLIST_SIZE]; + + /* Current camera position */ + int cameraX; + + /* streamTerrain : viewable portion of terrain, in texture format + updated by renderTerraiToTexture() */ + sprite_t terrainSprite; + + int remainingTime; + int numLemmOut; +} gameUI_t; + + +#endif /*DATA_UI_H*/ diff --git a/src/include/gamelogic.h b/src/include/gamelogic.h new file mode 100644 index 0000000..eb66999 --- /dev/null +++ b/src/include/gamelogic.h @@ -0,0 +1,10 @@ +#ifndef GAMELOGIC_H +#define GAMELOGIC_H +#include + +#include "data_ini.h" +#include "data_game.h" + +int setInitialState(gameIni_t *gIni, gameState_t *gState); + +#endif /*GAMELOGIC_H*/ diff --git a/src/include/gameui.h b/src/include/gameui.h index e36bc8c..92fa985 100644 --- a/src/include/gameui.h +++ b/src/include/gameui.h @@ -2,14 +2,11 @@ #define GAMEUI_H #include -#include "data_ini.h" #include "data_ress.h" -#include "data_game.h" - -int setInitialState(gameIni_t *gIni, gameState_t *gState); +#include "data_ui.h" /* Create list of all in-game sprite to render (for batch processing) */ -int buildRenderList(gameIni_t *gIni, gameRess_t *gRess, gameState_t *gState); -void disposeRenderList(gameState_t *gState); +int buildGameRenderList(gameRess_t *gRess, gameUI_t *gUI); + #endif /*GAMEUI_H*/ diff --git a/src/include/graphic.h b/src/include/graphic.h index b85d516..f1727ec 100644 --- a/src/include/graphic.h +++ b/src/include/graphic.h @@ -8,13 +8,15 @@ #include "data_ini.h" #include "data_ress.h" #include "data_game.h" +#include "data_ui.h" +//XXX : faire un struct dans gameUI_t pour les paramètres de sorte de ce bouzin ? int mySDLInit(char title[], SDL_Rect win_pos, Uint32 init_flags, Uint32 win_flags, Uint32 rend_flags, SDL_Window **win, SDL_Renderer **rend, SDL_RendererInfo *rend_info, SDL_Rect *viewport); int paintTerrain(gameIni_t *gIni, gameRess_t *gRess, gameState_t *gState); -int renderTerrainToTexture(SDL_Renderer *rend, gameState_t *gState); -int renderSprites(SDL_Renderer *rend, gameState_t *gState); +int renderTerrainToTextures(SDL_Renderer *rend, SDL_Surface *terrain, gameUI_t *gUI); +int renderSprites(SDL_Renderer *rend, gameUI_t *gUI); #endif /*GRAPHIC_H*/ diff --git a/src/test/testplay.c b/src/test/testplay.c index 1d63335..1d32104 100644 --- a/src/test/testplay.c +++ b/src/test/testplay.c @@ -1,4 +1,5 @@ #include "gameui.h" +#include "gamelogic.h" #include "graphic.h" #include "loader.h" #include "utils.h" @@ -9,6 +10,7 @@ int main(int argc, char **argv) { gameIni_t gIni; gameRess_t gRess; gameState_t gState; + gameUI_t gUI; SDL_Window *win; SDL_Renderer *rend; @@ -37,6 +39,7 @@ int main(int argc, char **argv) { SDL_memset(&gIni,0,sizeof(gameIni_t)); SDL_memset(&gRess,0,sizeof(gameRess_t)); SDL_memset(&gState,0,sizeof(gameState_t)); + SDL_memset(&gUI,0,sizeof(gameUI_t)); res=loadLevel(DATA_BASEPATH, argv[1], argv[2], &gIni); if (res!=0) exit(res); @@ -48,9 +51,12 @@ int main(int argc, char **argv) { res=loadStyleRes(rend, &gIni, &gRess); if (res!=0) exit(res); res=setInitialState(&gIni, &gState); if (res!=0) exit(res); + gUI.cameraX = gIni.level.xPos; + res=paintTerrain(&gIni, &gRess, &gState); if (res!=0) exit(res); - res=renderTerrainToTexture(rend, &gState); if (res!=0) exit(res); - res=buildRenderList(&gIni, &gRess, &gState); if (res!=0) exit(res); + res=renderTerrainToTextures(rend, gState.terrain, &gUI); + if (res!=0) exit(res); + res=buildGameRenderList(&gRess, &gUI) ;if (res!=0) exit(res); /* Main render loop */ uiTick = 0; @@ -64,27 +70,26 @@ int main(int argc, char **argv) { } } - (void) renderTerrainToTexture(rend, &gState); + (void) renderTerrainToTextures(rend, gState.terrain, &gUI); SDL_RenderClear(rend); - (void) renderSprites(rend, &gState); + (void) renderSprites(rend, &gUI); SDL_RenderPresent(rend); if (uiTick % 4 == 0) { int i; gState.tick++; - for (i=0;ianimate==1) { it->currframe = (it->currframe + 1) % it->sprite->frames; } } } SDL_Delay(25); - gState.cameraX = (gState.cameraX + 1) % (LEVEL_WIDTH - MPL_WIN_W); + gUI.cameraX = (gUI.cameraX + 1) % (LEVEL_WIDTH - MPL_WIN_W); uiTick++; } - disposeRenderList(&gState); unloadStyleRes(&gRess); unloadMiscRes(&gRess); @@ -128,27 +133,3 @@ int addRLitem(renderItem_t list[], sprite_t *it, int rlMaxLen) { return cur; } -int buildTestRL(gameRess_t *gRess, gameState_t *gState, int rlMaxLen, renderItem_t renderList[]) { - int i, rlLen; - - rlLen=addRLitem(renderList, &gState->terrainSprite, rlMaxLen); - rlLen=addRLitem(renderList, NULL, rlMaxLen); - - for (i=0; ilemmingAnims[i], rlMaxLen); - } - rlLen=addRLitem(renderList, NULL, rlMaxLen); - - for (i=0; iobjects[i], rlMaxLen); - } - rlLen=addRLitem(renderList, NULL, rlMaxLen); - - rlLen=addRLitem(renderList, &gRess->font1, rlMaxLen); - rlLen=addRLitem(renderList, &gRess->font2, rlMaxLen); - rlLen=addRLitem(renderList, &gRess->countdown, rlMaxLen); - rlLen=addRLitem(renderList, &gRess->cursor, rlMaxLen); - - return rlLen; -} - diff --git a/src/test/testrender.c b/src/test/testrender.c index b8dc500..c46263d 100644 --- a/src/test/testrender.c +++ b/src/test/testrender.c @@ -5,12 +5,13 @@ #define DATA_BASEPATH "./data" -int buildTestRL(gameRess_t *gRess, gameState_t *gState, int rlMaxLen, renderItem_t renderList[]); +int buildTestRL(gameRess_t *gRess, gameUI_t *gUI, int rlMaxLen); int main(int argc, char **argv) { gameIni_t gIni; gameRess_t gRess; gameState_t gState; + gameUI_t gUI; SDL_Window *win; SDL_Renderer *rend; @@ -39,6 +40,7 @@ int main(int argc, char **argv) { SDL_memset(&gIni,0,sizeof(gameIni_t)); SDL_memset(&gRess,0,sizeof(gameRess_t)); SDL_memset(&gState,0,sizeof(gameState_t)); + SDL_memset(&gUI,0,sizeof(gameUI_t)); res=loadLevel(DATA_BASEPATH, argv[1], argv[2], &gIni); if (res!=0) exit(res); @@ -46,21 +48,21 @@ int main(int argc, char **argv) { res=mySDLInit(__FILE__, winPos, initFlags, winFlags, rendFlags, &win, &rend, &rendInfo, &viewport); if (res!=0) exit(res); - res=loadMiscRes(rend, &gIni, &gRess); if (res!=0) exit(res); + res=loadMiscRes (rend, &gIni, &gRess); if (res!=0) exit(res); res=loadStyleRes(rend, &gIni, &gRess); if (res!=0) exit(res); res=paintTerrain(&gIni, &gRess, &gState); if (res!=0) exit(res); - res=renderTerrainToTexture(rend, &gState); if (res!=0) exit(res); + res=renderTerrainToTextures(rend, gState.terrain, &gUI); + if (res!=0) exit(res); - gState.renderListSize=buildTestRL(&gRess, &gState, MAX_RENDERLIST_SIZE, gState.renderList); - gState.cameraX = gIni.level.xPos; + gUI.renderListSize=buildTestRL(&gRess, &gUI, MAX_RENDERLIST_SIZE); + gUI.cameraX = gIni.level.xPos; /* Main render loop */ uiTick = 0; mainLoopEnd = 0; while (!mainLoopEnd) { - int i; /* Check for events */ while (SDL_PollEvent(&uiEvent)) { @@ -69,26 +71,26 @@ int main(int argc, char **argv) { } } - (void) renderTerrainToTexture(rend, &gState); + (void) renderTerrainToTextures(rend, gState.terrain, &gUI); SDL_RenderClear(rend); - (void) renderSprites(rend, &gState); + (void) renderSprites(rend, &gUI); SDL_RenderPresent(rend); if (uiTick % 4 == 0) { + int i; gState.tick++; - for (i=0;ianimate==1) { it->currframe = (it->currframe + 1) % it->sprite->frames; } } } SDL_Delay(25); - gState.cameraX = (gState.cameraX + 1) % (LEVEL_WIDTH - MPL_WIN_W); + gUI.cameraX = (gUI.cameraX + 1) % (LEVEL_WIDTH - MPL_WIN_W); uiTick++; } - disposeRenderList(&gState); unloadStyleRes(&gRess); unloadMiscRes(&gRess); @@ -132,26 +134,26 @@ int addRLitem(renderItem_t list[], sprite_t *it, int rlMaxLen) { return cur; } -int buildTestRL(gameRess_t *gRess, gameState_t *gState, int rlMaxLen, renderItem_t renderList[]) { +int buildTestRL(gameRess_t *gRess, gameUI_t *gUI, int rlMaxLen) {; int i, rlLen; - rlLen=addRLitem(renderList, &gState->terrainSprite, rlMaxLen); - rlLen=addRLitem(renderList, NULL, rlMaxLen); + rlLen=addRLitem(gUI->renderList, &gUI->terrainSprite, rlMaxLen); + rlLen=addRLitem(gUI->renderList, NULL, rlMaxLen); for (i=0; ilemmingAnims[i], rlMaxLen); + rlLen=addRLitem(gUI->renderList, &gRess->lemmingAnims[i], rlMaxLen); } - rlLen=addRLitem(renderList, NULL, rlMaxLen); + rlLen=addRLitem(gUI->renderList, NULL, rlMaxLen); for (i=0; iobjects[i], rlMaxLen); + rlLen=addRLitem(gUI->renderList, &gRess->objects[i], rlMaxLen); } - rlLen=addRLitem(renderList, NULL, rlMaxLen); + rlLen=addRLitem(gUI->renderList, NULL, rlMaxLen); - rlLen=addRLitem(renderList, &gRess->font1, rlMaxLen); - rlLen=addRLitem(renderList, &gRess->font2, rlMaxLen); - rlLen=addRLitem(renderList, &gRess->countdown, rlMaxLen); - rlLen=addRLitem(renderList, &gRess->cursor, rlMaxLen); + rlLen=addRLitem(gUI->renderList, &gRess->font1, rlMaxLen); + rlLen=addRLitem(gUI->renderList, &gRess->font2, rlMaxLen); + rlLen=addRLitem(gUI->renderList, &gRess->countdown, rlMaxLen); + rlLen=addRLitem(gUI->renderList, &gRess->cursor, rlMaxLen); return rlLen; } -- cgit v1.2.3