summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLudovic Pouzenc <lpouzenc@gmail.com>2013-07-26 15:25:49 +0200
committerLudovic Pouzenc <lpouzenc@gmail.com>2013-07-26 15:25:49 +0200
commit5449f88e7f7d3ca51435f1ea7fb3ea2cdea72bc8 (patch)
tree3f395616752b1e16e9c8c0a54d1c6410b1ce1b8a /src
parent23d9d1d3e1b9cc2efd80ad8e2f0480623858cdab (diff)
downloadmplemmings-5449f88e7f7d3ca51435f1ea7fb3ea2cdea72bc8.tar.gz
mplemmings-5449f88e7f7d3ca51435f1ea7fb3ea2cdea72bc8.tar.bz2
mplemmings-5449f88e7f7d3ca51435f1ea7fb3ea2cdea72bc8.zip
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à.
Diffstat (limited to 'src')
-rw-r--r--src/gameui.c25
-rw-r--r--src/graphic.c22
-rw-r--r--src/include/data_ui.h12
-rw-r--r--src/include/gameui.h2
-rw-r--r--src/test/testplay.c23
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 <SDL.h>
#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);