summaryrefslogtreecommitdiff
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
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à.
-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);