NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.

Lekce 2 - Grafická knihovna Allegro pro C a C++

V předchozí lekci, Grafická knihovna Allegro pro C a C++, jsme si uvedli open source, cross-platformní knihovnu Allegro, která je zaměřena především na hry a multimediální programování v C++.

První funkci pro naší hru, kterou potřebujeme vědět, je allegro_init(). Ta má následující syntaxi: int allegro_init () Tato funkce je nutná, protože inicializuje Allegro knihovnu. Nebudeme-li volat tuto funkci, bude program pravděpodobně padat (v nejhorším případě) nebo prostě nebude fungovat (v nejlepším případě). Další důležitá proměnná je tzv. allegro_id (string), ale je deklarována takto: extern char allegro_id []; Můžete použít allegro_id k zobrazení čísla verze pro knihovny Allegro, kterou máte právě instalovanou. To je dobrý způsob, jak zkontrolovat, zda Allegro je správně nainstalováno, takže bych měl napsat nějaký kód pro zobrazení allegro_id :

#include <conio.h>  // pro getch()
#include <stdlib.h>
#include “allegro.h”
int main()
{
allegro_init();
printf(“Allegro version = %s\n”, allegro_id);
printf(“\nPress any key...\n”);
getch();
return 0;
}
END_OF_MAIN();

Po zkontrolování knihovny můžeme začít dělat nastavovat naší hru. První co uděláme je nastavení grafické karty , klávesnice , zvukové karty atd.

#include "allegro.h"
int main(void)
{

 allegro_init();  // inicializace allegra
 install_keyboard(); // inicializace klavesnice
 set_color_depth(32); // nastaveni hloubky (32bit)
 int ret = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0); //nastaveni graficke  karty(Typ,vyska,sirka,....)
 if (ret != 0) {  // pokud graficka karta nenalezena zobrazi se chybova hlaska
 allegro_message(allegro_error); // error
 return 1; // pokud chyba vraci 1
 }
 while (!keypressed());
 //exit program
 allegro_exit();
 return 0;
}
END_OF_MAIN()

Nyní máte představu o tom, jak inicializovat jeden z režimů grafický karty v Allegru. Ale než se ponoříme do některých z grafických primitiv, které jsou zabudovány do Allegra, chci vám ukázat jednoduchý program, který načte rastrový obrázek (podporované formáty jsou BMP, PCX, TGA, a LBM) a vykreslí ho na obrazovku pomocí metody zvané bit-block transfer (neboli blit ve zkratce). S programem budete užitečně seznámeni a s jeho funkcemi pro inicializaci grafického systému a pro nastavení video režimu, barevné hloubky, atd....

#include "allegro.h"
int main(void)
{
 char *filename = "alex.bmp"; //Jmeno obrazku ( nebo vašeho )
 BITMAP *image;  //Pointer pro obrazek (kam obrazek ulozime do jake casti pameti)

 allegro_init();  // inicializace allegra
 install_keyboard(); // inicializace klavesnice
 set_color_depth(32); // nastaveni hloubky (32bit)
 int ret = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0); //nastaveni graficke karty(Typ,vyska,sirka,....)
 if (ret != 0) {  // pokud graficka karta nenalezena zobrazi se chybova hlaska
  allegro_message(allegro_error); // error
  return 1; // pokud chyba vraci 1
 }
  image = load_bitmap(filename, NULL);//nascteme obrazek
 if (!image) {    // pokud obrazek nenalezen zobrazi se chybova hlaska
  allegro_message("Error loading %s", filename); // error a jmeno chyby
  return 1; // pokud chyba vraci 1
 }
 //vykreslime na obrazovku
 blit(image, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
 //odebereme bitmapu z pameti
 destroy_bitmap(image);
 //vykreslime na obrazovku udaje o rozliseni
 textprintf_ex(screen,font,0,0,1,-1,"%dx%d",SCREEN_W,SCREEN_H);
 //ceka dokud se nezmackne libovolna klavesa , jinak by program spadl
 while (!keypressed());
 //exit program
 allegro_exit();
 return 0;
}
END_OF_MAIN()

Allegro - Allegro - Programujeme hry v C++ Ted si ukážeme, jak vykreslovat v naší hře primitivní grafiku. Bude se nám to hodit např při kolizích apod.

Nejjednodušší je samozřejmě primitivní grafika pixel-drawing. Jdeme na to, kód je zde:

#include <stdlib.h>
#include "allegro.h"

#define POCETPIX 1000

int main(void)
{
     int x,y;

    int red, green, blue, color;

    //initialize Allegro
    allegro_init();

    //inicializujeme klavesnici
    install_keyboard();

    //inicializujeme generátor náhodných čísel
    srand(time(NULL));
    //inicializujeme grafický mod na 640x480
    //Můžeme na kolik chceme na rozlišení
    //Můžeme nastavit i hloubku 32,24,atd....
    // GFX_AUTODETECT_WINDOWED - zobrazí se okno
    // GFX_AUTODETECT_FULLSCREEN - zobrazí se ve fullscreenu
    int ret = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
    if (ret != 0) {
        //Kontorla inicializace modu
        allegro_message(allegro_error);
        return 1;
    }

    //Zobrazí na obrazovce rozlišení obrazovky
    //V našem případě je to 640 x 480
    textprintf_ex(screen, font, 0, 0, 15, -1,
        "Kreslíme pixely - %dx%d - Press ESC to quit",
        SCREEN_W, SCREEN_H);
    //čeká na stisk klávesy
    while(!key[KEY_ESC])
    {

        // na stavujeme náhoně místo zobrazení pixelu od 0 do 1000
        x = 10 + rand() % 1000;
        y = 10 + rand() % 1000;

        // Nastavujeme náhodnou barvu od 0 do 255
        red = rand() % 255;
        green = rand() % 255;
        blue = rand() % 255;

        color = makecol(red,green,blue);

        //Kreslíme pixely
        putpixel(screen, x % (SCREEN_W-20), y %(SCREEN_H-20) , color);
    }

    return 0;
}
END_OF_MAIN()

Výsledek je zde :

Allegro - Allegro - Programujeme hry v C++

Teď si ukážeme jak kreslit kružnice:

#include<conio.h>
#include <stdlib.h>
#include "allegro.h"
int main(void)
{
 int x,y,radius;
 int red, green, blue, color;
 //inicializujeme  Allegro
 allegro_init();
 //klávesnice
 install_keyboard();

 //generování náhodních čísel
 srand(time(NULL));

 //nastavení rozlišení a modu 640x480
 int ret = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);

  if (ret != 0) {
  allegro_message(allegro_error);
  return 1;
 }
 //vykreslení modu na obrazovku
 //samozdřejmě by jste měli znát taky trochu Céčko aby jste věděli formátování které se zde    používá
 textprintf_ex(screen, font, 0, 0, 15, -1,
  "Kreslíme kruznice - %dx%d - Press ESC to quit",
  SCREEN_W, SCREEN_H);
 //čeká na stisk
 while(!key[KEY_ESC])
 {
  //nastavujeme a umístujeme náhodně kružnice
  x = 30 + rand() % (SCREEN_W-60);
  y = 30 + rand() % (SCREEN_H-60);
  radius = rand() % 30;

  //náhodné nastavení barev 0 do 255
  red = rand() % 255;
  green = rand() % 255;
  blue = rand() % 255;

  color = makecol(red,green,blue);
  //draw the pixel
  circle(screen, x, y,radius, color);
 }
 return 0;
}
//zde musí být tato direktiva
END_OF_MAIN()
Allegro - Allegro - Programujeme hry v C++

Zde si nakreslíme horizontální linky :

#include<conio.h>
#include <stdlib.h>
#include "allegro.h"
int main(void)
{
int y,x1,x2;
int red,green,blue,color;

allegro_init();

install_keyboard();

srand(time(NULL));

int ret = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
if (ret != 0) {
allegro_message(allegro_error);
return 1;
}

textprintf(screen, font, 0, 0, 15,"Kreslime linky - %dx%d - Press ESC to quit",SCREEN_W, SCREEN_H);

while(!key[KEY_ESC])
{

x1 = 10 + rand() % (SCREEN_W-20);
y = 10 + rand() % (SCREEN_H-20);
x2 = 10 + rand() % (SCREEN_W-20);

red = rand() % 255;
green = rand() % 255;
blue = rand() % 255;

color = makecol(red,green,blue);
//kreslíme  horizontální  linky
hline(screen, x1,y,x2,color);

 }
 return 0;
}
END_OF_MAIN()
Allegro - Allegro - Programujeme hry v C++

Samozřejmě, když budete chtít vertikální čáry stačí dát místo hline() dát vline() :)

Možná se ptáte, co znamená textprintf(). Tato funkce vypíše řetězec na námi zvolené souřadnice. Má mnoho parametrů.

  • 1. parametr říká, do kterého místa se má psát (znovu je to screen - obrazovka).
  • 2. říká, jakým fontem (typem písma) se to má vykreslit. (proměnná font oznacuje standardní systémový font).
  • 3. parametr je souřadnice y
  • 4. parametr souřadnice x
  • 5. je barva 0 do 255
  • 6. parametr je text, který se má vypsat. (Klasické "Můj text") atd...

Použili se proměnné SCREEN_W a SCREEN_H, ve kterých je šířka (width) a výška (height) obrazovky. END_OF_MAIN() - tuto direktivu některé operacní systémy (např. Windows ale v některých případech i Linux) potřebují.

Můžete si samozřejmě zpomalit vykreslování funkcí rest().

Ted si vykreslíme obdelníky:

//Tato funkce nakreslí plný obdélník
void rectfill(BITMAP *bmp, int x1, int y1, int x2, int y2, int color);

Zde je úplný kod:

#include<conio.h>
#include <stdlib.h>
#include "allegro.h"
int main(void)
{
int y1,y2,x1,x2;
int red,green,blue,color;

allegro_init();

install_keyboard();

srand(time(NULL));

int ret = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
if (ret != 0) {
allegro_message(allegro_error);
return 1;
}

textprintf(screen, font, 0, 0, 15,
"Rect Program - %dx%d - Press ESC to quit",
SCREEN_W, SCREEN_H);

while(!key[KEY_ESC])
{

x1 = 10 + rand() % (SCREEN_W-20);
y1 = 10 + rand() % (SCREEN_H-20);
x2 = 10 + rand() % (SCREEN_W-20);
y2 = 10 + rand() % (SCREEN_H-20);

red = rand() % 255;
green = rand() % 255;
blue = rand() % 255;
color = makecol(red,green,blue);

rectfill(screen,x1,y1,x2,y2,color);

// zpomalíme vykreslování :)
rest(50);
 }
 return 0;
}
END_OF_MAIN()

Kreslíme obdelníky:

Allegro - Allegro - Programujeme hry v C++

Pokud máte nějaké dotazy nebo jste našli nějakou chybu napište. Děkuji za předčtení článku.

Příště, v lekci Grafická knihovna Allegro pro C a C++, si ukážeme jak na složitější vykreslování tvarů. Použijeme k tomu například funkce sinus, cosinus, vektory a další.


 

Předchozí článek
Grafická knihovna Allegro pro C a C++
Všechny články v sekci
Allegro - Programujeme hry v C++
Přeskočit článek
(nedoporučujeme)
Grafická knihovna Allegro pro C a C++
Článek pro vás napsal Maxfx
Avatar
Uživatelské hodnocení:
4 hlasů
C,C++
Aktivity