Pierwsza aplikacja Tworzenie okienka allegro, obsługa klawiatury, timery oraz wyświetlanie spritów wykorzystując podwójne buforowanie.



Podobne dokumenty
Druga aplikacja Prymitywy, alpha blending, obracanie bitmap oraz mały zestaw przydatnych funkcji wyświetlających własnej roboty.

Obsługa myszy oraz tekst Korzystanie z myszki oraz wyświetlanie tekstu na przykładzie prostej klasy buttona. : )

Allegro5 część 1 - Witaj Świecie! Projekt, inicjalizacja, tworzenie okna, czcionki. Autor: Kamil Krzyszczuk - C mons

Allegro5 3/x. Przykład wklejamy go do dev'a zamiast kodu domyślnego dal programu z allegro i kompilujemy.

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

. Podstawy Programowania 1. Podstawy Grafiki 2D - część pierwsza Biblioteka Allegro. Arkadiusz Chrobot. 28 stycznia 2016

Podstawy Programowania 1 Podstawy Grafiki 2D - część pierwsza Biblioteka Allegro. Plan. Wprowadzenie. Inicjacja i finalizacja. Notatki.

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

1 Podstawy c++ w pigułce.

PROSTY PROGRAM DO MALOWANIA

Budowa i generowanie planszy

1 Podstawy c++ w pigułce.

Rysowanie punktów na powierzchni graficznej

I - Microsoft Visual Studio C++

Część 4 życie programu

Programowanie komputerowe. Zajęcia 4

Kurs WWW. Paweł Rajba.

Laboratorium 12: Podstawy grafiki 2D - biblioteka Allegro. mgr inż. Leszek Ciopiński dr inż. Arkadiusz Chrobot

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

W kolejnym odcinku zajmiemy się umieszczaniem w naszym projekcie zestawu ikon służących szybkiemu korzystaniu z opcji programu.

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Podstawy Programowania C++

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Programowanie komputerowe. Zajęcia 1

Programowanie strukturalne i obiektowe. Funkcje

void Pobierz(Student &a); void Wypisz(Student a); void Ustaw_zaliczenia(Student t[],int r); void Wypisz_najlepszych(Student t[],int r, float prog);

Wykład 3 Składnia języka C# (cz. 2)

Wykład 4: Klasy i Metody

Lab 9 Podstawy Programowania

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

2 Przygotował: mgr inż. Maciej Lasota

Baltie 3. Podręcznik do nauki programowania dla klas I III gimnazjum. Tadeusz Sołtys, Bohumír Soukup

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Formaty plików graficznych - wprowadzenie

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Praktyka programowania projekt

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

ANALIZA I INDEKSOWANIE MULTIMEDIÓW (AIM)

Podstawy programowania. Wykład: 7. Funkcje Przekazywanie argumentów do funkcji. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Wstęp do Programowania, laboratorium 02

Minimalna wspierana wersja systemu Android to zalecana 4.0. Ta dokumentacja została wykonana na telefonie HUAWEI ASCEND P7 z Android 4.

Programowanie - wykład 4

Program 14. #include <iostream> #include <ctime> using namespace std;

1 Temat: Wprowadzenie do biblioteki OpenCV

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Zmienne i struktury dynamiczne

PROJEKT WIZYTÓWKI WIZYTÓWKA A

Obsługa grafiki w Delphi, rysowanie na płótnie, obsługa myszki, zapisywanie obrazków do plików, bitmapy pozaekranowe.

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Podstawy Programowania

Układy VLSI Bramki 1.0

Zasady programowania Dokumentacja

1. Opis okna podstawowego programu TPrezenter.

Spis treści. Programowanie w ImageJ. Zadanie 1. Zadanie 2

Przed rozpoczęciem pracy otwórz nowy plik (Ctrl +N) wykorzystując szablon acadiso.dwt

Szybkie tworzenie grafiki w GcIde

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Jak zawsze wyjdziemy od terminologii. While oznacza dopóki, podczas gdy. Pętla while jest

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Laboratorium 1 - Programowanie proceduralne i obiektowe

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Pong to dwuwymiarowy symulator tenisa sportowego. Gracz, poruszając prostokątem symulującym paletkę, stara się zdobyć punkt poprzez posłanie piłki

Jak posługiwać się edytorem treści

Obsługa wyjątków. Język C++ WW12

Obliczenie pola wieloboku na podstawie współrzędnych wierzchołków

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Grafika w aplikacjach lp. Jak zmienić kolor tła?

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Wskaźniki w C. Anna Gogolińska

Adobe InDesign lab.1 Jacek Wiślicki, Paweł Kośla. Spis treści: 1 Podstawy pracy z aplikacją Układ strony... 2.

Gimp - poznaj jego możliwości!

Wizualne systemy programowania. Wykład 11 Grafika. dr Artur Bartoszewski -Wizualne systemy programowania, sem. III- WYKŁAD

Visual Studio instalacja

Przykładowa dostępna aplikacja w Visual Studio - krok po kroku

Wprowadzenie do środowiska Qt Creator

Dokumentacja WebMaster ver 1.0

Programowanie obiektowe

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Argumenty wywołania programu, operacje na plikach

JSLib 4.1 Dokumentacja

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 3

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Rozdział 4 KLASY, OBIEKTY, METODY

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Programowanie komputerowe. Zajęcia 7

Informatyka II. Laboratorium Aplikacja okienkowa

Transkrypt:

Witam. Nie znalazłem porządnego tutoriala o allegro 4.2 po polsku(jest beznadziejny tutorial easycodera, który tylko mąci w głowach), więc postanowiłem napisać ten tutorial aby pomóc niektórym w nauce świetnej biblioteki jaką jest Allegro. Pisząc go będę opierać się o allegro 4.2.1 i korzystać z Visual Studio 2008. Zakładam, że znacie C++ oraz sami potraficie ściągnąć bibliotekę i pogodzić z nią swoje środowisko(byle nie Dev C++!). Jeśli nie to się nauczcie. : ) No to zaczynamy. Pierwsza aplikacja Tworzenie okienka allegro, obsługa klawiatury, timery oraz wyświetlanie spritów wykorzystując podwójne buforowanie. Na samym początku includujemy sobie nagłówek allegro.h. Później dodajmy sobie dwa przydatne makra-width oraz HEIGHT oznaczające odpowiednio szerokość oraz wysokość naszego okienka. U mnie będą miały one wartości 800 oraz 600. Teraz pierwsza nowa rzecz: Deklarujemy dwa obiekty bitmap allegro. :) Bitmapy w allegro służą do malowania-nimi oraz po nich. BITMAP *bufor; BITMAP *ryjek; Pierwsza bitmapa to nasz bufor. Będziemy po nim malować, aby potem jednym sprawnym ruchem w błyskawicznie przerzucić cały obraz na ekran unikając efektu migania. Ryjek to nasz obrazek, który wczytamy sobie z pliku. Następnie zadeklarujemy dwie zmienne pomocnicze: zmienną liczbową ticks oraz flagę wyjscie: int ticks=0; bool wyjscie=false; Zmienna ticks posłuży nam tylko i wyłącznie do timera. Więcej o niej później. A flaga wyjscie będzie do podtrzymywania naszej pętli głównej-petla wykonywać się bedzie dopóty dopóki wyjscie==false. :) Dodamy sobie także dwie zmienne: x i y oznaczające pozycję naszego obrazka. float x=100,y=100; Domyślnie ustawiłem je na 100,100. Następnie deklarujemy funkcję timera: Jak widać funkcja jest banalna-jedyne co robi to zwiększa ticks o jeden. Ok, teraz trochę bardziej skomplikowana funkcja init(): void init() allegro_init(); install_keyboard(); set_color_depth(32); set_gfx_mode(gfx_autodetect_windowed, WIDTH, HEIGHT, 0, 0); W skrócie tworzy ona nam nasze okienko allegro oraz inicjuje timer i klawiaturę. Opiszę ją dokładniej. Instrukcja void allegro_init() inicjuje allegro, włącza je. void install_keyboard() mówi bibliotece allegro, że chcemy korzystać z klawiatury. Funkcja void set_color_depth(int depth) ustawia

głębię kolorów naszego programu-wybieramy największą, czyli 32 bity. Następna jest trochę bardziej skomplikowana funkcja set_gfx_mode: int set_gfx_mode(int card, int w, int h, int v_w, int v_h); Pierwszy argument oznacza typ aplikacji jaką chcemy utworzyć-pełnoekranową, czy może w okienku. My chcemy w okienku. Następnie podajemy wymiary naszego okienka-czyli makra które zdefiniowaliśmy na początku. Dwa ostatnie argumenty nie były mi nigdy potrzebne więc zakładam, że Wam również nie będą i pozwolę sobie je pominąć. : ) Ostania instrukcja tworzy nam nasz upragniony timer. int install_int(void (*proc)(), int speed); Jako pierwszy argument pobiera ona wskaźnik do funkcji, która ma być wykonywana co ilość milisekund podanych jako drugi argument. My podajemy tam kolejno funkcję timerproc oraz 30 milisekund. Oznacza to, że funkcja timerproc będzie wykonywana co 30 milisekund. Następnie stworzymy sobię funkcję load(), w którejto 'stworzymy' bufor oraz wczytamy nasz obrazek. Oto ona: void load() bufor=create_bitmap(width,height); ryjek=load_bitmap("ryjek.bmp",null); Tworzenie bufora jest dość proste-wystarczy poprostu nadać mu wartość zwracaną przez banalną funkcję BITMAP *create_bitmap(int width, int height). Jako parametry pobiera ona szerokość oraz wysokość naszej bitmapy. My tworzymy bufor, więc bitmapa ma być rozmiaru okna-można śmiało wykorzystać nasze makra. Ładowanie bitmap jest równie proste-wykorzystamy do tego funkcję BITMAP *load_bitmap(const char *filename, RGB *pal) która jako argumenty pobiera kolejno ścieżkę do pliku oraz dane o palecie. My nie korzystamy z palet, więc podajemy tam NULL. Ok, mamy bitmapki, jesteśmy gotowi maznąć coś na ekranie. Zróbmy to więc. : ) Oto funkcja draw(): void draw() clear_to_color(bufor,makecol(0,0,255)); draw_sprite(bufor,ryjek,x,y); blit(bufor,screen,0,0,0,0,width,height); Na początku czyścimy bufor za pomocą funkcji void clear_to_color(bitmap *bitmap, int color). Jako pierwszy argument podajemy bitmapę, którą chcemy wyczyścic-czyli nasz bufor. Jako drugi zaś kolor, na który chcemy ją wyczyścić. Można się tu posłużyć allegrowską funkcją makecol, która jako argumenty pobiera składowe RGB, co właśnie zrobiłem uzyskując niebieski bufor. Następnie wyświetlamy naszą bitmapkę na czyściutkim buforze za pomocą funkcji void draw_sprite(bitmap *bmp, BITMAP *sprite, int x, int y); Jako pierwszy argument podajemy bitmapę docelową-nasz bufor. Jako drugi bitmapę, którą chcemy wyświetlić-naszą bitmapkę ryjek. Jako trzeci i czwarty podajemy współrzędne, na których chcemy ją wyświetlić-u mnie jest to (100,100). Funkcja ta rysując bitmapkę automatycznie odrzuca kolor (255,0,255), czyli różowy. Dzięki temu można uzyskać obrazki o kształcie innym niż prostokąt. Teraz jednym wprawnym ruchem przerzucamy nasz bufor na ekran wywołując funkcję void blit(bitmap *source, BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height); Służy ona do wyświetlania prostokąta wyciętego z jednej bitmapy na drugą. Jako pierwszy argument podajemy bitmapę źródłową, jako drugi-docelową. Jako następne dwa podajemy współrzędne lewego górnego rogu kopiowanego prostokąta, później współrzędne na

bitmapie docelowej na które chcemy wrzucić nasz wycinek, a na końcu szerokość i wysokość naszego prostokąta. Ta funkcja już nie odrzuca różowego koloru. Teraz zrobimy funkcję logic(), czyli jakby serce programu. :) void logic() if(key[key_esc]) wyjscie=true; W tym przypadku serce jest raczej wątłe i słabe, ale silniejszego nie potrzebujemy. ;) W tym miejscu właśnie korzystamy z klawiatury. Otóż allegro posiada tablicę typu bool o nazwie key. Zawiera ona informacje o wciśniętych klawiszach. Kody klawiszy można znaleźć w dokumentacji: http://www.allegro.cc/manual/api/keyboard-routines/key. W naszym programie sprawdzamy, czy został naciśnięty klawisz escape. Jeśli tak, to ustawiamy flagę wyjscie na true. Została nam ostatnia funkcja przed mainem: funkcja release(), w której posprzątamy po programie. void release() destroy_bitmap(ryjek); destroy_bitmap(bufor); allegro_exit(); Dwukrotnie wykorzystujemy tu funkcję void destroy_bitmap(bitmap *bitmap). Jako argument pobiera ona obiekt bitmapy usuwając go z pamięci. Usuwamy obie nasze bitmapki a następnie wyłączamy allegro wywołując funkcję void allegro_exit(). Ok, teraz musimy stworzyć funkcję main(): int main() init(); load(); while(!wyjscie) draw(); while(ticks>0) logic(); ticks--; release(); return 0; END_OF_MAIN(); A teraz pokrótce ją wyjaśnię. Na początku tworzymy okienko, inicjujemy allegro i tworzymy timer wywołując funkcję init(), tworzymy bufor oraz ładujemy obrazek w funkcji load(). W tym momencie wchodzimy w pętlę główną: w każdym obiegu pętli rysujemy to, co mamy do narysowania, oraz co 30 milisekund wywołujemy funkcję logic(). Dlaczego co 30 milisekund? Przypomnijmy sobie nasz timer oraz jego funkcję: (...)

Otóż nasz timer co 30 milisekund zwiększa ticks o 1. Wtedy w pętli głównej wykona się funkcja logic, a ticks zostanie zredukowane do zera. : ) Jeśli wyjscie==true(został wciśnięty klawisz escape) to wychodzimy z pętli, sprzątamy po programie wywołując funkcję release() i wyłączamy program. Tak powinna wyglądać pętla każdej gry w allegro wykorzystującej timery. Zamiast timerów można użyć czegoś dokładniejszego, czyli pętli czasu rzeczywistego. Ale nie sądzę, aby była potrzeba opisywania tego przeze mnie-xion opisał to bardzo dobrze na swoim blogu(google: real time loop). Muszę jednak wspomnieć, że jeśli chcemy korzystać z Winapi w allegro trzeba dołączyć nagłówek winalleg.h PO allegro.h. Należy także pamiętać o umieszczeniu allegrowskiego makra END_OF_MAIN() po funkcji main(). To już wszystko w dzisiejszej lekcji, na koniec dam screena oraz cały kod programu. Jako zadanie dla treningu proponuję spróbować wprawić nasz obrazek w ruch za pomocą strzałek. Trzeba to zrobić zmieniając odpowiednio zmienne x i y w funkcji logic(), najlepiej za pomocą strzałek. :) #include <allegro.h> #pragma comment(lib,"alleg.lib") #define WIDTH 800 #define HEIGHT 600 BITMAP *bufor; BITMAP *ryjek; int ticks=0;

bool wyjscie=false; float x=100,y=100; void init() allegro_init(); install_keyboard(); set_color_depth(32); set_gfx_mode(gfx_autodetect_windowed, WIDTH, HEIGHT, 0, 0); void load() bufor=create_bitmap(width,height); ryjek=load_bitmap("ryjek.bmp",null); void draw() clear_to_color(bufor,makecol(0,0,255)); draw_sprite(bufor,ryjek,x,y); blit(bufor,screen,0,0,0,0,width,height); void logic() if(key[key_esc]) wyjscie=true; void release() destroy_bitmap(ryjek); destroy_bitmap(bufor); allegro_exit(); int main() init(); load(); while(!wyjscie) draw(); while(ticks>0) logic(); ticks--; release(); return 0; END_OF_MAIN();