#include <game.h>
Veřejné typy | |
typedef std::vector < std::vector< std::list < MapObject * > > > | map_array_t |
Typ dvourozměrného pole mapy, na každém políčku seznam objektů s rozměry. | |
typedef std::list< DynamicMO * > | dynamicMOs_t |
Typ seznamu dynamickych objektu. | |
typedef std::vector< StaticMO * > | staticMOs_t |
Typ seznamu statickych objektu. | |
Veřejné metody | |
Game (const GameBase &base, GameTools *gameTools, bool deathmatch=false, bool bombsatend=false) | |
Inicializace hry. | |
~Game () | |
Uvolnění naalokovaaných objektů. | |
void | play (SDL_Surface *window) |
Spuštění hry. | |
bool | success () const |
Info o ukončení hry. | |
bool | get_player (Uint16 player_num, PlayerProperties &prop) const |
Info o hráči. | |
Uint16 | winner () |
Číslo hráče, který je živý. | |
bool | field_canGoOver (Uint16 x, Uint16 y, bool check_bomb=true) |
Políčko lze přejít. | |
bool | field_canGoOver (const field_t &field, bool check_bomb=true) |
Políčko lze přejít. | |
bool | field_withObject (Uint16 x, Uint16 y, const isTypeOf &isType) |
Políčko lze přeletet. | |
bool | field_withObject (const field_t &field, const isTypeOf &isType) |
Na políčku je typ objektu. | |
MapObject * | field_getObject (Uint16 x, Uint16 y, const isTypeOf &isType) |
První objekt zadaného typu. | |
MapObject * | field_getObject (const field_t &field, const isTypeOf &isType) |
První objekt zadaného typu. | |
void | remove_object (DynamicMO *obj) |
Vyhození objektu z mapy. | |
void | insert_object (Uint16 x, Uint16 y, DynamicMO *obj) |
Vloží objekt na políčko. | |
void | insert_object (const field_t &field, DynamicMO *obj) |
Vloží objekt na políčko. | |
void | change_position (Uint16 old_x, Uint16 old_y, Uint16 new_x, Uint16 new_y, MapObject *obj) |
Pohyb z políčka na políčko. | |
void | change_position (const field_t &old_field, const field_t &new_field, MapObject *obj) |
Pohyb z políčka na políčko. | |
void | plant_bomb (Uint16 player_num, Uint16 x, Uint16 y, Bomb *bomb) |
Pro hráče: položit bombu. | |
void | plant_bomb (Uint16 player_num, const field_t &field, Bomb *bomb) |
Pro hráče: položit bombu. | |
Uint16 | count_bombs (Uint16 player_num) |
Pro hráče: spočítat položené bomby. | |
void | remove_bombs_timer (Uint16 player_num) |
Pro hráče: odstranit ruční odpalování u bomb. | |
void | explode_bomb (Uint16 player_num) |
Pro hráče: nechat bouchnout první bombu. | |
void | add_others_bonus (Uint16 player_num, const char *bonus_name) |
Pro hráče (nebo spíše bonusy): nechat bouchnout první bombu. | |
void | shake_views () |
Třesení pohledy. | |
Uint16 | map_height () const |
Výška mapy. | |
Uint16 | map_width () const |
Šířka mapy. | |
Veřejné atributy | |
GameTools * | tools |
Pointer pro nadstavbové věci pro hru. | |
Privátní typy | |
typedef std::list< Bomb * > | bombs_t |
Typ seznamu bomb. | |
typedef std::map< Uint16, player_t > | players_t |
Typ seznamu hráčů hry, který umí rychle najít hráče podle čísla. | |
typedef players_t::iterator | players_it |
Typ iterátoru do seznamu hráčů. | |
Privátní metody | |
void | set_one_win_view_ (SDL_Rect &win_view, SDL_Surface *window) |
Nastavení obdélníku jako jedíného pohledu na obrazovce. | |
void | check_players_view_ (SDL_Surface *window) |
Zkontrolovat není-li třeba rozdělit či sloučit obrazovku. | |
void | set_players_view_ (SDL_Surface *window) |
Nastavení pohledů pro hráče. | |
void | set_players_view_1_ (SDL_Surface *window) |
Nastavení pohledů - jeden pohled na obrazovce. | |
void | set_players_view_2_ (SDL_Surface *window) |
Nastavení pohledů - dva pohledy na obrazovce. | |
void | set_players_view_4_ (SDL_Surface *window) |
Nastavení pohledů - 3 nebo 4 pohledy na obrazovce. | |
Uint16 | count_rect_shift_ (Uint16 player_coor, Uint16 rect_half_size, Uint16 map_size) const |
Spočítá posun mapy podle pozice hráče. | |
void | count_players_average_ (Sint16 &shift_x, Sint16 &shift_y) |
void | draw_ (SDL_Surface *window) |
Vykreslení obrazovky. | |
void | draw_players_view_ (SDL_Surface *window, Uint16 player_num) |
Vykreslení pohledu hráče. | |
void | draw_one_view_ (SDL_Surface *window) |
Vykreslení jednoho pohledu pro více hráčů. | |
void | draw_map_ (bool bg, SDL_Surface *window, SDL_Rect &map_view, Uint16 from_x, Uint16 from_y, Uint16 to_x, Uint16 to_y) |
Vykreslení části mapy. | |
void | draw_map_field_bg_ (SDL_Surface *window, SDL_Rect &map_view, Uint16 column, Uint16 field) |
Vykreslení pozadí jednoho políčka mapy. | |
void | draw_map_field_fg_ (SDL_Surface *window, SDL_Rect &map_view, Uint16 column, Uint16 field) |
Vykreslení popředí jednoho políčka mapy. | |
bool | move_ () |
Hýbnutí světem. | |
void | update_ () |
Posunutí animací. | |
void | load_placed_MOs_ (const GameBase::base_array_t &base_array) |
Zkopírování pevně umístěných objektů. | |
void | load_generated_MOs_ (const GameBase &base) |
Vygenerování neumístěných objektů. | |
void | generate_boxes_ (const GameBase &base, GameBase::generatedMOs_t::const_iterator begin, GameBase::generatedMOs_t::const_iterator end) |
Vygenerování beden. | |
void | generate_bonuses_ (GameBase::generatedMOs_t::const_iterator begin, GameBase::generatedMOs_t::const_iterator end) |
Vygenerování bonusů. | |
void | generate_creatures_ (const GameBase &base, GameBase::generatedMOs_t::const_iterator begin, GameBase::generatedMOs_t::const_iterator end) |
Vygenerování příšer. | |
void | insert_MO_ (const MapObject *mapObject, Uint16 width, Uint16 height, Uint16 column, Uint16 field) |
Vytvoření a vložení objektu do mapy. | |
Privátní atributy | |
staticMOs_t | staticMOs_ |
Seznam statických objektů mapy. | |
dynamicMOs_t | dynamicMOs_ |
Seznam dynamických objektů mapy. | |
map_array_t | map_array_ |
Dvourozměrné pole mapy, na každém políčku seznam objektů na něm položených. | |
Uint16 | remaining_creatures_ |
Počet žijících příšer. | |
Uint16 | remaining_periods_ |
Doba do ukončení hry po zabití. | |
bool | deathmatch_ |
Jedná se o deathmatch. | |
bool | bombsatend_ |
Násilné ukončení hry. | |
players_t | players_ |
Hráči hry. | |
bool | split_screen_ |
Jestli je aktualne rozdelena obrazovka. | |
Třídy | |
struct | player_t |
Typ hráče s jeho pohledy (na okno a na mapu), třesením pohledu a položenými bombami. ... |
Instance třídy Game obstarává jednu konkrétní hru. Může to být deathmatch nebo běžný level. Game může vytvořit pouze jedinou instanci, která je typicky držena z GameIntro nebo DeathmatchIntro. Implementuje nástroje, kterými tuto skutečnost hlídá a poskytuje svůj pointer globálně, prostřednictvím makra GAME. Ve svých strukturách uchovává statické i dynamické objekty hry. Stará se o hru samotnou, její spuštění, správné časování a ukončení. Podává informace o typu ukončení hry.
typedef std::vector< std::vector< std::list< MapObject* > > > Game::map_array_t |
Typ dvourozměrného pole mapy, na každém políčku seznam objektů s rozměry.
typedef std::list< DynamicMO* > Game::dynamicMOs_t |
Typ seznamu dynamickych objektu.
typedef std::vector< StaticMO* > Game::staticMOs_t |
Typ seznamu statickych objektu.
typedef std::list<Bomb*> Game::bombs_t [private] |
Typ seznamu bomb.
typedef std::map< Uint16, player_t > Game::players_t [private] |
Typ seznamu hráčů hry, který umí rychle najít hráče podle čísla.
typedef players_t::iterator Game::players_it [private] |
Typ iterátoru do seznamu hráčů.
Game::Game | ( | const GameBase & | base, | |
GameTools * | gameTools, | |||
bool | deathmatch = false , |
|||
bool | bombsatend = false | |||
) |
Inicializace hry.
base | zaklad hry | |
gameTools | pomucky pro hru | |
deathmatch | zda se jedna o deathmatch (nebo cooperative mode) | |
bombsatend | zda se maji na konci (v deathmatchi) zacit objevovat bomby zatim neimplementovano |
Game::~Game | ( | ) |
Uvolnění naalokovaaných objektů.
Zruší nejdříve všechny statické, následně všechny dynamické objekty v mapě. Nemaže presumpce, ty si obstará bomba. Vynuluje myself_pointer_.
void Game::play | ( | SDL_Surface * | window | ) |
Spuštění hry.
V realtime modelu spustí hru jako takovou, vykresluje objekty, hýbe objekty, hlídá jestli hra skončila.
window | surface okna pro vykreslení |
bool Game::success | ( | ) | const |
Info o ukončení hry.
bool Game::get_player | ( | Uint16 | player_num, | |
PlayerProperties & | prop | |||
) | const |
Info o hráči.
Zjistí jestli hráč žije, nastaví jeho vlastnosti.
player_num | číslo hráče | |
prop | vlastnosti hráče |
Uint16 Game::winner | ( | ) |
Číslo hráče, který je živý.
Užitečné pro deathmatch. Nutno pro jistotu správnosti výsledku použít success().
bool Game::field_canGoOver | ( | Uint16 | x, | |
Uint16 | y, | |||
bool | check_bomb = true | |||
) |
Políčko lze přejít.
x | x-ová souřadnice políčka | |
y | y-ová souřadnice políčka | |
check_bomb | zda se mají také kontrolovat bomby |
bool Game::field_canGoOver | ( | const field_t & | field, | |
bool | check_bomb = true | |||
) | [inline] |
Políčko lze přejít.
bool Game::field_withObject | ( | Uint16 | x, | |
Uint16 | y, | |||
const isTypeOf & | isType | |||
) |
Políčko lze přeletet.
Na políčku je typ objektu.
x | x-ová souřadnice políčka | |
y | y-ová souřadnice políčka | |
isType | predikat typu objektu, na který se ptáme |
Na políčku je typ objektu.
První objekt zadaného typu.
x | x-ová souřadnice políčka | |
y | y-ová souřadnice políčka | |
isType | predikat typu objektu, na který se ptáme |
První objekt zadaného typu.
void Game::remove_object | ( | DynamicMO * | obj | ) |
Vyhození objektu z mapy.
Specifikovaný objekt vyhodí ze seznamu dynamických objektů, z mapy a následně jej dealokuje!
obj | dynamický objekt, který chceme vyhodit |
void Game::insert_object | ( | Uint16 | x, | |
Uint16 | y, | |||
DynamicMO * | obj | |||
) |
Vloží objekt na políčko.
Vloží dynamický objekt do mapy a seznamu dynamických objektů. Instance Game se později postará o jeho dealokování.
x | souřadnice políčka pro vložení | |
y | souřadnice políčka pro vložení | |
obj | objekt, který chceme vložit |
Vloží objekt na políčko.
void Game::change_position | ( | Uint16 | old_x, | |
Uint16 | old_y, | |||
Uint16 | new_x, | |||
Uint16 | new_y, | |||
MapObject * | obj | |||
) |
Pohyb z políčka na políčko.
Vyhodí objekt ze starého políčka a vloží jej na nové.
old_x | stará souřadnice v políčkách | |
old_y | stará souřadnice v políčkách | |
new_x | nová souřadnice v políčkách | |
new_y | nová souřadnice v políčkách | |
obj | pointer na objekt, který chceme přesunout |
void Game::change_position | ( | const field_t & | old_field, | |
const field_t & | new_field, | |||
MapObject * | obj | |||
) | [inline] |
Pohyb z políčka na políčko.
void Game::plant_bomb | ( | Uint16 | player_num, | |
Uint16 | x, | |||
Uint16 | y, | |||
Bomb * | bomb | |||
) |
Pro hráče: položit bombu.
Umístí bombu do mapy, přidá bombu do seznamu hráčových bomb.
player_num | číslo hráče | |
x | souřadnice bomby v políčkách | |
y | souřadnice bomby v políčkách | |
bomb | pointer na bombu, kterou chceme položit |
Pro hráče: položit bombu.
Uint16 Game::count_bombs | ( | Uint16 | player_num | ) |
Pro hráče: spočítat položené bomby.
Spočítá položené nevybouchlé bomby hráče.
player_num | číslo hráče |
void Game::remove_bombs_timer | ( | Uint16 | player_num | ) |
Pro hráče: odstranit ruční odpalování u bomb.
Odstraní položeným bombám hráče ruční odpalování.
player_num | číslo hráče |
void Game::explode_bomb | ( | Uint16 | player_num | ) |
Pro hráče: nechat bouchnout první bombu.
Nechá vybouchnout první bombu hráče, pokud nějaká je.
player_num | číslo hráče |
void Game::add_others_bonus | ( | Uint16 | player_num, | |
const char * | bonus_name | |||
) |
Pro hráče (nebo spíše bonusy): nechat bouchnout první bombu.
Všem ostatním hráčům přidá bonus.
player_num | číslo hráče který bonus nedostane | |
bonus_name | jméno bonusu |
void Game::shake_views | ( | ) |
Třesení pohledy.
Uint16 Game::map_height | ( | ) | const |
Výška mapy.
Uint16 Game::map_width | ( | ) | const |
Šířka mapy.
void Game::set_one_win_view_ | ( | SDL_Rect & | win_view, | |
SDL_Surface * | window | |||
) | [private] |
Nastavení obdélníku jako jedíného pohledu na obrazovce.
Nastavi obdelnik win_view
, ktery bude pouzit jako jediny pohled v okne. Typicky přes celé okno, velikost je však omezena.
[out] | win_view | obdelnik pohledu |
window | surface okna, které rozděluji |
void Game::check_players_view_ | ( | SDL_Surface * | window | ) | [private] |
Zkontrolovat není-li třeba rozdělit či sloučit obrazovku.
Podle nastavení v configu, počtu a pozice hráčů zkontroluje, jestli není potřeba rozdělit či sloučit obrazovku.
window | surface okna, které rozděluji |
void Game::set_players_view_ | ( | SDL_Surface * | window | ) | [private] |
Nastavení pohledů pro hráče.
Podle nastavení v configu a počtu hráčů rozdělí hrací plochu do několika pohledů.
window | surface okna, které rozděluji |
void Game::set_players_view_1_ | ( | SDL_Surface * | window | ) | [private] |
Nastavení pohledů - jeden pohled na obrazovce.
Jeden pohled společný pro všechny hráče. Typicky přes celé okno, velikost je však omezena.
window | surface okna, které rozděluji |
void Game::set_players_view_2_ | ( | SDL_Surface * | window | ) | [private] |
Nastavení pohledů - dva pohledy na obrazovce.
Dva pohledy pro dva hráče. Řeší zda rozdělovat vodorovně či svisle, kdo kde bude. Každý musí mít stejně velký prostor.
window | surface okna, které rozděluji |
void Game::set_players_view_4_ | ( | SDL_Surface * | window | ) | [private] |
Nastavení pohledů - 3 nebo 4 pohledy na obrazovce.
Čtyři pohledy pro tři nebo čtyři hráče. Vždy rozdělí na čtvrtiny(dva sloupce, dva řádky), je předem jasně dáno, kdo kde bude. Každý má stejně velký prostor.
window | surface okna, které rozděluji |
Uint16 Game::count_rect_shift_ | ( | Uint16 | player_coor, | |
Uint16 | rect_half_size, | |||
Uint16 | map_size | |||
) | const [private] |
Spočítá posun mapy podle pozice hráče.
Pro jednu souřadnici (x nebo y) počítá, o kolik je třeba posunout mapu, aby byl hřáč uprostřed a zároveň byl dostatečně využit pohled (roh mapy nesmí být uvnitř pohledu).
player_coor | souřadnice hráče | |
rect_half_size | polovina rozměru pohledu | |
map_size | rozměr mapy |
void Game::count_players_average_ | ( | Sint16 & | shift_x, | |
Sint16 & | shift_y | |||
) | [private] |
Spocita posunuti mapy aby byl prumer pozic hracu uprostred.
[out] | shift_x | posunuti po ose x |
[out] | shift_y | posunuti po ose y |
void Game::draw_ | ( | SDL_Surface * | window | ) | [private] |
Vykreslení obrazovky.
Vykreslí pohledy a panely hráčů.
window | surface, do kterého máme kreslit |
void Game::draw_players_view_ | ( | SDL_Surface * | window, | |
Uint16 | player_num | |||
) | [private] |
Vykreslení pohledu hráče.
Vykreslí pohled určitého hráče. Zjišťuje posunutí mapy vůči pohledu, vykresluje prvně vše v pozadí, pak vše v popředí.
window | surface, do kterého máme kreslit | |
player_num | číslo hráče, pro kterého máme vykreslit pohled |
void Game::draw_one_view_ | ( | SDL_Surface * | window | ) | [private] |
Vykreslení jednoho pohledu pro více hráčů.
Jako střed vykreslování vezme aritmetický průměr pozic hráčů. Zjišťuje posunutí mapy vůči pohledu, vykresluje prvně vše v pozadí, pak vše v popředí.
window | surface, do kterého máme kreslit |
void Game::draw_map_ | ( | bool | bg, | |
SDL_Surface * | window, | |||
SDL_Rect & | map_view, | |||
Uint16 | from_x, | |||
Uint16 | from_y, | |||
Uint16 | to_x, | |||
Uint16 | to_y | |||
) | [private] |
Vykreslení části mapy.
Vykreslí část mapy v pohledu.
bg | jestli se má kreslit jen pozadí (nebo jen popředí) | |
window | surface okna pro vykreslení | |
map_view | pohled | |
from_x | x-ová souřadnice počátku vykreslování | |
from_y | y-ová souřadnice počátku vykreslování | |
to_x | x-ová souřadnice konce vykreslování | |
to_y | y-ová souřadnice konce vykreslování |
void Game::draw_map_field_bg_ | ( | SDL_Surface * | window, | |
SDL_Rect & | map_view, | |||
Uint16 | column, | |||
Uint16 | field | |||
) | [private] |
Vykreslení pozadí jednoho políčka mapy.
Vykreslí pozadí (background, floorobject) jednoho políčka mapy.
window | surface okna pro vykreslení | |
map_view | pohled | |
column | x-ová souřadnice políčka mapy | |
field | y-ová souřadnice políčka mapy |
void Game::draw_map_field_fg_ | ( | SDL_Surface * | window, | |
SDL_Rect & | map_view, | |||
Uint16 | column, | |||
Uint16 | field | |||
) | [private] |
Vykreslení popředí jednoho políčka mapy.
Seřadí objekty na políčku. Vykreslí objekty v popředí jednoho políčka mapy.
window | surface okna pro vykreslení | |
map_view | pohled | |
column | x-ová souřadnice políčka mapy | |
field | y-ová souřadnice políčka mapy |
bool Game::move_ | ( | ) | [private] |
Hýbnutí světem.
Projde všechny dynamické objekty hry a zavolá na nich fci move(). V průběhu shromažduje objekty, které nakonec vyhodí.
void Game::update_ | ( | ) | [private] |
Posunutí animací.
Projde všechny dynamické i statické objekty hry a zavolá na nich fci update(). Obnoví i zatřasení pohledy.
void Game::load_placed_MOs_ | ( | const GameBase::base_array_t & | base_array | ) | [private] |
Zkopírování pevně umístěných objektů.
Okopíruje zadanou mapu, jednak vytvoří základní rozměry mapy, jednak okopíruje umístěné objekty.
base_array | pole s pevně umístěnými objekty |
void Game::load_generated_MOs_ | ( | const GameBase & | base | ) | [private] |
Vygenerování neumístěných objektů.
Vygeneruje v pořadí bedny, bonusy a příšery.
base | základ hry, ze kterého se mají generované objekty použít |
void Game::generate_boxes_ | ( | const GameBase & | base, | |
GameBase::generatedMOs_t::const_iterator | begin, | |||
GameBase::generatedMOs_t::const_iterator | end | |||
) | [private] |
Vygenerování beden.
Zjistí volná políčka pro vygenerování beden a pokusí se náhodně rozmístit všechny bedny v zadaném intervalu.
base | reference na GameBase kvuli allowed_array_ a allowed_boxes_count_ | |
begin | iterator s nahodnym pristupem, začátek beden | |
end | iterator s nahodnym pristupem za koncem beden |
void Game::generate_bonuses_ | ( | GameBase::generatedMOs_t::const_iterator | begin, | |
GameBase::generatedMOs_t::const_iterator | end | |||
) | [private] |
Vygenerování bonusů.
Zjistí políčka pro vygenerování bonusů a pokusí se náhodně rozmístit všechny bonusy v zadaném intervalu.
begin | začátek bonusů | |
end | konec bonusů |
void Game::generate_creatures_ | ( | const GameBase & | base, | |
GameBase::generatedMOs_t::const_iterator | begin, | |||
GameBase::generatedMOs_t::const_iterator | end | |||
) | [private] |
Vygenerování příšer.
Zjistí volná políčka pro vygenerování příšer a pokusí se náhodně rozmístit všechny příšery v zadaném intervalu.
base | reference na GameBase kvuli allowed_array_ | |
begin | začátek příšer | |
end | konec příšer |
void Game::insert_MO_ | ( | const MapObject * | mapObject, | |
Uint16 | width, | |||
Uint16 | height, | |||
Uint16 | column, | |||
Uint16 | field | |||
) | [private] |
Vytvoření a vložení objektu do mapy.
Vytvoří objekt, vloží jej do seznamu statických nebo dynamických objektů, vloží ho do mapy na všechna políčka, která zabírá.
mapObject | objekt k okopírování | |
width | počet políček zabíraných v mapě na šířku | |
height | počet políček zabíraných v mapě na výšku | |
column | sloupec mapy, ve kterém je levý roh objektu | |
field | řádek mapy, ve kterém je horní roh objektu |
string | chybové hlášení při vkládání objektu, jehož typ není ve výčtu. Typicky se stane, že programátor přidá typ objektu a zapomene ho přidat i sem. |
Pointer pro nadstavbové věci pro hru.
staticMOs_t Game::staticMOs_ [private] |
Seznam statických objektů mapy.
dynamicMOs_t Game::dynamicMOs_ [private] |
Seznam dynamických objektů mapy.
map_array_t Game::map_array_ [private] |
Dvourozměrné pole mapy, na každém políčku seznam objektů na něm položených.
Uint16 Game::remaining_creatures_ [private] |
Počet žijících příšer.
Uint16 Game::remaining_periods_ [private] |
Doba do ukončení hry po zabití.
bool Game::deathmatch_ [private] |
Jedná se o deathmatch.
bool Game::bombsatend_ [private] |
Násilné ukončení hry.
players_t Game::players_ [private] |
Hráči hry.
bool Game::split_screen_ [private] |
Jestli je aktualne rozdelena obrazovka.