From 23d9d1d3e1b9cc2efd80ad8e2f0480623858cdab Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Thu, 25 Jul 2013 23:28:05 +0200 Subject: Debut de renderlist du vrai jeu, choix d'accéder aux items de l'IU via la renderlist, avec des index fixés par un enum. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gameui.c | 24 ++++++++++++------------ src/graphic.c | 4 +++- src/include/data_ui.h | 12 +++++++----- src/test/testplay.c | 29 ++++++++++++++++++++++------- src/test/testrender.c | 6 +++--- 5 files changed, 47 insertions(+), 28 deletions(-) diff --git a/src/gameui.c b/src/gameui.c index 24eb9e0..fa96244 100644 --- a/src/gameui.c +++ b/src/gameui.c @@ -1,21 +1,21 @@ #include "gameui.h" -#define SET_RENDER_ITEM(item,sp,px,py,f,abs,curid,mouseevt) \ +#define SET_RENDER_ITEM(idx,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; \ + gUI->renderList[idx].sprite = &(sp); \ + gUI->renderList[idx].x = px; \ + gUI->renderList[idx].y = py; \ + gUI->renderList[idx].currframe = f; \ + gUI->renderList[idx].absolute = abs; \ + gUI->renderList[idx].onhovercursorid = curid; \ + gUI->renderList[idx].onmousebuttonevent_proc = mouseevt; \ } while(0) - -int buildGameRenderList(gameRess_t *gRess, gameUI_t *gUI) { - int cur=0; - SET_RENDER_ITEM(gUI->renderList[cur++],&gUI->terrainSprite,0,0,0,0,0,NULL); - SET_RENDER_ITEM(gUI->renderList[cur++],&gRess->cursor,0,0,0,0,0,NULL); +int buildGameRenderList(gameRess_t *gRess, gameUI_t *gUI) { + SET_RENDER_ITEM(RLI_terrain, gUI->terrainSprite,0,0,0,1,0,NULL); + + SET_RENDER_ITEM(RLI_cursor, gRess->cursor,0,0,0,1,0,NULL); return 0; } diff --git a/src/graphic.c b/src/graphic.c index 8c995b3..b01714e 100644 --- a/src/graphic.c +++ b/src/graphic.c @@ -276,7 +276,9 @@ int renderSprites(SDL_Renderer *rend, gameUI_t *gUI) { renderItem_t *renderList = gUI->renderList; - for(i=0,res=0 ; i < gUI->renderListSize && res==0 ; i++) { + for(i=0,res=0 ; i < MAX_RENDERLIST_SIZE && res==0 ; i++) { + if (renderList[i].sprite == NULL) continue; + src = dst = renderList[i].sprite->size; src.y = src.h * renderList[i].currframe; if ( renderList[i].absolute ) { diff --git a/src/include/data_ui.h b/src/include/data_ui.h index b8e83f8..8f96d48 100644 --- a/src/include/data_ui.h +++ b/src/include/data_ui.h @@ -16,22 +16,24 @@ typedef struct { void (*onmousebuttonevent_proc)(Uint8 button, Uint8 state, void *userptr); } renderItem_t; +enum gameRLIdx {RLI_terrain=0, RLI_lem0, RLI_cursor=MAX_RENDERLIST_SIZE-1}; + 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]; + /* Various */ + /* Current camera position */ int cameraX; - /* streamTerrain : viewable portion of terrain, in texture format - updated by renderTerraiToTexture() */ + /* Viewable portion of terrain, see renderTerrainToTextures() */ sprite_t terrainSprite; - int remainingTime; - int numLemmOut; + /* Computed or accumalted values from gameState_t infos */ + int remainingTime, numLemmOut; } gameUI_t; diff --git a/src/test/testplay.c b/src/test/testplay.c index 1d32104..aa73ec8 100644 --- a/src/test/testplay.c +++ b/src/test/testplay.c @@ -45,18 +45,21 @@ int main(int argc, char **argv) { if (res!=0) exit(res); res=mySDLInit(__FILE__, winPos, initFlags, winFlags, rendFlags, &win, &rend, &rendInfo, &viewport); + SDL_ShowCursor(SDL_DISABLE); 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=setInitialState(&gIni, &gState); if (res!=0) exit(res); + gUI.cameraX = gIni.level.xPos; - - res=paintTerrain(&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); + + res=buildGameRenderList(&gRess, &gUI); if (res!=0) exit(res); /* Main render loop */ uiTick = 0; @@ -65,8 +68,20 @@ int main(int argc, char **argv) { /* Check for events */ while (SDL_PollEvent(&uiEvent)) { - if (uiEvent.type == SDL_QUIT) { - mainLoopEnd = 1; + switch (uiEvent.type) { + renderItem_t *cur; + case SDL_QUIT: + mainLoopEnd = 1; + break; + case SDL_MOUSEMOTION: + cur = &gUI.renderList[RLI_cursor]; + cur->x = uiEvent.motion.x - cur->sprite->size.w / 2; + cur->y = uiEvent.motion.y - cur->sprite->size.h / 2; + break; + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + //uiEvent.button + break; } } @@ -79,9 +94,9 @@ int main(int argc, char **argv) { if (uiTick % 4 == 0) { int i; gState.tick++; - for (i=0;ianimate==1) { + if ( it->sprite != NULL && it->animate==1) { it->currframe = (it->currframe + 1) % it->sprite->frames; } } diff --git a/src/test/testrender.c b/src/test/testrender.c index c46263d..028b31b 100644 --- a/src/test/testrender.c +++ b/src/test/testrender.c @@ -19,7 +19,7 @@ int main(int argc, char **argv) { SDL_Rect viewport; SDL_Event uiEvent; - int res, mainLoopEnd, uiTick; + int res, mainLoopEnd, uiTick, renderListSize; Uint32 initFlags = SDL_INIT_TIMER|SDL_INIT_VIDEO; Uint32 winFlags = SDL_WINDOW_SHOWN; @@ -55,7 +55,7 @@ int main(int argc, char **argv) { res=renderTerrainToTextures(rend, gState.terrain, &gUI); if (res!=0) exit(res); - gUI.renderListSize=buildTestRL(&gRess, &gUI, MAX_RENDERLIST_SIZE); + renderListSize=buildTestRL(&gRess, &gUI, MAX_RENDERLIST_SIZE); gUI.cameraX = gIni.level.xPos; @@ -80,7 +80,7 @@ int main(int argc, char **argv) { if (uiTick % 4 == 0) { int i; gState.tick++; - for (i=0;ianimate==1) { it->currframe = (it->currframe + 1) % it->sprite->frames; -- cgit v1.2.3