Mercurial > hg > pub > prymula > com
diff lamertetris/sources/szlam.C @ 0:2787f5e749ae
INIT
author | prymula <prymula76@outlook.com> |
---|---|
date | Thu, 21 Sep 2023 22:33:57 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lamertetris/sources/szlam.C Thu Sep 21 22:33:57 2023 +0200 @@ -0,0 +1,300 @@ +/* + project: Lamer Teris + file: szlam.C + write: PRP + licence: Public Domain + date: 9-10-2018 + editor: VSCode +*/ +#include "field.h" +#include "szlam.h" +#include <iostream> + +char szlamField [30][20]; // 600/20x400/20 +bool szlamGhost [30] = {SDL_FALSE}; + +Szlam::Szlam(){ + + field=this->createField(400,600, 255, 255, 255); + SDL_SetColorKey(field, SDL_TRUE, getpixel(field,0,0)); //getpixel2 + +} +SDL_Surface * Szlam::get() { + + return field; +} + +void Szlam::reset() +{ + int i,j; + + for (i=0; i<600/20; i++){ + for (j=0; j<400/20; j++) { + szlamField[i][j]=0; + } + szlamGhost[i]=SDL_FALSE; + } +} + +void Szlam::draw(){ + + SDL_Surface *px; + SDL_Rect box; + int i,j; + int r,g,b; + + px=this->createField(20,20, 128, 128, 100); + SDL_FillRect(field, NULL, SDL_MapRGB(field->format, 255, 255, 255)); + SDL_SetColorKey(field,SDL_TRUE, getpixel(field,0,0)); //getpixel2 + + for (i=0; i<600/20; i++){ + for (j=0; j<400/20; j++) { + if (szlamField[i][j]==0) { + asm("nop"); + //putchar(' '); + } + else if (szlamField[i][j]!=0) { + box = set_rect(j*20, i*20, 20, 20); + this->setColor(szlamField[i][j],&r,&g,&b); + SDL_FillRect(px, NULL, SDL_MapRGB(field->format, r,g,b)); + SDL_BlitSurface( px, NULL, field, &box ); + //putchar('#'); + } + } + //putchar('\n'); + } + + SDL_FreeSurface(px); +} + +bool Szlam::addBottom(SDL_Surface *s, int n_figure, int n_element, int color, int posX, int posY) { + Uint32 c; + Uint8 r,g,b,a; + int j,i,down = 0, v = 0, vv = 0; + + for(j=0;j<80;j+=20){ //j++ + for (i=0;i<80;i+=1){ //i++ + c=getpixel(s, j, i); //getpixel2 + SDL_GetRGBA(c, s->format, &r, &g, &b, &a); + if (r !=255 || g !=255 || b !=255) { + if (i>down) + { + down=i; + + switch (80 % down){ + case 1: + v = 0; + vv = 0; + break; + case 21: + v = 1; + vv = 20; + break; + case 2: + v = 2; + vv = 40; + break; + } + } + } + else { + + } + } + } + + if (down+posY+vv>=600) { + for (i=0; i<4; i++){ + for (j=0; j<4; j++) { + if (this->elements[n_figure][i+n_element*4][j]==0) { + asm("nop"); + putchar(' '); + } + else if (this->elements[n_figure][i+n_element*4][j]==1) { + szlamField[posY/20+i+v][posX/20+j]=color; + + putchar('#'); + } + } + putchar('\n'); + } + return true; + } + return false; +} + +bool Szlam::collisionLeft(SDL_Surface *s, int n_element, + int figure, int x_s, int y_s, int color){ + + Uint32 cf, cs; + Uint8 r,g,b,a, r2,g2,b2,a2; + int i, j=0; + + for(j=0;j<80;j+=1){ // y j++ + for (i=0;i<80;i+=1){ // x i++ + + cs=getpixel(s, i, j); //getpixel2 + SDL_GetRGBA(cs, s->format, &r, &g, &b, &a); + cf=getpixel(field, i+x_s-20, j+y_s); //getpixel2 + printf("2\n"); + SDL_GetRGBA(cf, field->format, &r2, &g2, &b2, &a2); + + if ((r2!=255 || g2!=255 || b2!=255) && + (r!=255 || g!=255 || b!=255)) { + //*bottom=0; + //printf ("----bottom: %d\n", *bottom); + return SDL_TRUE; + //break; + } + } + } + return SDL_FALSE; +} + +bool Szlam::collisionRight(SDL_Surface *s, int n_element, + int figure, int x_s, int y_s, int color){ + + Uint32 cf, cs; + Uint8 r,g,b,a, r2,g2,b2,a2; + int i, j=0; + + for(j=0;j<80;j+=1){ // y j++ + for (i=0;i<80;i+=1){ // x i++ + + cs=getpixel(s, i, j); //getpixel2 + SDL_GetRGBA(cs, s->format, &r, &g, &b, &a); + cf=getpixel(field, i+x_s+20, j+y_s); //getpixel2 + SDL_GetRGBA(cf, field->format, &r2, &g2, &b2, &a2); + + if ((r2!=255 || g2!=255 || b2!=255) && + (r!=255 || g!=255 || b!=255)) { + //*bottom=0; + return SDL_TRUE; + //break; + } + } + } + return SDL_FALSE; +} + +bool Szlam::collisionRotate(SDL_Surface *s, int n_element, + int figure, int x_s, int y_s, int color){ + + Uint32 cf, cs; + Uint8 r,g,b,a, r2,g2,b2,a2; + int i, j=0; + + for(j=0;j<80;j+=1){ // y j++ + for (i=0;i<80;i+=1){ // x i++ + + cs=getpixel(s, i, j); //getpixel2 + SDL_GetRGBA(cs, s->format, &r, &g, &b, &a); + cf=getpixel(field, i+x_s, j+y_s); //getpixel2 + SDL_GetRGBA(cf, field->format, &r2, &g2, &b2, &a2); + + if ((r2!=255 || g2!=255 || b2!=255) && + (r!=255 || g!=255 || b!=255)) { + // *bottom=0; + return SDL_TRUE; + //break; + } + } + } + return SDL_FALSE; +} + +bool Szlam::collisionBottom(SDL_Surface *s, int n_element, + int figure, int x_s, int y_s, int color) { + + + Uint32 cf, cs; + Uint8 r,g,b,a, r2,g2,b2,a2; + int i, j=0; + bool go_szlam=false; + + for(j=0;j<80;j+=1){ // y j++ + for (i=0;i<80;i+=20){ // x i++ + cs=getpixel(s, i, j); //getpixel2 + SDL_GetRGBA(cs, s->format, &r, &g, &b, &a); + cf=getpixel(field, i+x_s, j+y_s); //getpixel2 + SDL_GetRGBA(cf, field->format, &r2, &g2, &b2, &a2); + + if ((r2!=255 || g2!=255 || b2!=255) && + (r!=255 || g!=255 || b!=255)) { + go_szlam=true; + break; + } + } + } + + + if (go_szlam) { + for (i=0; i<4; i++){ + for (j=0; j<4; j++) { + if (this->elements[figure][i+n_element*4][j]==0) { + asm("nop"); + } + else if (this->elements[figure][i+n_element*4][j]==1) { + szlamField[y_s/20+i][x_s/20+j]=color; + } + } + } + return true; + } + + return false; +} + +// sprawdza czy równa powierzchnia +int Szlam::evenSurface(int *height) +{ + int i, j, count=0; + int full[600/20] = {0}; + //bool flag[30] = SDL_FALSE; + + for (i=0; i<600/20; i++){ + for (j=0; j<400/20; j++) { + if (szlamField[i][j] !=0 && szlamGhost[i]==SDL_FALSE) { + full[i]+=1; + + } + } + } + for (i=0; i < 600/20; i++){ + if (full[i]==20) { + count++; + szlamGhost[i]=SDL_TRUE; + } + if (full[i]!=0) (*height)++; + } + return count; +} + +// skraca studnie +void Szlam::cutSurface(int n, int h) +{ + int i, j, k; + + while (n-->0) { + //for (i=600/20-1, k=h; k>0; i--, k--) { + for (i=600/20-1, k=h; i>0; i--, k--) { + for (j=400/20-1; j>=0; j--){ + szlamField[i][j] = szlamField[i-1][j]; + szlamGhost[i] = szlamGhost[i-1]; + + } + } + } +} + +bool Szlam::highFull() +{ + int j; + + for (j=0; j<400/20; j++){ + if (szlamField[0][j] != 0 || szlamField[1][j] != 0) + return SDL_TRUE; + } + return SDL_FALSE; +} +