Allegro - Knihovna pro programování her II. - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



C/C++

Allegro - Knihovna pro programování her II.

13. prosince 2001, 00.00 | Ve druhé dílu našeho seriálu si povíme více o výstupu textu na obrazovku a o grafických módech.
Nejprve začneme grafickými módy, podíváme se jak nastavit barevnou hloubku a na závěr článku si ukážeme jednoduchý výpis na obrazovku.

Ve druhé dílu si povíme více o výstupu textu na obrazovku a o grafických módech. Jako první byl začal grafickými módy z toho důvodu, že když chcete cokoliv kreslit na obrazovku musíte si patřičný mód zapnout.

Grafické módy a virtuální obrazovka


Pro zapínání slouží funkce:

int set_gfx_mode(int card, int w, int h, int v_w, int v_h);

se kterou jsme se seznámili již minule. Jak jsme se domluvili první parametr bude GFX_AUTODETECT a nebudeme ho pro naše příklady prozatím měnit.

Parametry w a h nastavují velikost obrazovky v pixelech. Nejpoužívanější hodnoty jsou 640*480, 800*600, 1024*768, 1280*1024, 1600*1200.

Pro zjištění velikosti nastavení velikosti obrazovky slouží makra (psáno česky) SCREEN_W a SCREEN_H definované v hlavičkovém souboru allegro.h.

Posledně jsem se zmínil o tom, že se o poslední dva parametry nemusíme zajímat, ale teď si povíme k čemu slouží. Předpona "v" znamená virtual. Např. příkaz:

set_gfx_mode(GFX_AUTODETECT, 640, 480, 1024, 768);

znamená, že se vytvoří v paměti virtuální obrazovka 1024*768 pixelů, ale mód bude stále jen 640*480 pixelů. Zároveň zavádí makra VIRTUAL_W a VIRTUAL_H. Viz obrázek.

Virtuální obrazovka slouží k rolování obrazovky. Jako výchozí souřadnice (to je vidět z obrázku) jsou hodnoty (0,0), pokud je chcete změnit slouží k tomu funkce:

int scroll_screen(int x, int y);

která bere jako parametry souřadnice levého horního rohu. To zdaleka nebylo všechno k čemu slouží virtuální obrazovka, ale jen úvod do tématu a tím bych to zakončil, protože to není náplní dnešního článku, ale pokud o to máte zájem stačí říct (abych vylíčil většinu toho co nabízí virtuální obrazovka pokrylo by to velikost třech takovýchto článků). Pokud ale nutně potřebujete více informací stačí se podívat do nápovědy Allegra.

Barevná hloubka a palety


Jako standardní je 8 bitů na pixel. Pokud chcete větší barevnou hloubku musíte zavolat funkci:

void set_color_depth(int depth);

před set_gfx_mode, která bere jako parametr počet bitů na pixel jako je 8, 15, 16, 24, 32. Toto jsou přípustné hodnoty. Standardní hodnota je 8 a to je taky jediná možnost kdy si můžeme měnit paletu jak chceme. Například můžeme paletu načíst z bitmapy nebo použít standardní paletu jako globální proměnnou tzv. desktop_palette, kterou jsme použili už minule. Pro nastavení palety slouží funkce:

void set_palette(PALETTE p);

a pro získání její opak a to:

void get_palette(PALETTE p);

která naplní proměnnou p typu PALETTE aktuálními hodnotami všech 256 barev.

Ostatní módy nemají paletu a barvy tzv. míchají. To znamená, že když použijete například mód 16 bitů, což je 65536 barev a vy zadáte takovou barvu, která není přesně totožná s Vámi zvolenou, tak Vám to namíchá skoro stejnou barvu, která se mezi nimi vyskytuje. Jedna z funkcí na míchání je:

int makecol(int r, int g, int b);

kterou jsme si popsali minule. Existují její napodobeni, které se váží přímo na mód, ale pokud použijete tuto univerzální nic nezkazíte.

Jako první program jsem v minulém díle použil schválně standardní nastavení 8 bpp (bits per pixel - odvozeno z anglické zkratky), ale většinou budu používat 16 bpp a to z toho důvodu, že 24 nebo 32 má moc velké paměťové nároky a 65536 barev je bohatě dostačujících.

Píšeme si na obrazovku


Na text Allegro nemá tolik funkcí jako pro práci s paletami nebo barvami, ale pro jednoduché prográmky nebo gamesky je jich akorát. Lépe řečeno co potřebujete napsat napíšete.

Ve všech funkcích budeme prozatím používat standardní písmo a to jako parametr písma uvedeme globální proměnnou typu FONT a to font jako v minulém díle.

O vytváření písma si budeme povídat až budeme probírat datové soubory, protože to není nic jednoduchého, ale ani těžkého. Spíše to zabere pár řádků a já Vás teď nechci strašit a zatěžovat.

Funkce, které pracují s textem a obrazovkou jsem uvedl do jednoho příkladu kde si můžete prohlédnout jejich funkci.
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include "allegro.h" // hlav. soubor. allegra

int main(void)
{
  int result, i=80;
  int vyska,sirka;
  int j,k;

  if ( (result = allegro_init() ) != 0 ) // inicializuje allegro
  {
    printf("Nejde Allegro! - %s\n\nZmackni cokoliv.",allegro_error);
    getch();
    return 0;
  }
  
// nahodi mod 640 * 480 * 8
  if ( (result = set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0) ) < 0)
  { 
    set_gfx_mode(GFX_TEXT, 80, 25, 0, 0);
    printf("Nejde grafika! - %s\n\nZmackni cokoliv.",allegro_error);
    getch();
    allegro_exit();
    return 0;
  }

  // pro 8b. barevnou hloubku nastavi standartni paletu
  set_palette(desktop_palette);

  // nastavi barvu pozadi textu
  text_mode(0);

  // standardni vystup
  textout(screen, font, "Ahoj SVETE!", 250, 150, makecol(255, 0, 0) );

  // pozice X a Y ukazuji na stred retezce
  textout_centre(screen, font, "Ahoj SVETE!", 250, 170, makecol(255, 0, 0) );

  // roztazeny vystup
  textout_justify(screen, font, "Ahoj SVETE! Jak se mas?", 10, 400, 10,500, makecol(255, 0, 0) );


  // Stejne funkce jako textout
  // akorat tyto umoznuji formatovani
  // jako printf


  textprintf(screen, font, i, 250, makecol(0,0,255), "Pozice X = %d",i);

  textprintf_centre(screen, font, 80, 270, makecol(0,0,255), "Pozice X = %d",i);

  textprintf_centre(screen, font, 80, 270, makecol(0,0,255), "Pozice X = %d",i);

  sirka = text_length(font, "Builder");
  vyska = text_height(font);

  textprintf(screen, font, 350, 80, makecol(127, 127, 127), 
             "Sirka napisu Builder: %2d v pixelech", sirka);
  textprintf(screen, font, 350, 80 + vyska, makecol(127, 127, 127), 
  
                     "Vyska napisu Builder: %2d v pixelech", vyska);

  // ceka na stisk
  getch();
  // ukonci allegro
  allegro_exit();

  return 0;
}

To by bylo k dnešnímu tématu vše.

Příště si povíme o bitmapách a začneme pracovat s obrázky jako je načítání, ukládání atd. A zkusíme si nějaký lepší příklad!

Celý tutoriál si můžete stáhnou zde a to včetně 3 zdrojáků.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » C/C++  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: