Facebook
From Funky Marten, 6 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 252
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <vector>
  4. #include <time.h>
  5.  
  6. // Dołącz definicje biblioteki Allegro
  7. #include <allegro5/allegro.h>
  8. #include <allegro5/allegro_primitives.h>
  9.  
  10. const float FPS = 60;           //obraz będzie aktualizowany co 1/FPS sekundy
  11. const int SCREEN_W = 640;       //szerokość okna
  12. const int SCREEN_H = 480;       //wysokość okna
  13. float* hak;
  14.  
  15.  
  16. void draw_shape(int x, int y, int n, float R, ALLEGRO_COLOR kolor)
  17. {
  18.         float zmiana_alfa = (2 * ALLEGRO_PI) / n;
  19.         float alfa = 0;
  20.         float *wsp = new float[n*2];
  21.         for (int i = 0; i < n; i++)
  22.         {
  23.                 wsp[2*i] = x+R * cos(alfa);
  24.                 wsp[2 * i + 1] = y+R * sin(alfa);
  25.                 alfa += zmiana_alfa;
  26.         }
  27.         al_draw_polygon(wsp, n ,ALLEGRO_LINE_JOIN_BEVEL, kolor, 5, 6);
  28. }
  29. int rc()
  30. {
  31.         return rand()% 255;
  32. }
  33.  
  34.  
  35. // Funkcja główna
  36. int main()
  37. {
  38.         srand(time(NULL));
  39.         ALLEGRO_DISPLAY *display = NULL;                        //okno
  40.         ALLEGRO_EVENT_QUEUE *event_queue = NULL;        //kolejka zdarzen
  41.         ALLEGRO_TIMER *timer = NULL;                            //timer, od ktorego będziemy odbierac zdarzenia (potrzebny do animacji)
  42.         bool redraw = true;
  43.        
  44.         float tablica_wielokatow[50][20];// max 50 wielokatw, ni ewiecej niz 20 bokow
  45.        
  46.  
  47.         if (!al_init()) {                                                       //inicjalizacja biblioteki Allegro
  48.                 fprintf(stderr, "Nie zainicjalizowano allegro!n");
  49.                 return -1;
  50.         }
  51.        
  52.         display = al_create_display(SCREEN_W, SCREEN_H);        //utworznie okna
  53.         timer = al_create_timer(1.0 / FPS);                                     //utworzenie timera
  54.         al_install_keyboard();                                                          //inicjalizacja obsługi klawiatury
  55.         al_install_mouse();
  56.  
  57.        
  58.         event_queue = al_create_event_queue();                          //utworzenie kolejki zdarzeń
  59.        
  60.         al_init_primitives_addon();                                                     //inicjalizacja obsługi prostych elementów (punkty, linie, prostokąty, elipsy itd.)
  61.  
  62.         //Rejestracja żródeł zdarzeń (okno, timer, klawiatura ...)
  63.         al_register_event_source(event_queue, al_get_display_event_source(display));
  64.         al_register_event_source(event_queue, al_get_timer_event_source(timer));
  65.         al_register_event_source(event_queue, al_get_mouse_event_source());
  66.         al_register_event_source(event_queue, al_get_keyboard_event_source());
  67.        
  68.         //Kolory rysowania
  69.         ALLEGRO_COLOR yellow = al_map_rgb(255, 255, 0);
  70.         ALLEGRO_COLOR white = al_map_rgb(255, 255, 255);
  71.         ALLEGRO_COLOR blue = al_map_rgb(0, 0, 255);
  72.         ALLEGRO_COLOR black = al_map_rgb(0, 0, 0);
  73.  
  74.  
  75.         //Definicja wielokąta
  76.         const int N = 7;
  77.         float dx[N] = { 0.0, -30.0, -10.0, -10.0, 10.0, 10.0, 30.0 };
  78.         float dy[N] = { -60.0, -30.0,-30.0, 60.0, 60.0,-30.0,-30.0 };
  79.  
  80.         //Tablice na przetworzone współrzędna punktów
  81.         float points[2*N];
  82.  
  83.         //Zmienne na potrzeby obracania figury
  84.         double fi=0.0, dfi=0.1, sinfi, cosfi;
  85.  
  86.         //Uruchamiamy timer, który będzie z zadaną częstotliwością wysyłał zdarzenia
  87.         al_start_timer(timer);
  88.        
  89.         //Pętla główna programu - obsługa zdarzeń.
  90.         //Działamy, dopóki użytkownik nie wciśnie Esc.
  91.         while(true)
  92.         {
  93.                 ALLEGRO_EVENT event;
  94.                 al_wait_for_event(event_queue, &event);
  95.  
  96.                 if (event.type == ALLEGRO_EVENT_TIMER) {        //zdarzenie timera -> odświeżenie obrazu
  97.                         redraw = true;
  98.                 }
  99.                 else if (event.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN)
  100.                 {
  101.                         int random_n = rand() % 20 + 1;
  102.                         int random_size = rand() % 200 + 50;
  103.                        
  104.                         draw_shape(event.mouse.x, event.mouse.y, random_n, random_size, al_map_rgb(rc(), rc(), rc()));
  105.  
  106.                 }
  107.                 else if (event.type == ALLEGRO_EVENT_KEY_DOWN) {        //zdarzenie klawiatury -> jeśli Esc to kończymy
  108.                         if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE)
  109.                         break;
  110.                 }
  111.                
  112.                 else if (event.type == ALLEGRO_EVENT_DISPLAY_CLOSE) { //zdarzenie zamknięcia okna
  113.                         break;
  114.                 }
  115.  
  116.                 if (redraw && al_is_event_queue_empty(event_queue))
  117.                 {
  118.                         redraw = false;
  119.                         //al_clear_to_color(black); //czyszczenie okna na zadany kolor
  120.  
  121.                         //Wyznacz środek ekranu
  122.                         int xm = SCREEN_W / 2;
  123.                         int ym = SCREEN_H / 2;
  124.  
  125.                         //Obrót figury
  126.                         sinfi = sin(fi);
  127.                         cosfi = cos(fi);
  128.                         for (int i = 0; i < N; i++)
  129.                         {
  130.                                 points[2 * i] = (dx[i] * cosfi - dy[i] * sinfi + 0.5) + xm;
  131.                                 points[2 * i + 1]  = (dx[i] * sinfi + dy[i] * cosfi + 0.5) + ym;
  132.                         }
  133.                         fi += dfi;
  134.  
  135.                        
  136.  
  137.                         ////Narysuj wypełniony okrąg
  138.                         //al_draw_filled_circle(xm, ym, 100, blue);
  139.                         //al_draw_circle(xm, ym, 100, yellow, 2);
  140.  
  141.                         ////Narysuj wypełniony wielokat
  142.                         //al_draw_filled_polygon(points, N, white);
  143.  
  144.                         //Wyświetl w oknie to, co narysowano w buforze
  145.                         al_flip_display();
  146.                 }
  147.         }
  148.  
  149.         al_destroy_display(display);
  150.         al_destroy_timer(timer);
  151.         al_destroy_event_queue(event_queue);
  152.         return 0;
  153. }
  154.