#include #include #define AMUNT 0 #define DRETA 1 #define AVALL 2 #define ESQUERRA 3 #define OFFSET_X 60 #define OFFSET_Y 35 #define MODE_NORMAL 0 #define MODE_CREANT 1 #define COLOR_BLACK 0 #define COLOR_WHITE 1 #define COLOR_GREY 2 #define COLOR_RED 3 #define COLOR_YELLOW 4 #define COLOR_DARKRED 5 #define COLOR_DARKTEAL 6 SDL_Window *win; SDL_Renderer *ren; SDL_Texture * tex; Uint8 pixels[200*200]; int player_x = 100; int player_y = 198; int mode = MODE_NORMAL; int lento = 0; int last_x = 100; int last_y = 198; void set_color(int color) { switch (color) { case COLOR_BLACK: SDL_SetRenderDrawColor(ren, 0, 0, 0, 255); break; case COLOR_WHITE: SDL_SetRenderDrawColor(ren, 255, 255, 255, 255); break; case COLOR_GREY: SDL_SetRenderDrawColor(ren, 128, 128, 128, 255); break; case COLOR_RED: SDL_SetRenderDrawColor(ren, 217, 87, 99, 255); break; case COLOR_YELLOW: SDL_SetRenderDrawColor(ren, 251, 242, 54, 255); break; case COLOR_DARKRED: SDL_SetRenderDrawColor(ren, 172, 50, 50, 255); break; case COLOR_DARKTEAL: SDL_SetRenderDrawColor(ren, 48, 128, 130, 255); break; } } void draw_player() { const int x = player_x+OFFSET_X; const int y = player_y+OFFSET_Y; set_color(COLOR_RED); SDL_RenderDrawLine(ren, x, y-3, x+3, y); SDL_RenderDrawLine(ren, x+3, y, x, y+3); SDL_RenderDrawLine(ren, x, y+3, x-3, y); SDL_RenderDrawLine(ren, x-3, y, x, y-3); } void put_pix() { if (pixels[player_x+player_y*200]==COLOR_WHITE) return; last_x = player_x; last_y = player_y; pixels[player_x+player_y*200] = COLOR_DARKRED; SDL_SetRenderTarget(ren, tex); if (lento) set_color(COLOR_DARKRED); else set_color(COLOR_DARKTEAL); SDL_RenderDrawPoint(ren, player_x, player_y); SDL_SetRenderTarget(ren, NULL); } int any_black(int x, int y) { return (pixels[x+1+y*200]==0 || pixels[x-1+y*200]==0 || pixels[x+(y+1)*200]==0 || pixels[x+(y-1)*200]==0); } int get_sector_size(int x, int y, int size, int fill) { if (x>=0 && y>=0 && x<=198 && y<=198 && pixels[x+y*200]==0) { pixels[x+y*200]=fill; size++; size = get_sector_size(x-1, y, size, fill); size = get_sector_size(x, y-1, size, fill); size = get_sector_size(x+1, y, size, fill); size = get_sector_size(x, y+1, size, fill); } return size; } void fill_sector(int fill) { const Uint8 color = lento ? COLOR_DARKRED : COLOR_DARKTEAL; set_color(color); for (int y=0;y<200;++y) for (int x=0;x<200;++x) if (pixels[x+y*200]>=254) if (pixels[x+y*200]==fill) { pixels[x+y*200]=color; SDL_RenderDrawPoint(ren, x, y); } else { pixels[x+y*200]=0; } } void close_sector() { SDL_SetRenderTarget(ren, tex); set_color(COLOR_WHITE); for (int y=0;y<200;++y) for (int x=0;x<200;++x) if ((pixels[x+y*200]==COLOR_DARKRED || pixels[x+y*200]==COLOR_DARKTEAL) && any_black(x,y)) { pixels[x+y*200]=COLOR_WHITE; SDL_RenderDrawPoint(ren, x, y); } if (last_x==player_x) { int sector1 = get_sector_size(player_x-1, last_y, 0, 254); int sector2 = get_sector_size(player_x+1, last_y, 0, 255); if (sector2>sector1) fill_sector(254); else fill_sector(255); } else { int sector1 = get_sector_size(last_x, player_y-1, 0, 254); int sector2 = get_sector_size(last_x, player_y+1, 0, 255); if (sector2>sector1) fill_sector(254); else fill_sector(255); } SDL_SetRenderTarget(ren, NULL); } void make_rapid() { SDL_SetRenderTarget(ren, tex); set_color(COLOR_DARKTEAL); for (int y=0;y<200;++y) for (int x=0;x<200;++x) if (pixels[x+y*200]==COLOR_DARKRED && any_black(x,y)) { pixels[x+y*200]=COLOR_DARKTEAL; SDL_RenderDrawPoint(ren, x, y); } SDL_SetRenderTarget(ren, NULL); } int main(int argc, char *argv[]) { srand(SDL_GetTicks()); SDL_Init(SDL_INIT_EVERYTHING); win = SDL_CreateWindow("JIX", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 960, 720, SDL_WINDOW_SHOWN); ren = SDL_CreateRenderer(win, -1, 0); tex = SDL_CreateTexture(ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 200, 200); SDL_RenderSetLogicalSize(ren, 320, 240); for (int i=0; i<200*200; ++i) pixels[i]=0; for (int i=0; i<200; ++i) pixels[i]=pixels[i+198*200]=pixels[i*200]=pixels[198+i*200]=1; SDL_SetRenderTarget(ren, tex); set_color(COLOR_BLACK); SDL_RenderClear(ren); set_color(COLOR_WHITE); SDL_RenderDrawLine(ren, 0, 0, 198, 0); SDL_RenderDrawLine(ren, 0, 0, 0, 198); SDL_RenderDrawLine(ren, 198, 198, 198, 0); SDL_RenderDrawLine(ren, 198, 198, 0, 198); SDL_SetRenderTarget(ren, NULL); int should_exit = 0; SDL_Event e; Uint32 t = SDL_GetTicks(); const Uint8 *keys = SDL_GetKeyboardState(NULL); while (!should_exit) { while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) {should_exit=1;break;} if (e.type == SDL_KEYDOWN) { switch(e.key.keysym.scancode) { case SDL_SCANCODE_ESCAPE: should_exit = 1; break; }; } } int speed = 30; if (lento) speed = 60; if (SDL_GetTicks()-t>=speed) { if (keys[SDL_SCANCODE_UP] && player_y>0 && ( ((mode==MODE_CREANT || keys[SDL_SCANCODE_SPACE])&&pixels[player_x+(player_y-2)*200]==0) || pixels[player_x+(player_y-2)*200]==1)) { if (mode==MODE_CREANT) put_pix(); else if (pixels[player_x+(player_y-2)*200]==0) lento=1; mode = MODE_CREANT; player_y--; put_pix(); player_y--; } else if (keys[SDL_SCANCODE_RIGHT] && player_x<198 && ( ((mode==MODE_CREANT || keys[SDL_SCANCODE_SPACE])&&pixels[player_x+2+player_y*200]==0) || pixels[player_x+2+player_y*200]==1)) { if (mode==MODE_CREANT) put_pix(); else if (pixels[player_x+2+player_y*200]==0) lento=1; mode = MODE_CREANT; player_x++; put_pix(); player_x++; } else if (keys[SDL_SCANCODE_DOWN] && player_y<198 && ( ((mode==MODE_CREANT || keys[SDL_SCANCODE_SPACE])&&pixels[player_x+(player_y+2)*200]==0) || pixels[player_x+(player_y+2)*200]==1)) { if (mode==MODE_CREANT) put_pix(); else if (pixels[player_x+(player_y+2)*200]==0) lento=1; mode = MODE_CREANT; player_y++; put_pix(); player_y++; } else if (keys[SDL_SCANCODE_LEFT] && player_x>0 && ( ((mode==MODE_CREANT || keys[SDL_SCANCODE_SPACE])&&pixels[player_x-2+player_y*200]==0) || pixels[player_x-2+player_y*200]==1)) { if (mode==MODE_CREANT) put_pix(); else if (pixels[player_x-2+player_y*200]==0) lento=1; mode = MODE_CREANT; player_x--; put_pix(); player_x--; } if (mode==MODE_CREANT) { if (!keys[SDL_SCANCODE_SPACE]) { make_rapid(); lento=0; } if (pixels[player_x+player_y*200]==1) { close_sector(); mode = MODE_NORMAL; } } t = SDL_GetTicks(); } set_color(COLOR_BLACK); SDL_RenderClear(ren); SDL_Rect rect = {OFFSET_X,OFFSET_Y,200,200}; SDL_RenderCopy(ren, tex, NULL, &rect); draw_player(); SDL_RenderPresent(ren); } SDL_Quit(); return 0; }