#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <SDL/SDL.h> #include <math.h> // Load object files: // Dev-Cpp\Lib\libSDL.a // Ikkunan koko: int leveys = 640; int korkeus = 480; void putpixel(SDL_Surface *screen, int x, int y, Uint32 color); void imagefilledrect(SDL_Surface *screen, int x1, int y1, int x2, int y2, Uint32 color); void scan_possible(Uint8 *data, Uint8 *pos, int lev, int kor){ // Kasvava lima by T.M. - www.HC-Codes.net int x, y; for(y = 0; y < kor; y++){ for(x = 0; x < lev; x++){ if(data[y*lev+x] == 1){ if(y > 0) if(data[(y-1)*lev+x] == 0) pos[(y-1)*lev+x] = 1; if(x < lev-1) if(data[y*lev+x+1] == 0) pos[y*lev+x+1] = 1; if(y < kor-1) if(data[(y+1)*lev+x] == 0) pos[(y+1)*lev+x] = 1; if(x > 0) if(data[y*lev+x-1] == 0) pos[y*lev+x-1] = 1; } } } } void grow_random(Uint8 *data, Uint8 *pos, int lev, int kor, int ran){ // Kasvava lima by T.M. - www.HC-Codes.net int x, y; Uint8 *m = data; Uint8 *p = pos; for(y = 0; y < kor; y++){ for(x = 0; x < lev; x++){ if(*p == 1){ if(rand()%ran == 0){ *m = 1; } } p++; m++; } } } int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow){ if(SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0){ printf("Unable to init SDL: %s\n", SDL_GetError()); exit(1); } SDL_WM_SetCaption("Kasvava lima - TM", NULL); atexit(SDL_Quit); SDL_Surface *screen; SDL_Event event; screen = SDL_SetVideoMode(leveys, korkeus, 32, SDL_HWSURFACE|SDL_DOUBLEBUF); if(screen == NULL){ printf("Unable to set video mode: %s\n", SDL_GetError()); exit(1); } int done = 0; Uint8* nappi; int mouse; int mx, my; int areagrow = 0; // Laskuri sille mikä etsii mahdolliset kasvatuspisteet int growrandom = 0; // Laskuri sille mikä kasvattaa limaa int areagrow_speed = 10; // Kuinka usein uusi kasvatettava alue etsitään (suurempi harvemmin) int growrandom_speed = 0; // Kuinka usein aluetta kasvatetaan (suurempi harvemmin) int grow_amount = 40; // Kuinka paljon lima kasvaa kerralla, (pienempi useammin) pitää olla vähintään 1 // Kuinka suuri alue limalle: int lev = 160; int kor = 120; int koko = 4; // Liman neliön koko int kr = 8; // Kuinka iso alue pyyhitään pois D-näppäimellä // Varataan muistia limalle: Uint8 *pos = (Uint8 *)malloc(sizeof(Uint8) * lev * kor); // Alue josta löytyy paikat mihin voidaan kasvattaa limaa Uint8 *data = (Uint8 *)malloc(sizeof(Uint8) * lev * kor); // Alue josta löytyy kasvava lima ja muut esteet. // Nollataan varatut muistit, ettei tule yllätyksiä: memset(pos, 0, sizeof(Uint8) * lev * kor); memset(data, 0, sizeof(Uint8) * lev * kor); int x, y; int px, py; // Lasketut hiiren koordinaatit (esim: mx/koko) Uint32 vari; bool show_growareas = 0; // Näppäimen S painalluksen valvoja while(done == 0){ while(SDL_PollEvent(&event)){ if(event.type == SDL_QUIT) done = 1; if(event.type == SDL_KEYDOWN) if(event.key.keysym.sym == SDLK_ESCAPE) done = 1; } SDL_FillRect(screen, NULL, 0); mouse = SDL_GetMouseState(&mx, &my); nappi = SDL_GetKeyState(NULL); // Lasketaan sen neliön sijainti jonka päällä hiiri on: px = mx/koko; py = my/koko; // Varmistetaan ettei mennä yli reunojen: if(px > lev-1) px = lev-1; if(py > kor-1) py = kor-1; // Jos painetaan hiiren vasenta nappia, luodaan yksi limapiste: if(mouse & SDL_BUTTON(1)){ data[py*lev+px] = 1; } // Jos painetaan hiiren oikeata nappia, luodaan yksi seinä: if(mouse & SDL_BUTTON(3)){ data[py*lev+px] = 255; } // Jos painetaan näppäintä "D": if(nappi[SDLK_d]){ // Poistetaan ison neliön verran limaa: for(y = -kr; y < kr; y++){ for(x = -kr; x < kr; x++){ // Tarkistetaan ettei piirretä yli reunojen: if(py+y > -1 && py+y < kor && px+x > -1 && px+x < lev){ if(data[(py+y)*lev+px+x] == 1) data[(py+y)*lev+px+x] = 0; } } } } show_growareas = 0; if(nappi[SDLK_s]){ show_growareas = 1; } for(y = 0; y < kor; y++){ for(x = 0; x < lev; x++){ vari = 0; // Tausta musta if(data[y*lev+x] == 1){ vari = 0x888800; // Lima vihreä }else if(data[y*lev+x] == 255){ vari = 0xDDDDDD; // Seinä harmaa } if(show_growareas){ if(!vari){ if(pos[y*lev+x] == 1){ vari = 0x000088; } } } if(vari){ // Piirretään neliö: imagefilledrect(screen, x*koko, y*koko, x*koko+koko-1, y*koko+koko-1, vari); } } } if(areagrow > areagrow_speed){ // Nollataan liman mahdollisten kasvatuskohtien muisti: memset(pos, 0, sizeof(Uint8) * lev * kor); // Etsitään mahdolliset liman kasvatuskohdat: scan_possible(data, pos, lev, kor); areagrow = 0; } if(growrandom > growrandom_speed){ // Kasvatetaan limaa: grow_random(data, pos, lev, kor, grow_amount); growrandom = 0; } areagrow++; growrandom++; SDL_Delay(10); SDL_Flip(screen); } return 0; } inline void putpixel(SDL_Surface *screen, int x, int y, Uint32 color){ bool draw = 1; if(x > leveys-1) draw = 0; else if(y > korkeus-1) draw = 0; else if(x < 0) draw = 0; else if(y < 0) draw = 0; if(draw){ Uint8 *p = (Uint8 *)screen->pixels; *(Uint32 *)(p + y * screen->pitch + (x << 2)) = color; } } void imagefilledrect(SDL_Surface *screen, int x1, int y1, int x2, int y2, Uint32 color){ int x, y, tx, ty; if(x2 < x1){ tx = x2; x2 = x1; x1 = tx; } if(y2 < y1){ ty = y2; y2 = y1; y1 = ty; } for(y = y1; y <= y2; y++){ for(x = x1; x <= x2; x++){ putpixel(screen, x, y, color); } } }
Aihe on jo aika vanha, joten et voi enää vastata siihen.