2. díl - Grafická knihovna Allegro pro C a C++

C++ Allegro Grafická knihovna Allegro pro C a 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 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

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

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

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

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


 

  Aktivity (1)

Článek pro vás napsal Maxfx
Avatar
C,C++,C#

Jak se ti líbí článek?
Celkem (3 hlasů) :
55555


 


Miniatura
Všechny články v sekci
Allegro - Programujeme hry v C++
Miniatura
Následující článek
Grafická knihovna Allegro pro C a C++

 

 

Komentáře
Zobrazit starší komentáře (5)

Avatar
Maxfx
Redaktor
Avatar
Maxfx:

Taky to chci samozřejmě udělat a vybrané zkušenosti popsat :)

Odpovědět  +1 6.2.2013 21:37
Být ovládán znamená být sledován, pod dohledem, špehován, veden, uzákoněn, reglementován, ohrazen, indoktrinován, pře...
Avatar
skopekvl
Člen
Avatar
skopekvl:

Ahoj , pomůžete mi v Allegru vykreslit od středu 100 prázdných čtverců ,každy od 3px větší ,díky za pomoc

VLS8|

 
Odpovědět 8.3.2013 9:13
Avatar
Maxfx
Redaktor
Avatar
Odpovídá na skopekvl
Maxfx:

Napiš zatím do fora

Odpovědět 8.3.2013 10:26
Být ovládán znamená být sledován, pod dohledem, špehován, veden, uzákoněn, reglementován, ohrazen, indoktrinován, pře...
Avatar
Miso
Neregistrovaný
Avatar
Odpovídá na Maxfx
Miso:

Ahoj, chcel by som sa opýtať, kde na disku musím mať uložený obrázok, ktorý vkladám?

 
Odpovědět 8.5.2013 13:54
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Miso
Zdeněk Pavlátka:

Když chceš načítat obrázek musíš ho mít ve složce s programem(hrou), nebo zadat celou cestu k souboru (C:\Users...).

Odpovědět  +1 8.5.2013 15:35
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Miso
Neregistrovaný
Avatar
Odpovídá na Zdeněk Pavlátka
Miso:

Ďakujem veľmi pekne :)

 
Odpovědět 8.5.2013 16:20
Avatar
5468
Člen
Avatar
5468:

Děkuji moc, za tuto názornou ukázku knihovny alegro. Netušil se že taková v C++ vůbec existuje. Pokud váš turtoriál pochopím až dokonce, bude to moje 2 knihovna.

Jsem začátečník, programuji teprve rok.8-)

 
Odpovědět  +1 26.7.2014 14:12
Avatar
5468
Člen
Avatar
5468:

Nějak mi blbnou smailíci.

 
Odpovědět 26.7.2014 14:13
Avatar
Maxfx
Redaktor
Avatar
Odpovídá na 5468
Maxfx:

Tohle je stará verze allegra zkus allegro 5

Odpovědět 27.7.2014 22:00
Být ovládán znamená být sledován, pod dohledem, špehován, veden, uzákoněn, reglementován, ohrazen, indoktrinován, pře...
Avatar
5468
Člen
Avatar
5468:

Děkuji za radu. Vyskouším alegro 5.

 
Odpovědět 11.8.2014 12:13
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 15. Zobrazit vše