Allegro - Animace (15. díl) - 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:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kde se koná výstava fotografií Luďka Vojtěchovského?

V dnešní soutěži hrajeme o:



C/C++

Allegro - Animace (15. díl)

allegro

14. listopadu 2002, 00.00 | V Allegru jsme se naučili přehrávat zvuky, načítat obrázky, ovládat časovač atd., ale nic jsme si neřekli o animacích. A právě o tom je dnešní článek.

Animace

V dnešním díle si budeme povídat o animacích. Což je takové malé zpestření pro naše prográmky nebo hry. Dneska skoro každá hra (99 procent) má na začátku animaci. To znamená, že než se nám pustí samotná hra, musíme shlédnout animaci, kterou někdo připravil. V minulém díle, pokud si vzpomínáte, byla taky animace u hry Kostky, která byla dělaná jen pomocí funkce blit a jejích odrůd (respektive stříhání bitmap a lepení na jiné souřadnice). Nebylo to tedy nic nového, ale abychom v našem seriálu postoupili dále podíváme se co nám nabízí Allegro pro naše animace.

Troška teorie

Allegro jako samotné umí přehrávat pouze FLI a FLC "animované" soubory. Sice je tento formát trošičku starší, ale to nebrání tomu ho stále používat. Pokud naprogramujete velkolepou hru, nikdo se Vám nebude smát, že jsme nepoužili do programu formát AVI. Dyť taky proč ne?

Allegro nám tedy nabízí pro tuto práci několik funkcí, ale my se budeme zabývat pouze jednou a to play_fli. Probereme si ji trošičku do detailů, abychom s ní mohli dělat "psí kusy". Její prototyp vypadá následovně:

int play_fli(const char *filename, BITMAP *bmp, int loop, int (*callback)());

Než si probereme jednotlivé parametry, tak si nejdříve řekneme co funkce vrací. Pokud vše proběhne v pořádku vrací FLI_OK a pokud nastane nějaká chyba vrací FLI_ERROR. Nám bude stačit to, že pokud funkce vrací něco jiného než FLI_OK tak nahlásíme chybu.

A teď k parametrům. První si myslím, že je všem jasný. Jedná se o jméno příslušného FLI/FLC souboru. Druhý parametr je cílová BITMAPa. Pokud budeme rovnou vykreslovat na obrazovku, stačí když zadáme jako parametr screen a více se tím nemusíme zabývat. Třetí parametr je kolikrát se má animace přehrát. Pokud zadáme nulu, animace se přehraje a skončí. A program bude dále pokračovat v běhu. Pokud zadáme něco jiného, bude se animace přehrávat stále dokola. Tedy do nekonečna. K poslední parametru se podíváme na konci článku.

Nyní se podíváme na jednoduchý příklad:

#include "allegro.h" // netreba predstavovat

int main()
{
    allegro_init();
    install_keyboard();

    set_color_depth(32);
    if (set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0) != 0) {
        set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
        allegro_message("Nejde grafika: \n%s\n", allegro_error);
        return 1;
    }

	// jak jednoduche, ze?
	if ((play_fli("FLIPPER.FLI", screen, 0, NULL)) != FLI_OK) {
	    set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
	    allegro_message("Chyba animace!");
	}
	
	return 0;
}
END_OF_MAIN();

Poté co, jako vždy, spustíme grafický mód a zkontrolujeme jestli vše proběhlo v pořádku, se můžeme vrhnout na samotné tělo programu.
Jedna podmínka a jedna funkce, překvapivé, že? Podmínka pouze kontroluje zda proběhlo všechno v pořádku či nikoliv. V našem případě to nevadí kdyby tam nebyla, ale ve větším programu, který by se třeba kousl, by to nebylo to pravý ořechový. Funkce play_fli, má první parametr tedy jméno souboru, druhý screen, protože rovnou vykreslujeme. Třetí je nula, protože chceme animaci pustit pouze jednou a poslední parametr je NULL, protože nás callback funkce zatím nezajímá.

Co je to callback funkce?


To je spíše jako parametr pointer na funkci typu int a bez parametrů. Zavolá se po každém jednotlivém snímku naší animace. Nejlepší bude si vše opět dovysvětlit na složitějším příkladě.

Tady je druhá verze vylepšená o použití callback funkce:

#include "allegro.h" // netreba predstavovat

int x=500, y=5;

int xxx(void)
{
	textout(screen, font, "BUILDER.CZ", 0+x,400, makecol(0,0,0));
	
	x += y;
	if (x>560) {
		x=560;
		y=-y;
	}
	if (x<0) {
		x=0;
		y=-y;
	}
	
	textout(screen, font, "BUILDER.CZ", 0+x,400, makecol(255,0,0));
	
	if (keypressed())
		return FLI_ERROR;
	return FLI_OK;
}

int main()
{
	allegro_init();
    install_keyboard();

    set_color_depth(32);
    if (set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0) != 0) {
		set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
        allegro_message("Nejde grafika: \n%s\n", allegro_error);
        return 1;
    }

	play_fli("FLIPPER.FLI", screen, 1, xxx);

	return 0;
}
END_OF_MAIN();

Podívejme se nejprve na funkci play_fli, která má jako třetí parametr nenulové číslo, tudíž se bude přehrávat animace pořád dokola. Ale nebojte se půjde to ukončit. Čtvrtý parametr je předání ukazatele na funkci xxx (omlouvám se za název), která se zavolá při každém snímku animace.

Funkce provádí to, že dole na obrazovce vykresluje text a posouvá ho doleva a doprava. K tomu používáme globální proměnné x a y. To není, ale ještě tolik zajímavé. Je sice pravda, že díky tomu můžete jakoby na pozadí programu dělat ještě něco jiného, ale podívejme se na poslední podmínku.

Pokud funkce vrací FLI_OK znamená to, že animace bude pokračovat dále v běhu. Pokud nastane případ (třeba se stiskne klávesa jako v našem případě) a my vrátíme FLI_ERROR nebo něco jiného než-li FLI_OK, znamená to, že se animace ukončí. Podmínku pro funkci play_fli jsem schválně vynechal, jelikož za ní, už je konec programu.

To je pro dnešní díl vše. Zdrojové kódy příkladů si můžete stáhnout zde.

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: