<< home >>
Nesúvislé fragmenty z objavovania OS Linux
<<- ->>


  • Allegro

Allegro

Ako sa hovorí, do tretice všetko dobré. Allegro je knižnica jazyka C, ktorá pôvodne vznikla z nedostatku dobrých knižníc pracujúcich s grafikou . Na túto základnú funkciu boli potom nabaľované ďalšie a ďalšie funkcie. Takže výsledná knižnica nielenže pracuje  s grafikou (2D, 3D), ale aj zvukom, klávesnicou, myšou, súbormi, ...
Z adresy http://allegro.cc/files/ môžeme stiahnuť zdrojový paklík allegro-4.0.2.tar.gz (asi 2.3 MB - verzia z marca 2003) a tiež paklík dokumentácie, napríklad v html formáte allegro-manual-4.0.2-html.tar.gz (asi 200 kB) obsahujúci o i. kompletnú referenčnú príručku funkcií knižnice.

Inštalácia knižnice Allegro

Paklíky skopírujeme niekde do domovského adresára a rozbalíme.

$ tar xfz meno_paklika.tar.gz

Vojdeme do podadresára allegro-4.0.2, configurujeme a makeujeme.

$ cd allegro-4.0.2

$ ./configure

$ make

Zmeníme identitu a inštalujeme ako root (aj manuálové stránky a dokumentáciu).

$ su -

# cd /home/.../allegro-4.0.2

# make install

# make install-man

# make install-info

Použitie knižnice Allegro

#include <allegro.h>

$ gcc -o Priklad_1 Priklad_1.cc `allegro-config -libs`

alebo

$ gcc -o Priklad_1 Priklad_1.cc -lalleg-4.0.2 -lalleg_unsharable

Inicializácia a ukončenie

Inicializácia knižnice: allegro_init();

Na ukončenie práce slúži: allegro_exit();

Inicializácia služieb ovládajúcich klávesnicu: install_keyboard();

Odstránenie služieb klávesnice: remove_keyboard();

Inicializácia služieb ovládajúcich časovač: install_timer();

Odstránenie služieb časovača: remove_timer();

Inicializácia služieb myši: install_mouse();

Odstránenie služieb myši: remove_mouse();

Ukončenie funkcie main(): END_OF_MAIN();

Ukončenie funkcie fcia: END_OF_FUNCTION(fcia);

Grafika

Nastavenie grafického módu: set_gfx_mode(GFX_XXX, SCRX, SCRY, VSRCX, VSRCY);

<konzola i X-Windows>
  • GFX_TEXT - návrat do textového módu
  • GFX_AUTODETECT - Allegro sa pokúsi vyhľadať príslušný ovládač ku grafickej karte
  • GFX_SAFE - bezpečný ovládač, pokiaľ nezáleží na rozlíšení a kvalite
<iba konzola>
  • GFX_FBCON - zariadenie podporujúce fremebuffer, je nutné mať túto funkciu už v jadre
  • GFX_VBEAF - VBE/AF ovladač
  • GFX_GGI - ako výstup je použitá knižnica GGI
  • GFX_SVGALIB - ako výstup je použitá knižnica SVGALIB
  • GFX_VGA, GFX_MODEX - priamy prístup do grafickej pamäte vo VGA alebo MODE-X
<iba X-Windows>
  • GFX_XWINDOWS - štandartný X grafický ovládač, je možné pracovať s takouto aplikáciou aj na vzdialenom stroji
  • GFX_XDGA - priamy prístup do grafickej pamäte, je rýchlejší ako cez XServer, ale nie je možné s ním pracovať na vzdialenom stroji
  • GFX_XDGA_FULLSCREEN - funguje rovnako ako XDGA, ale na celej obrazovke
  • GFX_XDGA2 - pracuje na rozšírenej verzii DGA 2.0 a podporuje grafickú akceleráciu
  • GFX_XDGA2_SOFT - pracuje ako XDGA2, ale nepoužíva hardwerovú akceleráciu
SCRX - veľkosť obrazovky po Xovej osy
SCRY - veľkosť obrazovky po Yovej osy
VSRCX a VSCRY - je veľkosť virtuálnej obrazovky (double buffering)

Špecifikácia grafickej hĺbky: set_color_depth(x);

x - rozlíšenie 8, 15, 16, 24, 32bit

Priklad_1.c

/*
 * Priklad_1.c pre
 * kniznicu Allegro
*/

#include <stdio.h>
#include <allegro.h>

PALETTE pal;
BITMAP *obr;

int Init(void);
void Run(void);
void Done(void);

int main()
{
  if (Init()) return(-1);
  Run();
  Done();
  return(0);
}
END_OF_MAIN();

/* ------------------------------------------------------------------ */
int Init(void)
{
  allegro_init();
  install_keyboard();

  if (set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0)) {
    printf("Chyba grafickeho modu!\n");
    return 1;
  }

  set_color_depth(16);

  if ((obr=load_pcx("Priklad_1.pcx", pal))==NULL) {
    set_gfx_mode(GFX_TEXT,0,0,0,0);
    printf("Chyba pri nacitani suboru smecaka (Priklad_1.pcx)!\n");
    return 2;
  }

  return 0;
}
END_OF_FUNCTION(Init);

/* ------------------------------------------------------------------ */
void Run(void)
{
  int Stop=0;
  int Score=0;
  int x=140, y=90;


  BITMAP *buff;
  set_palette(pal);
  buff=create_bitmap(320,480);

  clear(screen);
  clear(buff);

  text_mode(-1);
  textprintf(screen, font, 360, 20, 255, "Odpadky patria do smecaka");
  textprintf(screen, font, 360, 50, 127, "Pohyb smecaka: sipkami");
  textprintf(screen, font, 360, 60, 127, "Koniec upratovania: Esc");
  textprintf(screen, font, 360, 90, 255, "Score:");
  textprintf(screen, font, 420, 90, 255, "%i", Score);

  do {
    clear_keybuf();
    clear(buff);
      
    if (key[KEY_UP]   ) {if (y<5)   ; else y-=5;}
    if (key[KEY_DOWN] ) {if (y>450) ; else y+=5;}
    if (key[KEY_LEFT] ) {if (x<5)   ; else x-=5;}
    if (key[KEY_RIGHT]) {if (x>295) ; else x+=5;}
    if (key[KEY_ESC]  ) Stop=1;
   
    draw_sprite(buff, obr, x, y);
    blit(buff,screen,0,0,0,0,320,480);

  } while (!Stop);

  destroy_bitmap(buff);
}
END_OF_FUNCTION(Run);

/* ------------------------------------------------------------------ */
void Done(void)
{
  destroy_bitmap(obr);
  set_gfx_mode(GFX_TEXT,0,0,0,0);
  remove_keyboard();
  allegro_exit();
}
END_OF_FUNCTION(Done);

$ gcc -o Priklad_1 Priklad_1.cc `allegro-config -libs


Podrobnejšie viď. manuálové stránky, napr. niektoré primitívy:

void vline(BITMAP *bmp, int x, int y1, int y2, int color);
- Draws a vertical line onto the bitmap, from point (x, y1) to (x, y2).

void hline(BITMAP *bmp, int x1, int y, int x2, int color);
 - Draws a horizontal line onto the bitmap, from point (x1, y) to (x2, y).

void do_line(BITMAP *bmp, int x1, y1, x2, y2, int d, void (*proc)(BITMAP *bmp, int x, int y, int d));
- Calculates all the points along a line from point (x1, y1) to (x2, y2), calling the supplied function for each one. This will be passed a copy of the bmp parameter, the x and y position, and a copy of the d parameter, so it is suitable for use with putpixel().

void line(BITMAP *bmp, int x1, int y1, int x2, int y2, int color);
- Draws a line onto the bitmap, from point (x1, y1) to (x2, y2).

void triangle(BITMAP *bmp, int x1, y1, x2, y2, x3, y3, int color);
- Draws a filled triangle between the three points.

void polygon(BITMAP *bmp, int vertices, const int *points, int color);
- Draws a filled polygon with an arbitrary number of corners. Pass the number of vertices and an array containing a series of x, y points (a total of vertices*2 values).

void rect(BITMAP *bmp, int x1, int y1, int x2, int y2, int color);
- Draws an outline rectangle with the two points as its opposite corners.

<<- ->>