Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <math.h>
- #include <stdio.h>
- #include<cstdlib>
- #include<time.h>
- // Dołącz definicje biblioteki Allegro
- #include <allegro5/allegro.h>
- #include <allegro5/allegro_primitives.h>
- const float FPS = 60; //obraz będzie aktualizowany co 1/FPS sekundy
- const int SCREEN_W = 640; //szerokość okna
- const int SCREEN_H = 480; //wysokość okna
- // Funkcja główna
- int main()
- {
- srand(time(NULL));
- ALLEGRO_DISPLAY *display = NULL; //okno
- ALLEGRO_EVENT_QUEUE *event_queue = NULL; //kolejka zdarzen
- ALLEGRO_TIMER *timer = NULL; //timer, od ktorego będziemy odbierac zdarzenia (potrzebny do animacji)
- bool redraw = true;
- if (!al_init()) { //inicjalizacja biblioteki Allegro
- fprintf(stderr, "Nie zainicjalizowano allegro!\n");
- return -1;
- }
- display = al_create_display(SCREEN_W, SCREEN_H); //utworznie okna
- timer = al_create_timer(1.0 / FPS); //utworzenie timera
- al_install_keyboard(); //inicjalizacja obsługi klawiatury
- al_install_mouse();
- event_queue = al_create_event_queue(); //utworzenie kolejki zdarzeń
- al_init_primitives_addon(); //inicjalizacja obsługi prostych elementów (punkty, linie, prostokąty, elipsy itd.)
- //Rejestracja żródeł zdarzeń (okno, timer, klawiatura ...)
- al_register_event_source(event_queue, al_get_display_event_source(display));
- al_register_event_source(event_queue, al_get_timer_event_source(timer));
- al_register_event_source(event_queue, al_get_keyboard_event_source());
- al_register_event_source(event_queue, al_get_mouse_event_source());
- //Kolory rysowania
- ALLEGRO_COLOR yellow = al_map_rgb(255, 255, 0);
- ALLEGRO_COLOR white = al_map_rgb(255, 255, 255);
- ALLEGRO_COLOR blue = al_map_rgb(0, 0, 255);
- ALLEGRO_COLOR black = al_map_rgb(0, 0, 0);
- ALLEGRO_COLOR red = al_map_rgb(255, 0, 0);
- int res[20];
- res[0] = 1;
- //Definicja wielokąta
- const int N = 3;
- float dx[N] = { -180.0, 180.0, 0.0};
- float dy[N] = { 150.0, 150.0, -200.0};
- const int C = 4;
- float zx[C] = { -80.0, -65.0, 70.0, 55.0 };
- float zy[C] = { 80.0, 100.0, 0.0, -20.0 };
- float pointsCross[2 * C];
- const int B = 4;
- float bx[B] = { -55.0, -70.0, 65.0, 80.0 };
- float by[B] = { -20.0, 0.0, 100.0, 80.0 };
- float pointsCro[2 * C];
- //Tablice na przetworzone współrzędna punktów
- float points[2*N];
- //Zmienne na potrzeby obracania figury
- double fi=0.0, dfi=0.1, sinfi, cosfi;
- //Uruchamiamy timer, który będzie z zadaną częstotliwością wysyłał zdarzenia
- al_start_timer(timer);
- //Pętla główna programu - obsługa zdarzeń.
- //Działamy, dopóki użytkownik nie wciśnie Esc.
- int mouseX[20];
- int mouseY[20];
- mouseX[0] = SCREEN_W / 2;
- mouseY[0] = SCREEN_H / 2;
- int Count = 1;
- while(true)
- {
- ALLEGRO_EVENT event;
- al_wait_for_event(event_queue, &event);
- if (event.type == ALLEGRO_EVENT_TIMER) { //zdarzenie timera -> odświeżenie obrazu
- redraw = true;
- }
- else if (event.type == ALLEGRO_EVENT_KEY_DOWN) { //zdarzenie klawiatury -> jeśli Esc to kończymy
- if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE)
- break;
- }
- else if (event.type == ALLEGRO_EVENT_DISPLAY_CLOSE) { //zdarzenie zamknięcia okna
- break;
- }
- else if (event.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN ) {
- mouseX[Count] = event.mouse.x;
- mouseY[Count] = event.mouse.y;
- Count++;
- res[Count-1] = 0;
- while (!res[Count - 1]) {
- res[Count - 1] = std::rand() % 10;
- }
- }
- if (redraw && al_is_event_queue_empty(event_queue))
- {
- redraw = false;
- al_clear_to_color(black); //czyszczenie okna na zadany kolor
- //Wyznacz środek ekranu
- //int xm = SCREEN_W / 2;
- //int ym = SCREEN_H / 2;
- //Obrót figury
- sinfi = sin(fi/3);
- cosfi = cos(fi/3);
- for (int j = 0; j < Count; j++) {
- for (int i = 0; i < N; i++)
- {
- points[2 * i] = (dx[i] * cosfi / res[j] - dy[i] * sinfi / res[j] + 0.5) + mouseX[j];
- points[2 * i + 1] = (dx[i] * sinfi / res[j] + dy[i] * cosfi / res[j] + 0.5) + mouseY[j];
- }
- for (int i = 0; i < C; i++)
- {
- pointsCross[2 * i] = (zx[i] * cosfi / res[j] - zy[i] * sinfi / res[j] + 0.5) + mouseX[j];
- pointsCross[2 * i + 1] = (zx[i] * sinfi / res[j] + zy[i] * cosfi / res[j] + 0.5) + mouseY[j];
- }
- for (int i = 0; i < B; i++)
- {
- pointsCro[2 * i] = (bx[i] * cosfi / res[j] - by[i] * sinfi / res[j] + 0.5) + mouseX[j];
- pointsCro[2 * i + 1] = (bx[i] * sinfi / res[j] + by[i] * cosfi / res[j] + 0.5) + mouseY[j];
- }
- al_draw_filled_polygon(points, N, yellow);
- al_draw_polygon(points, N, ALLEGRO_LINE_JOIN_ROUND, red, 15/res[j], 15);
- al_draw_filled_polygon(pointsCross, C, black);
- al_draw_filled_polygon(pointsCro, B, black);
- //Wyświetl w oknie to, co narysowano w buforze
- al_flip_display();
- }
- fi += dfi;
- //Narysuj wypełniony okrąg
- //al_draw_filled_circle(xm, ym, 100, blue);
- //al_draw_circle(xm, ym, 100, yellow, 2);
- //Narysuj wypełniony wielokat
- //al_draw_filled_polygon(points, N, yellow);
- //al_draw_polygon(points, N, ALLEGRO_LINE_JOIN_ROUND, red, 15, 15);
- //al_draw_filled_polygon(pointsCross, C, black);
- //al_draw_filled_polygon(pointsCro, B, black);
- ////Wyświetl w oknie to, co narysowano w buforze
- //al_flip_display();
- }
- }
- al_destroy_display(display);
- al_destroy_timer(timer);
- al_destroy_event_queue(event_queue);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement