summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Pouzenc <ludovic@pouzenc.fr>2010-12-05 20:47:20 +0000
committerLudovic Pouzenc <ludovic@pouzenc.fr>2010-12-05 20:47:20 +0000
commite191660e76a4c764e949901dcbcb1fd97e5be448 (patch)
treed146851e717e0f2668ec92af7d79cca3b9ec869f
parent430a892f21649a5c8bb336181cc9f83657548ba8 (diff)
download2010-netlemmings-e191660e76a4c764e949901dcbcb1fd97e5be448.tar.gz
2010-netlemmings-e191660e76a4c764e949901dcbcb1fd97e5be448.tar.bz2
2010-netlemmings-e191660e76a4c764e949901dcbcb1fd97e5be448.zip
Avancement sur le système de dirt rectangles. Il reste à faire une vraie méthode de painting qui repeint ce qu'il faut exactement, en gérant les différentes superpositions (objects no_override, terrains, objets, lemmings, particules, curseur)
git-svn-id: file:///var/svn/2010-netlemmings/trunk@186 077b3477-7977-48bd-8428-443f22f7bfda
-rw-r--r--src/netlem.c45
1 files changed, 39 insertions, 6 deletions
diff --git a/src/netlem.c b/src/netlem.c
index b5147e7..5f3dfb2 100644
--- a/src/netlem.c
+++ b/src/netlem.c
@@ -435,6 +435,21 @@ void processLocalEvents(SDL_Rect *viewport, SDL_Rect *screen, SDL_Rect *terrain)
//case SDLK_PAGEUP : if(decalFps>0){decalFps -=1;}break;
//case SDLK_PAGEDOWN : if(decalFps<(FPS-1)){decalFps +=1;}break;
//case SDLK_w : paint_stencil = (paint_stencil==0)? 1 : 0 ; break;
+// case SDLK_x : switchMiniMapMode= (switchMiniMapMode==0)? 1 : ((switchMiniMapMode==1)? 2 : ((switchMiniMapMode==2)? 3 : 0)) ;permission=0;break;
+// case SDLK_p :{
+// zoomX=((zoomX >= 1. )? zoomX + 1. : zoomX + 0.1 );
+// zoomY=((zoomY >= 1. )? zoomY + 1. : zoomY + 0.1 );
+// if(zoomX > 10.) {zoomX=10.;}
+// if(zoomY > 10.) {zoomY=10.;}
+// break;
+// }
+// case SDLK_m :{
+// zoomX=((zoomX > 1. )? zoomX - 1. : zoomX - 0.1 );
+// zoomY=((zoomY > 1. )? zoomY - 1. : zoomY - 0.1 );
+// if(zoomX <= 0.) {zoomX=0.1;}
+// if(zoomY <= 0.) {zoomY=0.1;}
+// break;
+// }
case SDLK_ESCAPE : changeState(eEnd); break;
default:break;
}
@@ -476,7 +491,7 @@ void processLocalEvents(SDL_Rect *viewport, SDL_Rect *screen, SDL_Rect *terrain)
}
int updateGraphics(gameGraphics_t *gGraph) {
- int res;
+ int i, res;
static SDL_Rect lastViewport= {-1,-1,-1,-1};
//TODO : modifier les calques
@@ -485,21 +500,39 @@ int updateGraphics(gameGraphics_t *gGraph) {
break;
case eMultiGame:
// If we had a camera movement, we have to refesh all the screen
-// if ( memcmp(&lastViewport, &(gGraph->viewport), sizeof(SDL_Rect)) != 0) {
+ // if ( memcmp(&lastViewport, &(gGraph->viewport), sizeof(SDL_Rect)) != 0) {
if ( lastViewport.x != gGraph->viewport.x ) {
//lastViewport=gGraph->viewport;
lastViewport.x=gGraph->viewport.x;
-printf("viewport.x==%i\n", gGraph->viewport.x);
+ printf("viewport.x==%i\n", gGraph->viewport.x);
+ if ( gGraph->dirtRectsCount > 0 ) {
+ free(gGraph->dirtRects);
+ }
+ gGraph->dirtRects=malloc(1*sizeof(SDL_Rect));
+ gGraph->dirtRects[0].x=0;
+ gGraph->dirtRects[0].y=0;
+ gGraph->dirtRects[0].w=0;
+ gGraph->dirtRects[0].h=0;
+ gGraph->dirtRectsCount=1;
+ }
+ // We use a dirt rectangle method for performance
+
+ for(i=0; i<gGraph->dirtRectsCount; i++) {
+ //FIXME : faire une vrai procedure qui va chercher les objets sur une zone donnée, qui paint tout dans l'ordre
res=SDL_BlitSurface(gGraph->terrain, &lastViewport, gGraph->screen, NULL);
if ( res!=0 ) {
logs2(LOG_DEBUG, "updateGraphics(), SDL_BlitSurface()", SDL_GetError());
return res;
}
- SDL_UpdateRect(gGraph->screen, 0,0,0,0);
- } else {
- // Else, we use a dirt rectangle method for performance
+ SDL_UpdateRect(gGraph->screen,
+ gGraph->dirtRects[i].x,
+ gGraph->dirtRects[i].y,
+ gGraph->dirtRects[i].w,
+ gGraph->dirtRects[i].h);
}
+ gGraph->dirtRectsCount=0;
+ free(gGraph->dirtRects);
break;
default:
break;