diff --git a/button.c b/button.c index f0221001fcb1e237b825356417cfdd307716ba78..c1db827e3dd778993db92f9152a74d58b30d76a4 100644 --- a/button.c +++ b/button.c @@ -3,6 +3,9 @@ #include <SDL_image.h> #include <SDL_gfxPrimitives.h> + +/*Gomb kirajzoló függvény*/ + void drawButton(SDL_Surface* screen,SDL_Event* evt,Button* const button) { SDL_Rect pos= {0},siz= {0}; @@ -17,8 +20,8 @@ void drawButton(SDL_Surface* screen,SDL_Event* evt,Button* const button) switch(button->isActive) { case 1:/*Aktív gomb*/ - if(( button->rect.x <= evt->button.x && evt->button.x <= button->rect.x+button->rect.w ) && - ( button->rect.y <= evt->button.y && evt->button.y <= button->rect.y+button->rect.h )) + if(( button->rect.x < evt->button.x && evt->button.x < button->rect.x+button->rect.w ) && + ( button->rect.y < evt->button.y && evt->button.y < button->rect.y+button->rect.h )) { siz.x=siz.w; SDL_BlitSurface(button->bg,&siz,screen,&pos); @@ -45,6 +48,7 @@ void drawButton(SDL_Surface* screen,SDL_Event* evt,Button* const button) } } +/**/ void setButtonEvents(Button* button,SDL_Event* evt) { if(button->isActive==1) @@ -57,15 +61,15 @@ void setButtonEvents(Button* button,SDL_Event* evt) case SDL_BUTTON_LEFT:/*Bal egér kattintás*/ - if( ( button->rect.x <= evt->button.x && evt->button.x <= button->rect.x+button->rect.w ) && - ( button->rect.y <= evt->button.y && evt->button.y <= button->rect.y+button->rect.h ) ) + if( ( button->rect.x < evt->button.x && evt->button.x < button->rect.x+button->rect.w ) && + ( button->rect.y < evt->button.y && evt->button.y < button->rect.y+button->rect.h ) ) button->leftButtonClicked=1; break; case SDL_BUTTON_RIGHT:/*Jobb egér kattintás*/ - if( ( button->rect.x <= evt->button.x && evt->button.x <= button->rect.x+button->rect.w ) && - ( button->rect.y <= evt->button.y && evt->button.y <= button->rect.y+button->rect.h ) ) + if( ( button->rect.x < evt->button.x && evt->button.x < button->rect.x+button->rect.w ) && + ( button->rect.y < evt->button.y && evt->button.y < button->rect.y+button->rect.h ) ) button->rightButtonClicked=1; break; @@ -83,8 +87,10 @@ void setButtonEvents(Button* button,SDL_Event* evt) void setButton(Button* button,SDL_Rect rect,SDL_Surface* bg,TTF_Font* font,char* const text) { + /*Inicalizáció*/ button->rect=rect; button->bg=bg; + button->text=NULL;/*Vizsgálat miat*/ setText(button,font,text,white); button->leftButtonClicked=-1; button->rightButtonClicked=-1; @@ -97,5 +103,13 @@ void setActive(Button* button,int value) } void setText(Button* button,TTF_Font* font,char* const text,SDL_Color color){ - button->text=TTF_RenderText_Blended(font,text,color); + if(text!=NULL){ + if(button->text!=NULL)SDL_FreeSurface(button->text); + button->text=TTF_RenderText_Blended(font,text,color); + } +} + +void destroyButton(Button* button){ + if(button->text!=NULL) + SDL_FreeSurface(button->text); } diff --git a/game.c b/game.c index 64a93198038ee77bcbf2dc45837190da82022838..f689f345b2baa624d3f83358d35dd79d200b1294 100644 --- a/game.c +++ b/game.c @@ -34,20 +34,27 @@ int drawGameSetting(Game* game,SDL_Surface* screen,TTF_Font* fontMain,TTF_Font* drawInput(screen,&inputHeight); drawInput(screen,&inputMines); /*Beviteli események*/ - setInputEvents(&inputWidth,&evt,fontMain,0); - setInputEvents(&inputHeight,&evt,fontMain,0); - setInputEvents(&inputMines,&evt,fontMain,0); + setInputEvents(&inputWidth,&evt,fontMain,INPUT_NUM); + setInputEvents(&inputHeight,&evt,fontMain,INPUT_NUM); + setInputEvents(&inputMines,&evt,fontMain,INPUT_NUM); if(btnBack.leftButtonClicked==1) { + destroyInput(&inputWidth); + destroyInput(&inputHeight); + destroyInput(&inputMines); return BACK;/*TODO:Felesleges*/ } if(btnNext.leftButtonClicked==1) { - /*FIXME:Table table; nélkül*/ + + destroyInput(&inputWidth); + destroyInput(&inputHeight); + destroyInput(&inputMines); + createTable(&game->table,bgField,fontField,15/*game->width*/,15/*game->height*/); - generateTable((game->table),15,15,20/*game->mines*/); + generateTable((game->table),15,15,25/*game->mines*/); return NEXT; } @@ -98,7 +105,8 @@ void drawGame(Game* game,SDL_Surface* screen,TTF_Font* fontButton,TTF_Font* font if(btnExit.leftButtonClicked==1) { state=EXIT; - destroyTable(&game->table,15/*game->height*/); + saveTable(game->table,15/*game->width*/,15/*TODO:game->height*/); + destroyTable(game->table,15/*game->height*/); /*TODO:Mentés*/ } } diff --git a/init.c b/init.c index c3848894510f4b839b320dfcc38f68f4516b3b52..cc7f960072a86c50281ab6186e89722be98f4799 100644 --- a/init.c +++ b/init.c @@ -5,7 +5,7 @@ void init_framework(SDL_Surface** screen) SDL_Init(SDL_INIT_EVERYTHING); IMG_Init(IMG_INIT_JPG); - *screen=SDL_SetVideoMode(640,480,32,/*SDL_ANYFORMAT*/SDL_FULLSCREEN); + *screen=SDL_SetVideoMode(640,480,32,/*SDL_ANYFORMAT*/SDL_FULLSCREEN|SDL_HWSURFACE); SDL_EnableKeyRepeat(500, 30); } diff --git a/input.c b/input.c index 9fac48ba2fe78636d72f72df9e2dce15861a9d65..60d79d8f73ca93bcfe5fbb506d712d40f572e14f 100644 --- a/input.c +++ b/input.c @@ -1,25 +1,30 @@ #include "input.h" -#define NUMBERS 10 -#define ABC 27 +#include "colors.h" void drawInput(SDL_Surface* screen,Input* input) /*Kirajzol egy inputot*/ { SDL_Rect siz= {0}, pos= {0}; + /*pozicio méret*/ pos.x=input->rect.x; pos.y=input->rect.y; siz.w=input->rect.w; siz.h=input->rect.h; + /*Háttér*/ SDL_BlitSurface(input->bg,&siz,screen,&pos); - if(input->textS!=NULL) + + /*Ha van mit kirajzolni kirajzol*/ + if(input->textS!=NULL){ pos.y+=(siz.h-input->textS->h)/2; - pos.x+=20;/*TODO:Offset*/ - SDL_BlitSurface(input->textS,NULL,screen,&pos); + pos.x+=20;/*TODO:Offset*/ + SDL_BlitSurface(input->textS,NULL,screen,&pos); + } } void setInput(Input* input,SDL_Surface* bg,SDL_Rect rect) { - /*Inicializáció*//*TODO:SDL_Rect* optimalizácio érdekében*/ + /*Inicializáció*/ + /*TODO:SDL_Rect* optimalizáció érdekében*/ input->rect=rect; input->bg=bg; input->textSize=1; @@ -28,10 +33,11 @@ void setInput(Input* input,SDL_Surface* bg,SDL_Rect rect) input->isActive=0; } -void setInputActive(Input* input,SDL_Event* evt) /*Aktívba állítja az beviteli mezőt*/ +void setInputActive(Input* input,SDL_Event* evt) /*Aktívba állítja a beviteli mezőt ha volt kattintás*/ { + /*Égér pozició vizsgálat*/ if(( input->rect.x <= evt->button.x && evt->button.x <= input->rect.x+input->rect.w ) && - ( input->rect.y <= evt->button.y && evt->button.y <= input->rect.y+input->rect.h )) + ( input->rect.y <= evt->button.y && evt->button.y <= input->rect.y+input->rect.h )) { input->isActive=1; } @@ -39,10 +45,20 @@ void setInputActive(Input* input,SDL_Event* evt) /*Aktívba állítja az bevitel } -int addNewElement(Input* input,Uint16 element) /*hozzáad egy új karaktert*/ +void addNewElement(Input* input,Uint16 element,int flag) /*hozzáad egy új karaktert*/ { int i,index=-1; Uint16* cache; + + + if(flag!=INPUT_ALL){ + if(flag==INPUT_NUM && !('0'<= element && element <='9') )/*Ha nem akkor vissza tér*/ + return; + if(flag==INPUT_ABC && ('0'<= element && element <='9'))/*Ha szám akkor visszatér*/ + return; + } + + i=0; cache=(Uint16*)malloc(sizeof(Uint16)*(input->textSize+1)); /*if(input->text!=NULL)*/ @@ -55,8 +71,6 @@ int addNewElement(Input* input,Uint16 element) /*hozzáad egy új karaktert*/ free(input->text); input->text=cache; input->textSize++; - - return index; } void deleteAElement(Input* input) /*kitöröl egy karakter*/ @@ -77,9 +91,8 @@ void deleteAElement(Input* input) /*kitöröl egy karakter*/ void renderNewText(Input* input,TTF_Font* font) /*Létrehozza a modosított képet*/ { /*SDL_Surface* cache;*/ - SDL_Color c= {0,0,0,255}; SDL_FreeSurface(input->textS); - input->textS=TTF_RenderUNICODE_Solid(font,input->text,c); + input->textS=TTF_RenderUNICODE_Solid(font,input->text,white); } @@ -113,7 +126,7 @@ void setInputEvents(Input* input,SDL_Event* evt,TTF_Font* font,int flag) /*Beál } break; default: - addNewElement(input,evt->key.keysym.unicode); + addNewElement(input,evt->key.keysym.unicode,flag); renderNewText(input,font); break; } @@ -127,3 +140,12 @@ void setInputEvents(Input* input,SDL_Event* evt,TTF_Font* font,int flag) /*Beál } + +void destroyInput(Input* input){/*Input mező megsemisitése*/ + if(input->text!=NULL){ + free(input->text); + } + if(input->textS!=NULL){ + SDL_FreeSurface(input->textS); + } +} diff --git a/input.h b/input.h index fa5cb61687dacaac01caff9af8aa7a5d0882ec46..b0778debf2467687489a3bda08d3a5037f1769b4 100644 --- a/input.h +++ b/input.h @@ -22,5 +22,6 @@ typedef struct void drawInput(SDL_Surface*,Input*); void setInput(Input*,SDL_Surface*,SDL_Rect); void setInputEvents(Input*,SDL_Event*,TTF_Font*,int); +void destroyInput(Input*); #endif diff --git a/main.c b/main.c index 5e2eb6d92d8c350a7853a48e83049a7cfe845327..b6d8dee4503c24caed2a257a83260b9d1d70788e 100644 --- a/main.c +++ b/main.c @@ -32,9 +32,9 @@ int main(int argc,char* argv[]) init_ttf(&font); /*háttér betöltése*/ - bgMain=IMG_Load("bg.jpg"); - bgButton=IMG_Load("button.png"); - bgField=IMG_Load("field20.png"); + bgMain=IMG_Load("hatter_glass.png"); + bgButton=IMG_Load("gomb_wide.png"); + bgField=IMG_Load("gomb_lil.png"); while(evt.type!=SDL_QUIT && state!=QUIT_TO_OS) diff --git a/table.c b/table.c index d3c06dd3889ce92219563cfad72e95f9425b1c63..acb2af61e6833f2fd0d35988ec28c792d4db7115 100644 --- a/table.c +++ b/table.c @@ -14,13 +14,15 @@ void drawTable(SDL_Surface* screen,Table table,TTF_Font* font,SDL_Event* evt,int { drawField(screen,evt,&table[y][x]); setButtonEvents(&table[y][x].btnField,evt); - if(table[y][x].btnField.leftButtonClicked==1){ + if(table[y][x].btnField.leftButtonClicked==1) + { if(fieldRevealing(table,font,x,y,width,height))/*Vissza térés játék vége*/ { /*TODO:Game over*/ } } - if(table[y][x].btnField.rightButtonClicked==1){ + if(table[y][x].btnField.rightButtonClicked==1) + { setFlag(table[y][x]); setText(&table[y][x].btnField,font,"F",red); } @@ -61,15 +63,15 @@ void createTable(Table* table,SDL_Surface* bgField,TTF_Font* fieldFont,int width } -void destroyTable(Table* table,int height)/*TODO:Vektoros módszer*/ +void destroyTable(Table table,int height)/*TODO:Vektoros módszer*/ { int i; for(i=0; i<height; i++) { - /*free(table[i]);*/ + free(table[i]); } - /*free(table);*/ + free(table); } void generateTable(Table table,int width,int height,int mines) @@ -108,23 +110,32 @@ void generateTable(Table table,int width,int height,int mines) -void allFieldRevealing(Table table,TTF_Font* font,int width,int height){ +void allFieldRevealing(Table table,TTF_Font* font,int width,int height) +{ int x,y; char puffer[2]; - for(y=0;y<height;y++){ - for(x=0;x<width;x++){ - if(table[y][x].state!=UNCOVERED){ + for(y=0; y<height; y++) + { + for(x=0; x<width; x++) + { + if(table[y][x].state!=UNCOVERED) + { table[y][x].state=UNCOVERED; - if(table[y][x].type==MINE){ - setText(&table[y][x].btnField,font,"*",red); - table[y][x].btnField.isActive=0; + if(table[y][x].type==MINE) + { + setText(&table[y][x].btnField,font,"*",red); + table[y][x].btnField.isActive=0; } - else{ - if(table[y][x].type==EMPTY){ + else + { + if(table[y][x].type==EMPTY) + { table[y][x].btnField.isActive=0; - }else{ + } + else + { table[y][x].btnField.isActive=0; sprintf(puffer,"%d",table[y][x].type); setText(&table[y][x].btnField,font,puffer,white); @@ -146,7 +157,8 @@ void allFieldRevealing(Table table,TTF_Font* font,int width,int height){ -int fieldRevealing(Table table,TTF_Font* font,int x,int y,int width,int height){ +int fieldRevealing(Table table,TTF_Font* font,int x,int y,int width,int height) +{ int i,j,ret=0; char puffer[2]; @@ -159,7 +171,8 @@ int fieldRevealing(Table table,TTF_Font* font,int x,int y,int width,int height){ { table[y][x].state=1; table[y][x].btnField.isActive=0; - if(table[y][x].type!=0){ + if(table[y][x].type!=0) + { sprintf(puffer,"%d",table[y][x].type); setText(&table[y][x].btnField,font,puffer,white); } @@ -183,3 +196,27 @@ int fieldRevealing(Table table,TTF_Font* font,int x,int y,int width,int height){ } +void saveTable(Table table,int width,int height)/*TODO:Áthelyezni a game.c -be és az időt is meneteni*/ +{ + int x,y; + + FILE* fp=fopen("game.sav","wt"); + if(fp==NULL) + { + printf("[ERROR]Cannot save the game"); + } + else + { + fprintf(fp,"%d:%d\n",width,height); + + for(y=0; y<height;y++) + { + for(x=0; x<width; x++) + { + fprintf(fp,"%d;%d ",table[y][x].type,table[y][x].state); + } + fprintf(fp,"\n"); + } + fclose(fp); + } +} diff --git a/table.h b/table.h index e98addbc173ddf183837e1ced61d713306ecb99a..2d45daaead53486130e766345709407b2420e47a 100644 --- a/table.h +++ b/table.h @@ -8,11 +8,11 @@ typedef Field** Table; void drawTable(SDL_Surface*,Table,TTF_Font*,SDL_Event*,int width,int height); /*Mentés és visszatöltés*/ -void saveTable(); +void saveTable(Table table,int,int); void loadTable(); /*Példányosítás és eltörlés*/ void createTable(Table* table,SDL_Surface*,TTF_Font*,int,int); -void destroyTable(Table*,int); +void destroyTable(Table,int); /*Pálya generálás*/ void generateTable(Table,int width,int height,int mines);