From 5449f88e7f7d3ca51435f1ea7fb3ea2cdea72bc8 Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Fri, 26 Jul 2013 15:25:49 +0200 Subject: Debut gestion evenements souris. Un clic et ca lance un event. Le curseur se change... La zone n'est pas bonne encore mais le code est là. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gameui.c | 25 ++++++++++++++++++++++++- src/graphic.c | 22 ++++++++++++---------- src/include/data_ui.h | 12 ++++++++---- src/include/gameui.h | 2 ++ src/test/testplay.c | 23 +++++++++++++++++------ 5 files changed, 63 insertions(+), 21 deletions(-) diff --git a/src/gameui.c b/src/gameui.c index fa96244..c099e45 100644 --- a/src/gameui.c +++ b/src/gameui.c @@ -11,13 +11,36 @@ do { \ gUI->renderList[idx].onmousebuttonevent_proc = mouseevt; \ } while(0) +void testevent(struct _renderItem_t *self, Uint8 button, Uint8 state, gameState_t *gState) { + printf("BLAH !\n"); +} 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_terrain, gUI->terrainSprite,0,0,0,1,2,NULL); + + SET_RENDER_ITEM(RLI_lem0, gRess->lemmingAnims[0],700,200,0,0,5,testevent); SET_RENDER_ITEM(RLI_cursor, gRess->cursor,0,0,0,1,0,NULL); + gUI->cursor = &gUI->renderList[RLI_cursor]; return 0; } +renderItem_t * findActionnableItemUnderCursor(gameUI_t *gUI) { + int i; + for (i=MAX_RENDERLIST_SIZE-1; i>=0; i--) { + if ( gUI->renderList[i].onmousebuttonevent_proc ) { + SDL_Rect curhot; + curhot.x=gUI->cursor->x + gUI->cursor->sprite->size.w / 2; + curhot.y=gUI->cursor->y + gUI->cursor->sprite->size.h / 2; + curhot.w=1; curhot.h=1; + + if ( SDL_HasIntersection(&curhot, &gUI->renderList[i].lastDstRect) ) { + return &gUI->renderList[i]; + } + } + } + + return NULL; +} diff --git a/src/graphic.c b/src/graphic.c index b01714e..39bf44e 100644 --- a/src/graphic.c +++ b/src/graphic.c @@ -273,21 +273,23 @@ int renderTerrainToTextures(SDL_Renderer *rend, SDL_Surface *terrain, gameUI_t * int renderSprites(SDL_Renderer *rend, gameUI_t *gUI) { int i, res; SDL_Rect src,dst; - - renderItem_t *renderList = gUI->renderList; + renderItem_t *it; for(i=0,res=0 ; i < MAX_RENDERLIST_SIZE && res==0 ; i++) { - if (renderList[i].sprite == NULL) continue; + it = &gUI->renderList[i]; + if (it->sprite == NULL) continue; - src = dst = renderList[i].sprite->size; - src.y = src.h * renderList[i].currframe; - if ( renderList[i].absolute ) { - dst.x = renderList[i].x; + src = dst = it->sprite->size; + src.y = src.h * it->currframe; + if ( it->absolute ) { + dst.x = it->x; } else { - dst.x = renderList[i].x - gUI->cameraX; + dst.x = it->x - gUI->cameraX; } - dst.y = renderList[i].y; - res=SDL_RenderCopy(rend, renderList[i].sprite->t, &src, &dst); + dst.y = it->y; + + it->lastDstRect = dst; + res=SDL_RenderCopy(rend, it->sprite->t, &src, &dst); } return res; } diff --git a/src/include/data_ui.h b/src/include/data_ui.h index 8f96d48..8dbe81c 100644 --- a/src/include/data_ui.h +++ b/src/include/data_ui.h @@ -3,18 +3,22 @@ #include #include "data_ress.h" +#include "data_game.h" #define MAX_RENDERLIST_SIZE 256 -typedef struct { +struct _renderItem_t { sprite_t *sprite; int currframe; int animate; /* Is currently animating ? */ int x,y; int absolute; /* 0 if level-based coords, 1 if camera-based */ + SDL_Rect lastDstRect; /* Last drawn position on screen */ int onhovercursorid; - void (*onmousebuttonevent_proc)(Uint8 button, Uint8 state, void *userptr); -} renderItem_t; + void (*onmousebuttonevent_proc)(struct _renderItem_t *self, Uint8 button, Uint8 state, gameState_t *gState); +}; + +typedef struct _renderItem_t renderItem_t; enum gameRLIdx {RLI_terrain=0, RLI_lem0, RLI_cursor=MAX_RENDERLIST_SIZE-1}; @@ -24,7 +28,7 @@ typedef struct { created by buildRenderList() */ renderItem_t renderList[MAX_RENDERLIST_SIZE]; - /* Various */ + renderItem_t *cursor; /* Current camera position */ int cameraX; diff --git a/src/include/gameui.h b/src/include/gameui.h index 92fa985..e03c8a5 100644 --- a/src/include/gameui.h +++ b/src/include/gameui.h @@ -8,5 +8,7 @@ /* Create list of all in-game sprite to render (for batch processing) */ int buildGameRenderList(gameRess_t *gRess, gameUI_t *gUI); +renderItem_t * findActionnableItemUnderCursor(gameUI_t *gUI); + #endif /*GAMEUI_H*/ diff --git a/src/test/testplay.c b/src/test/testplay.c index aa73ec8..e114f3a 100644 --- a/src/test/testplay.c +++ b/src/test/testplay.c @@ -45,8 +45,8 @@ 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); + SDL_ShowCursor(SDL_DISABLE); res=loadMiscRes (rend, &gIni, &gRess); if (res!=0) exit(res); res=loadStyleRes(rend, &gIni, &gRess); if (res!=0) exit(res); @@ -65,28 +65,39 @@ int main(int argc, char **argv) { uiTick = 0; mainLoopEnd = 0; while (!mainLoopEnd) { + renderItem_t *it; /* Check for events */ while (SDL_PollEvent(&uiEvent)) { 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; + if (gUI.cursor && gUI.cursor->sprite) { + gUI.cursor->x = uiEvent.motion.x - gUI.cursor->sprite->size.w / 2; + gUI.cursor->y = uiEvent.motion.y - gUI.cursor->sprite->size.h / 2; + } break; case SDL_MOUSEBUTTONDOWN: + break; case SDL_MOUSEBUTTONUP: - //uiEvent.button + it=findActionnableItemUnderCursor(&gUI); + if (it && it->onmousebuttonevent_proc) { + it->onmousebuttonevent_proc(it,uiEvent.button.button,uiEvent.button.state,&gState); + } + break; + default: break; } } (void) renderTerrainToTextures(rend, gState.terrain, &gUI); + it=findActionnableItemUnderCursor(&gUI); + gUI.cursor->currframe = (it?it->onhovercursorid:0); + + SDL_RenderClear(rend); (void) renderSprites(rend, &gUI); SDL_RenderPresent(rend); -- cgit v1.2.3