diff options
-rw-r--r-- | misc/lemming.ini | 2 | ||||
-rw-r--r-- | sdl-test/SDL_tuto/TestParserLemmingsLVL/lvlTest01.ini | 16 | ||||
-rw-r--r-- | sdl-test/SDL_tuto/TestParserLemmingsLVL/parse_ini.yy | 174 |
3 files changed, 143 insertions, 49 deletions
diff --git a/misc/lemming.ini b/misc/lemming.ini index 88179c0..523a198 100644 --- a/misc/lemming.ini +++ b/misc/lemming.ini @@ -29,7 +29,7 @@ pos_1 = 16, 17, 8 lemm_2 = 8, 2, 0
pos_2 = 13, 23, 8
-# climber to walker, 8 frames, 2 dirs, once
+# climber to faller, 8 frames, 2 dirs, once
lemm_3 = 8, 2, 1
pos_3 = 14, 25, 8
diff --git a/sdl-test/SDL_tuto/TestParserLemmingsLVL/lvlTest01.ini b/sdl-test/SDL_tuto/TestParserLemmingsLVL/lvlTest01.ini index e97a799..cdeb330 100644 --- a/sdl-test/SDL_tuto/TestParserLemmingsLVL/lvlTest01.ini +++ b/sdl-test/SDL_tuto/TestParserLemmingsLVL/lvlTest01.ini @@ -17,19 +17,21 @@ style = brick # Objects # id, xpos, ypos, paint mode (), upside down (0,1) # paint modes: 8=VIS_ON_TERRAIN, 4=NO_OVERWRITE, 0=FULL (only one value possible) +object_0 = 7, 748, 86, 4 , 0 +#object_1 = 1, 350, 0, 4, 0 object_2 = 1, 600, 0, 4, 0 # Terrain # id, xpos, ypos, modifier # modifier: 8=NO_OVERWRITE, 4=UPSIDE_DOWN, 2=REMOVE (combining allowed, 0=FULL) terrain_0 = 26, 300, 150, 0 -terrain_1 = 26, 364, 151, 0 -terrain_2 = 26, 428, 152, 0 -terrain_3 = 26, 492, 153, 0 -terrain_4 = 26, 556, 154, 0 -terrain_5 = 26, 620, 155, 0 -terrain_6 = 26, 684, 156, 0 -terrain_7 = 26, 748, 157, 0 +terrain_1 = 26, 364, 150, 0 +terrain_2 = 26, 428, 150, 0 +terrain_3 = 26, 492, 150, 0 +terrain_4 = 26, 556, 150, 0 +terrain_5 = 26, 620, 150, 0 +terrain_6 = 26, 684, 150, 0 +terrain_7 = 26, 748, 150, 0 terrain_8 = 46, 600, 0, 0 diff --git a/sdl-test/SDL_tuto/TestParserLemmingsLVL/parse_ini.yy b/sdl-test/SDL_tuto/TestParserLemmingsLVL/parse_ini.yy index 26928e1..541abaa 100644 --- a/sdl-test/SDL_tuto/TestParserLemmingsLVL/parse_ini.yy +++ b/sdl-test/SDL_tuto/TestParserLemmingsLVL/parse_ini.yy @@ -54,6 +54,14 @@ #define NBR_BUTTON_LEMMING 13 const int ADD_OBJ = NBR_ADD_OBJ + NBR_BUTTON_LEMMING; + //cyan pixel color + Uint32 ccc_cyan= 0x00ffff; + //yellow pixel color + Uint32 ccc_yellow = 0xffff00; + //Red pixel color + Uint32 ccc_red= 0xff0000; + //green pixel color + Uint32 ccc_green= 0x00ff00; // erase surface; Uint32 ccc_black= 0x000000; //Blanc cursor @@ -159,6 +167,13 @@ #define OTHER_LEM_JOB 3 #define LEM_JOB 20 #define MAX_LEM_FALL 3 + #define FALLER_MAX 64 + #define FLOATER_TO_FALLER 32 + #define MAX_LEM_FLOATER 2 + #define MAX_BUILD_BRICK 9 + #define MAX_BUILD_END 3 + #define MAX_JUMPER 8 + enum eLemmingJob { walker , faller , climber , climber_to_faller , floater , @@ -334,6 +349,8 @@ int anim_objet(int typeS, int typeO, int cptFps, int frames, int *cpt, struct gameInit *gInit);// returne le state de l'oblet a afficher Uint32 get_pixel32( int x, int y, SDL_Surface *surface ); + + void putPixel(SDL_Surface *surface,Uint16 x,Uint16 y,Uint32 color); void stateLemming(struct gameInit *gInit, SDL_Surface *s); @@ -894,6 +911,40 @@ Uint32 get_pixel32( int x, int y, SDL_Surface *surface ) } +void putPixel(SDL_Surface *surface,Uint16 x,Uint16 y,Uint32 color) +{ + /* bpp de la surface ecran */ + Uint8 bpp = surface->format->BytesPerPixel; + + /* pointeur vers le pixel a remplacer */ + Uint8 *p = ((Uint8 *)surface->pixels) + y * surface->pitch + x * bpp; + + switch(bpp) + { + case 1: + *p = (Uint8) color; + break; + case 2: + *(Uint16 *)p = (Uint16) color; + break; + case 3: + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) + { + *(Uint16 *)p = ((color >> 8) & 0xff00) | ((color >> 8) & 0xff); + *(p + 2) = color & 0xff; + } + else + { + *(Uint16 *)p = color & 0xffff; + *(p + 2) = ((color >> 16) & 0xff) ; + } + break; + case 4: + *(Uint32 *)p = color; + break; + } +} + void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){ struct listeSimplementChainee *unl; @@ -903,12 +954,15 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){ // [4] : 0:left, 1:right, 2:up, 3:down // [7] : x0,weightGif,y0,henghtGif,id,anim,type - int pixCtrlLem[2][4]; - // 0 : x, 1 : y - // 4 + int pixCtrlLem[2][5]; + // line 0 : x, 1 : y + // pt 0-3 : 3 + //[lemmingFoot] 2 + // 0 1 + // pt 4 : pt G lemming - int i=0,j,d; - int heightGif,weightGif,x0,y0; + int i=0,j,d,step=0; + int heightGif,weightGif,x0,y0,beginO,endO; int heightLem,weightLem; int min_up =-200; int min_down = LEVEL_HEIGHT; @@ -919,7 +973,7 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){ unl=gInit->l.ll; for(i=0;i<4;++i){ - for(j=0;j<4;++j){ + for(j=0;j<7;++j){ coor[i][j]=909; } } @@ -929,10 +983,12 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){ sfT = gInit->mapI.map.tabGif[gInit->mapI.map.tiles*2 + gInit->mapI.map.tilesObjet*2 +gInit->mapI.map.tilesSteel +(unl->ID)*2+(unl->data.pl->dir) + ADD_OBJ]; // foot of lemming - d= unl->y + gInit->mapI.lemmingDATA[unl->ID].footY; + d = unl->y + gInit->mapI.lemmingDATA[unl->ID].footY; + + if(unl->data.pl->dir==1){//right - i= unl->x + gInit->mapI.lemmingDATA[unl->ID].footX + gInit->mapI.lemmingDATA[unl->ID].footSize; + i= unl->x + gInit->mapI.lemmingDATA[unl->ID].footX + gInit->mapI.lemmingDATA[unl->ID].footSize - 1; pixCtrlLem[0][0]= i; pixCtrlLem[1][0]= d + 1 ; @@ -948,7 +1004,7 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){ } else {//left - i = unl->x+(sfT->w-gInit->mapI.lemmingDATA[unl->ID].footX - gInit->mapI.lemmingDATA[unl->ID].footSize) ; + i = unl->x+(sfT->w-gInit->mapI.lemmingDATA[unl->ID].footX - gInit->mapI.lemmingDATA[unl->ID].footSize) + 1 ; pixCtrlLem[0][0]= i ; pixCtrlLem[1][0]= d + 1 ; @@ -967,7 +1023,21 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){ weightLem=sfT->w; heightLem=sfT->h/(gInit->mapI.lemmingDATA[unl->ID].state); - + pixCtrlLem[0][4]= unl->x + sfT->w/2; + pixCtrlLem[1][4]= unl->x + heightLem/2; + //for(i=0;i<4;++i){ + // putPixel(pSpr_Lem,pixCtrlLem[0][0],pixCtrlLem[1][0] ,ccc_cyan); + // putPixel(pSpr_Lem,pixCtrlLem[0][1],pixCtrlLem[1][1] ,ccc_red); + // putPixel(pSpr_Lem,pixCtrlLem[0][2],pixCtrlLem[1][2] ,ccc_green); + // putPixel(pSpr_Lem,pixCtrlLem[0][3],pixCtrlLem[1][3] ,ccc_yellow); + //} +/* // if(unl->data.pl->dir==1){ + for(i=0;i<gInit->mapI.lemmingDATA[unl->ID].footSize;++i){ + putPixel(pSpr_Lem,gInit->mapI.lemmingDATA[unl->ID].footX+unl->x+i,unl->y+gInit->mapI.lemmingDATA[unl->ID].footY,ccc_green); + }//} else { + for(i=gInit->mapI.lemmingDATA[unl->ID].footSize;i>0;--i){ + putPixel(pSpr_Lem,unl->x+(sfT->w-gInit->mapI.lemmingDATA[unl->ID].footX - gInit->mapI.lemmingDATA[unl->ID].footSize)+i,unl->y+gInit->mapI.lemmingDATA[unl->ID].footY,ccc_red); + }//}*/ k=gInit->o.lo; @@ -979,11 +1049,18 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){ y0 = k->y; heightGif = sfT->h/(gInit->mapI.map.tabDataSprO[k->ID].state); + if(k->data.po->UD==0){// Up==0 or Down==1 ? + beginO=y0; + endO=y0+heightGif; + } else { + beginO=y0-heightGif; + endO=y0; + } // verif objet autour du lemming // verif left and right - if ((pixCtrlLem[1][2] >= y0)&&((pixCtrlLem[1][2]) <= (y0 + heightGif))){ + if ((pixCtrlLem[1][2] >= beginO )&&(pixCtrlLem[1][2] <= endO )){ // verif left if ((pixCtrlLem[0][2]) >= (x0 + weightGif)){ if (min_left <= (x0 + weightGif)){ @@ -992,7 +1069,7 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){ coor[0][0]=x0; coor[0][1]=weightGif; coor[0][2]=y0; - coor[0][3]=heightGif; + coor[0][3]=endO-y0; coor[0][4]=k->ID; coor[0][5]=gInit->mapI.map.tabDataSprO[k->ID].anim; coor[0][6]=gInit->mapI.map.tabDataSprO[k->ID].type; @@ -1006,7 +1083,7 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){ coor[1][0]=x0; coor[1][1]=weightGif; coor[1][2]=y0; - coor[1][3]=heightGif; + coor[1][3]=endO-y0; coor[1][4]=k->ID; coor[1][5]=gInit->mapI.map.tabDataSprO[k->ID].anim; coor[1][6]=gInit->mapI.map.tabDataSprO[k->ID].type; @@ -1017,28 +1094,28 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){ // verif up and down if ((pixCtrlLem[0][2] >= x0)&&((pixCtrlLem[0][2] ) <= (x0 + weightGif))){ // verif up - if (unl->y >= (y0 + heightGif)){ - if (min_up <= (y0 + heightGif)){ - min_up = (y0 + heightGif); + if ( pixCtrlLem[1][2] >= endO){ + if (min_up <= endO){ + min_up = endO; // printf("\t--> verif up\n"); coor[2][0]=x0; coor[2][1]=weightGif; coor[2][2]=y0; - coor[2][3]=heightGif; + coor[2][3]=endO-y0; coor[2][4]=k->ID; coor[2][5]=gInit->mapI.map.tabDataSprO[k->ID].anim; coor[2][6]=gInit->mapI.map.tabDataSprO[k->ID].type; } } // verif down - if ((pixCtrlLem[1][0]) <= y0) { - if (min_down >= y0){ - min_down = y0; + if (pixCtrlLem[1][2] <= beginO) { + if (min_down >= beginO){ + min_down = beginO; //printf("\t--> verif down\n"); coor[3][0]=x0; coor[3][1]=weightGif; coor[3][2]=y0; - coor[3][3]=heightGif; + coor[3][3]=endO-y0; coor[3][4]=k->ID; coor[3][5]=gInit->mapI.map.tabDataSprO[k->ID].anim; coor[3][6]=gInit->mapI.map.tabDataSprO[k->ID].type; @@ -1047,9 +1124,11 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){ } k=k->next; } - + for(i=0;i<4;++i){ + printf("Objet %d : ID=%d, anim=%d, type=%d, (x0=%d,w=%d,y0=%d,h=%d)\n",i,coor[i][4],coor[i][5],coor[i][6],coor[i][0],coor[i][1],coor[i][2],coor[i][3]); + } //test object collision - for(i=0;i<4;++i){ + for(i=0;i<4;++i){//foot lemming is on the half of trap if( (pixCtrlLem[0][2] == ( coor[i][0] + (coor[i][1])/2 ))&& (pixCtrlLem[1][2] <= ( coor[i][2] + (coor[i][3]) )) ){ @@ -1084,52 +1163,60 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){ // changement state + test collision avec le terrain - - // test de test faller : - //get_pixel32( event.motion.x, event.motion.y, screen ); + // not saving and not dying if((unl->ID != 9)&&(unl->ID != 8)){ + // test de test faller : - if (get_pixel32( pixCtrlLem[0][0] , pixCtrlLem[1][0] , surf ) == gInit->mapI.map.cmap.bgColor ){ + // test pixel under lemming foot + + if ((step==0)&&(get_pixel32( pixCtrlLem[0][0] , pixCtrlLem[1][0] , surf ) == gInit->mapI.map.cmap.bgColor )){ // tombe: unl->ID=1; - for(i=0;i<MAX_LEM_FALL;++i){ + unl->y += 1; + for(i=1;i<MAX_LEM_FALL;++i){ if (get_pixel32( pixCtrlLem[0][0] , pixCtrlLem[1][0] + i , surf ) == gInit->mapI.map.cmap.bgColor ) - { unl->y += 1;} else {break;} + { + unl->y += 1; + } else {break;} } - } - - // walker collision - if (get_pixel32( pixCtrlLem[0][2] , pixCtrlLem[1][2] , surf ) != gInit->mapI.map.cmap.bgColor ){ - // tourne a gauche: - unl->data.pl->dir=0; + step=1; } + // walker collision - if (get_pixel32( pixCtrlLem[0][2] , pixCtrlLem[1][2] , surf ) != gInit->mapI.map.cmap.bgColor ){ - // tourne a droite: - unl->data.pl->dir=1; + if ((step==0)&&(get_pixel32( pixCtrlLem[0][2] , pixCtrlLem[1][2] , surf ) != gInit->mapI.map.cmap.bgColor )){ + if(unl->data.pl->dir==0) + // turn on left: + { unl->data.pl->dir=1;} + // turn on right: + else {unl->data.pl->dir=0;} } // walker - if (get_pixel32( pixCtrlLem[0][0] , pixCtrlLem[1][0] , surf ) != gInit->mapI.map.cmap.bgColor ){ + //printf("val pix test IN %d x=%d, y=%d\n",get_pixel32( pixCtrlLem[0][0] , pixCtrlLem[1][0] , surf ),pixCtrlLem[0][0],pixCtrlLem[1][0]); + if ((step==0)&&(get_pixel32( pixCtrlLem[0][0] , pixCtrlLem[1][0] , surf ) != gInit->mapI.map.cmap.bgColor )){ // marche: + if(unl->ID==1){unl->y-=2;}//FIXME unl->ID=0; if(unl->data.pl->dir == 1){ unl->x += 1; } else { unl->x -= 1; } - break; + step=1; } + // dans la map if(pixCtrlLem[1][0] >= LEVEL_HEIGHT ){ // hors de la map => mort du lemming unl->ID=17; unl->data.pl->cptState = 0; + } } } + step=0; unl=unl->next; } @@ -1738,6 +1825,11 @@ void creationLemming(struct gameInit *gInit){ int coorE[10][2]; int i=0; //DEBUT TEST CREATION UN LEMMING + + // DEBUT DEBUG: LEMMING COLLISION + gInit->mapI.paraMap[1]=1; + // FIN DEBUG: LEMMING COLLISION + nbLem=gInit->mapI.paraMap[1]; //nbLem=1; //printf("nbLem %d\n",nbLem); @@ -2394,7 +2486,7 @@ int main (int argc, char **argv) sprintf(temp,"%s",argv[1]); } yyin=fopen(temp, "r"); - //yyin=fopen("./fichierTest.ini", "r"); +// yyin=fopen("./lvlTest01.ini", "r"); if (yyin==NULL) { fprintf(stderr,"Filename INVALIDE: %s\n",temp); perror("Impossible d'ouvrir le niveau"); exit(42); } |