článek

Udělej si vlastní hru – V. část

Udělej si vlastní hru – V. část

Je neděle a tedy opět čas na náš pravidelný seriál. V tomto pokračování nás čeká problematika typicky bombermanovská - samotné bomby a jejich exploze. Téma je to docela rozsáhlé, pojďme se tedy na něj podívat...

Než si ale povíme cokoliv dalšího, dovolte malé upozornění. Vzhledem ke skutečnému rozsahu dnešního dílu jsme se rozhodli, že ho rozdělíme na dvě části. Dnes si rozebereme základ, který přístí týden patřičně doplníme. Pojďme tedy rovnou na věc.



Reprezentace bomb



U bomby nás samozřejmě bude zajímat několim parametrů. K její reprezentaci v paměti se tedy nabízí datová struktura, nazvaná třeba velmi tvořivě BOMB:




struct BOMB //struktura bomby

{

    int x,y; //pozice

    int count; //pocet bomb (zatim nevyuzijeme)

    bool planted; //je polozena?

    int anim_state; //stav animace

    int flame_len; //dosah plamene

    int explosion_st; //stav exploze

    unsigned t_planted, blow_up_time; //cas polozeni a cas od polozeni do vybuchu

};




Co znamená která proměnná? Integery x a y udávájí dle očekávání pozici bomby na herní mapě (pokud je bomba položena), proměnná count udává počet bomb, které má hráč k dispozici (pokud bychom ho chtěli nějak omezit), logický výraz planted nám říká, zda je bomba položena (tedy zda se o ni máme vůbec starat), stará známá proměnná anim_state udává animační stav bomby (bomba bude animovaná - hoření doutnáku, napínání bomby...), číslo flame_len udává dosah výbuchu bomby vyjádřený počtem čtverečků mapy, explosion_st nám udává stav expolze bomby (je-li nula, pak bomby ještě nevybuchla) a časovcí proměnné t_planted a blow_up_time slouží k řízení exploze - t_planted udává čas, kdy byla bomba položena a blow_up_time obsahuje informaci o tom, jak dlouhý je časový interval od položení do výbuch bomby (obě v milisekundách).




Bombu budeme vykreslovat jako sprite stejným způsobem, jakým jsme vykreslovali Maria či nepřátele, nemá tedy cenu se o tom blíže zmiňovat (deklarace a načtení textury, vykreslení příslušné části textury jako sprite, odstranění textury...). Stejně tak budeme jako sprite vykreslovat i plamen výbuch, když bomba exploduje (plamen bude též animovaný).



Typy bomb



Pro pozdější zpestření hry budeme předpokládat, že v budoucnu budeme chtít do hry vložit různé typy bomb (lišící se např. délkou plamene, časem so výbuchu apod.). Bychom toto měli co nejjednodušší, budeme si bomby podle jejich typu uchovávat v poli nazvaném bombs (datového typu BOMB :-)), přičemž počet typů bomb bude dán konstantou BOMB_TYPES, v našem přípdě bude rovna jedné (máme jen jeden typ bomby, nazvěmě ho zálkladním). Pole bombs má tedy tolik prvků, kolik je ve hře k dispozici druhů bomb.








Deklarace bomb:



BOMB bombs[BOMB_TYPES]; //bomby



Abychom v případě, že hráč bude mít k dispozici více typů bomb věděli, který typ zrovná používá, zavedeme si celočíselnou proměnnou active_bomb, udávající číslo aktivní bomby (tedy přesněji její index v poli bombs) - v našem případě bude stále rovna nule.



Položení bomby



Bombu bude možné položit stisknutím mezerníku. Pro jednoduchodt předpokládejme, že od každého typu bomby může být v daném okamžiku položen jen jeden exemplář - dokud tedy položená bomba nevybuchne, není možno položit další bombu stejného typu. Rozšíříme funkci WinProc, reagující (mimo jiné) na stisknuté klávesy o následující kód:




case VK_SPACE: //polozeni bomby

{

    if(bombs[active_bomb].count>0 && !bombs[active_bomb].planted)

    {

        --bombs[active_bomb].count;

        bombs[active_bomb].planted = true;

        bombs[active_bomb].x=InSquare(Mario.x+16);

        bombs[active_bomb].y=InSquare(Mario.y+16);

        bombs[active_bomb].t_planted=GetTickCount();

    }

    return 0;

}



Myslím, že kód je vcelku snadno pochopitelný, nepotřebuje snad více komentáře - snad jen, že bomba se objeví na čtverečku na kterém se právě nachází Mario, je třeba též ověřit, zda ještě máme nějaké bomby k dispozici (count > 0).






Řešení explozí








Poté, co je bomba položena, je potřeba zajistit, aby ve správný čas vybouchla, v případě, že již nastal výbuch, tak se postarat o jeho animaci. Toto vše se děje ve funkci SolveExplosions, kterou voláme před vykreslením každého snímku (tedy vždy před zavoláním funkce Render).




void SolveExplosions(void)

{

    for(int i=0; i
    {

        if(bombs[i].planted)

        {

            if(GetTickCount() - bombs[i].t_planted >= bombs[i].blow_up_time)

            {

                if(GetTickCount() - exp_anim_time_elapsed >= EXPLOSION_TIME / 3)

                { //animace vybuchu

                    exp_anim_time_elapsed = GetTickCount();

                    ++bombs[i].explosion_st;

                }



                if(bombs[i].explosion_st > 3)

                { //konec vybuchu

                    bombs[i].planted = false;

                    bombs[i].explosion_st=0;

                    bombs[i].t_planted=0;

                }

            }

        }

    }

}



Práce výše uvedené funkce je následující: Procházíme sekvenčně pole bomb (v našem případě má však toto pole jen jeden prvek) a pokud je daná bomba položena (planted je true), pak se postaráme o vyřešení její exploze. Nejprve zjistíme, zda již má k explozi vůbec dojít.



Exploze bomby nastane, jakmile uplyne od jejího položení (čas uložený v t_planted) doba, kterou udává proměnná blow_up time. Pokud je uplynulá doba kratší, exploze nenastane a funkce SolveExplosions již s touto bombou (až do příštího zavolání) nijak nepracuje. Pokud již expolze nastala, postaráme se o animaci výbuchu tím, že postupně měníme (zvyšujeme) hodnoty proměnné explosion_st (stav výbuchu), délka trvání výbuchu (v milisekundách) je určena konstantou EXPLOSION_TIME. Animace výbuchu má celkem tři pozice (viz texturu), proto zvýšení proměnné explosion_st provádíme vždy po uplynutí (alespoň) doby EXPLOSION_TIME / 3 - tedy po třetinách. Z hodnoty explosion_st tedy plyne následující:





  • 0 - bomba ještě nevybuchla

  • 1 - exploze, uplynula 1/3 doby výbuchu

  • 2 - exploze, uplynuly 2/3 doby výbuchu

  • 3 - exploze, uplynula celá doba výbuchu

  • 4 - konec exploze, odstranění bomby z mapy






Výbuch je znázorněn rotujícími plamínky, proto jsou v jednotlivých částech obrázku určeného pro sprite ohně nakresleny tyto plamínky pootočené, neboť ve výsledné animaci řízezené hodnotou explosion_st vznikne právě dojem jejich rotace.



Šíření výbuchu a jeho kolize s ostatními objekty



Čeká nás další důležitý prvek "bombové problematiky" a jelikož i ten bude docela zamotaný, rozhodl jsem se bombami zabývat i v dalším díle, abychom vše mohli rozebrat dostatečně podrobně. Pro dnešek si tedy již jen definujeme chování výbuchu:



Výbuch (znázorněn plamínky) se bude šířit z místa exploze bomby ve čtyřech směrech - nahoru, dolu, doleva a doprava, přičemž v každém z těchto směrů dosáhne nanejvýš takové vzdálenosti od místa výbuchu, jaká je udána v proměnné falme_len (v počtech čtverečků). V případě, že ve svém postupu narazí na cihlový čtvereček, pak jej zničí (čtvereček se stane průchodným) a výbuch postupuje dále (pokud jeho délka ještě nedosáhla hodnoty flame_len).



V případě, že výbuch narazí na čtvereček ocelový, pak se ve svém postupu v daném směru zastaví. Pokud výbuch narazí na nepřítele (houbičku), pak je tento nepřítel zabit (jeho in_game bude nastaveno na false, příp. se může hráčovi přičíst nějaké skore apod.) a konečně pokud výbuch narazí na postavu Maria, pak Mario ztrácí život stejně, jakoby se srazil s nepřítelem.



Toto myslím, že pro dnešek stačí, příště se podíváme na zjišťování kolizí šířícího se výbuchu s herními objekty a následné reakce na tyto kolize. Příště též doplním (jen v rychlosti) kód uvnitř funkce Render sloužící k vyreslování bomb a jejich výbuchů.



Doplňující informace + domácí úkoly



Kód přiložený k této lekci obsahuje již kompletní "bombovou problematiku" - tedy i to, o čem jsem se ještě v tomto díle nezmínil. Je to z důvodu, aby byla funkce programu smysluplná a aby bylo možno lépe testovat nastavení bomb. K příštímu dílu tedy logicky kód přiložený nebude, neboť je doprobereme to, co jsme dnes započali. Za domácí úkol si projděte části kódu, které se bombami zabývají (můžete se podívat i na to, o čem jsme dnes ještě nemluvili) a opět si klasicky vyzkoušejte, jak se jeho různé změny projeví...



Budu se těšit příště...



Zdrojové kódy: 319_pata_cast.zip



Související odkazy:








jan_kohout

autor
/ jan_kohout

Publikováno: 10.06.2007


další články této kategorie





diskuze

odeslat

Nejsi automat? Napiš výsledek 1 + 2 =

phanka

phanka | 21.04.15 v 21:30

bomber je super hra

Vitovsky | 04.02.09 v 17:21

Tak zkus Game Maker

kb.-n | 23.02.08 v 17:04

hků

Pizzazz | 24.06.07 v 19:20

Je to super článek:) Taky jsem si chtěla někdy vytvořit nějakou hru, snad se mi to někdy povede.