#include <allegro.h> #include <string> #include <fstream> using namespace std; //wymiary const int WXp = 800, WYp = 600, SKALA = 2; const int WX = WXp/SKALA; const int WY = WYp/SKALA; ///////////////////////// volatile long speed = 0; void increment_speed() { speed++; } END_OF_FUNCTION(increment_speed); LOCK_VARIABLE(speed); LOCK_FUNCTION(increment_speed); ///////////////////////// volatile int close_button_pressed = FALSE; void close_button_handler(void) { close_button_pressed = TRUE; } END_OF_FUNCTION(close_button_handler) ////////////////////////// class wzory { public: string nazwa; short int * dane; int rozmiar; wzory() {}; wzory(string nazwa, int limit, bool & ok) : nazwa(nazwa) { string nazwapliku = nazwa + ".ogl"; ifstream plik; plik.open( nazwapliku.c_str() ); plik >> rozmiar; dane = new short int[rozmiar]; short int x; if( plik.good() ) { for(int i=0; i<rozmiar; i++) { plik >> x; dane[i] = x; } ok = true; } else { ok = false; } plik.close(); } }; int mx=0,my=0,mb=0; void myszka(); int kolor(short unsigned int p); void narysuj(short unsigned int[WX][WY], wzory &); void init(); ///////////////////////////////////////////////////////// int main() { allegro_init(); init(); BITMAP *bufor = NULL; short unsigned int baza[WX][WY]; short unsigned int bazaBufor[WX][WY]; for(int x=0; x<WX; x++) for(int y=0; y<WY; y++) {baza[x][y] = 0; bazaBufor[x][y] = 0;} bool flagaZycia = true; bool czas = true; int wzor = 0; string etykieta; int licznik_klikniecia = 0, licznik_klawisza = 0, licznik_pauzy = 0; int limit_klikniecia = 10*SKALA, limit_klawisza = 15*SKALA, limit_pauzy = 15*SKALA; //log //ofstream log("log.txt", ios::app); ////wczytywanie wzorow ifstream listaPlikow( "list.txt" ); int liczbaPlikow=0; string nic; //policzenie plikow if( listaPlikow.good() ) { while( !listaPlikow.eof() ) { listaPlikow >> nic; liczbaPlikow++; } } listaPlikow.clear(); listaPlikow.seekg( 0, ios::beg ); wzory * katalog = new wzory[liczbaPlikow]; string nazwaWzoru; if( listaPlikow.good() ) { int i=0; bool ok; while( !listaPlikow.eof() ) { listaPlikow >> nazwaWzoru ; katalog[i] = wzory(nazwaWzoru, 1, ok); if( ok ) { i++; } else { liczbaPlikow--; } } } listaPlikow.close(); bufor = create_bitmap(WXp,WYp); /////// glowna petla while (!key[KEY_ESC] && !close_button_pressed) { clear_to_color(bufor, makecol(100,100,100)); myszka(); if( licznik_klikniecia < limit_klikniecia ){ licznik_klikniecia++; } if( licznik_klikniecia > limit_klikniecia ){ licznik_klikniecia = limit_klikniecia; } if( licznik_pauzy < limit_pauzy ){ licznik_pauzy++; } if( licznik_klawisza < limit_klawisza ){ licznik_klawisza++; } etykieta = katalog[wzor].nazwa; if( key[KEY_Z] && licznik_klawisza == limit_klawisza ) { licznik_klawisza = 0; wzor = (wzor+liczbaPlikow-1)%liczbaPlikow; } if( key[KEY_X] && licznik_klawisza == limit_klawisza ) { licznik_klawisza = 0; wzor = (wzor+1)%liczbaPlikow; } if( key[KEY_A] && licznik_klawisza == limit_klawisza ){licznik_klawisza=0; czas = !czas;} if( key[KEY_S] && licznik_klawisza == limit_klawisza ){licznik_klawisza=0; flagaZycia = !flagaZycia;} if( key[KEY_Q] ){for(int y=0; y<WY; y++) for(int x=0; x<WX; x++) {baza[x][y] = 0; bazaBufor[x][y] = 0;}} if(mb == 1 && licznik_klikniecia == limit_klikniecia) { licznik_klikniecia = 0; narysuj(bazaBufor, katalog[wzor]); } if( czas ) { for(int x=0; x<WX; x++) { for(int y=0; y<WY; y++) { int otoczenie = (bool)baza[ (x-1+WX)%WX ][ (y-1+WY)%WY ] + (bool)baza[ (x-1+WX)%WX ][ y ] + (bool)baza[ (x-1+WX)%WX ][ (y+1)%WY ] + (bool)baza[ x ][ (y-1+WY)%WY ] + (bool)baza[ x ][ (y+1)%WY ] + (bool)baza[ (x+1)%WX ][ (y-1+WY)%WY ] + (bool)baza[ (x+1)%WX ][ y ] + (bool)baza[ (x+1)%WX ][ (y+1)%WY ]; if( (baza[x][y] == 0) && (otoczenie == 3) ){bazaBufor[x][y] = 1;} if( (baza[x][y] > 0) && (otoczenie == 3 || otoczenie == 2) ){bazaBufor[x][y] = baza[x][y];} if( (baza[x][y] > 0) && (otoczenie != 3 && otoczenie != 2) && flagaZycia ){bazaBufor[x][y] = 0;} if( (bazaBufor[x][y] > 0) && (bazaBufor[x][y] == baza[x][y]) ) { if( baza[x][y] < 65400 ) bazaBufor[x][y] += 100; } } } } for(int x=0; x<WX; x++) { for(int y=0; y<WY; y++) { if(baza[x][y]){rectfill(bufor, SKALA*x, SKALA*y, SKALA*(x+1), SKALA*(y+1), kolor(baza[x][y]) );} baza[x][y] = bazaBufor[x][y]; } } textprintf_ex(bufor,font,20,20,makecol(200,200,200),-1, "smierc: A wl, S wyl; Q reset"); textprintf_ex(bufor,font,20,40,makecol(200,200,200),-1, "wzor rysowania: %s (%d/%d)", etykieta.c_str(), wzor+1, liczbaPlikow); textprintf_ex(bufor,font,20,60,makecol(200,200,200),-1, "pauza %s smierc %s", (czas) ? "wyl" : "wl", (!flagaZycia) ? "wyl" : "wl" ); blit(bufor,screen,0,0,0,0,WXp,WYp); clear_keybuf(); } /////////// destroy_bitmap(bufor); allegro_exit(); return 0; } END_OF_MAIN() ///////////////////////////////////////////////////////// void myszka() { if( mx != mouse_x || my != mouse_y || mb != mouse_b) { mx = mouse_x/SKALA; my = mouse_y/SKALA; mb = mouse_b; } }; void init() { LOCK_FUNCTION(close_button_handler); set_close_button_callback(close_button_handler); install_keyboard(); set_color_depth(16); set_gfx_mode(GFX_AUTODETECT_WINDOWED,WXp,WYp,0,0); install_mouse(); set_mouse_speed(5,5); show_mouse(screen); unscare_mouse(); install_timer(); install_int_ex(increment_speed, BPS_TO_TIMER(200)); } int kolor(short unsigned int p) { p /= 255; if(p == 0) {return makecol(0,255,0);} else if(p>0 && p<=127) {return makecol(2*p,255,0);} else if(p>127 && p<255) {return makecol(255,255 - 2*p,0);} else {return makecol(255,0,0);} } void narysuj (short unsigned int tab[WX][WY], wzory & wzor) { for(int i=0; i<wzor.rozmiar; i+=2) { tab[(mx+*(wzor.dane+i)+WX)%WX][(my+*(wzor.dane+i+1)+WY)%WY] = 1; } } /////////////