Minule jsme si ukázali jak pomocí funkcí ovlivňovat průběh hry. V dnešním článku se naučíme tzv. dědičnost, což je věc, kterou můžeme použít např. pro výběr druhu postavy (orc, elf, nekromant…).
Máme třídu hrdina, který má v kompozici batoh. Pro potřeby dědičnosti, ale musíme změnit private na protected, protože private se jednoduše nedědí. Nyní si jen definujeme další třídy, které budou obsahovat speciální atributy. Tou první může být například elf:
Jak vidíte tato třída neobsahuje nic z toho, co má hrdina, ale přesto může se vším pracovat (to nám zajistí public Hrdina), a proto je nutné načíst v konstruktoru všechny parametry a následně je předat dál.
Podobně si můžeme vytvořit další a další třídy s různými možnostmi. Ale doporučuji vám do hrdiny přidat jeden atribut a metodu:
S tím, že si pro každou rasu načtete v konstruktoru jiné číslo, a předáte ji hrdinovy, který ji uloží do proměnné "int typ".
Vzpomínáte si na Sandokana, kterého jste na začátku hry mohli zranit, a po nějakém čase jste mohli najít jeho tělo? Nebo jste ho nechali na živu a zakopli jste o listí? Ne? Tak to byste si měli přečíst minulý díl, protože zde funkci typ() můžete využít prakticky stejně, např. takto:
Tato funkce Vám jednoduše přidává další možnosti jak rozvíjet příběh pro každou rasu jinak.
Představte si situaci, kdy chcete, aby všechny rasy měly nějakou schopnost, která u každé funguje trochu jinak. Např. Kradení. V hrdinovi vytvoříme tuto funkci:
Elf navíc může využít svůj šarm, takže bude mít:
Atd... A proč Virtual? Protože když používáte dědičnost, tak se do potomků kopíruje všechno a vy tudíž nemůžete mít stejně pojmenovanou funkci – tedy můžete, ale nemůžete vědět, která se použije. Takto můžete pro každou rasu nastavit stejnou metodu jinak.
Použít to můžete třebas takto:
Ve výsledný soubor může vypadat například takhle: Download
Ptáte se, na co se podíváme příště? Na asociaci, aneb použití objektu v parametru - příklad: Elfka vyléčí někoho jiného, než sebe. ;)
class Elf: public Hrdina{
private:
int krasa;
public:
Elf(int typ, int zdravy, int s, int zbran, int hbit, int krasa):Hrdina(typ, sila, zdravy, zbran, hbit){
this->krasa;
};
void special(){ //speciální schopnost
if (zdravy < 100){ zdravy = 100;};
};
};
private:
int krasa;
public:
Elf(int typ, int zdravy, int s, int zbran, int hbit, int krasa):Hrdina(typ, sila, zdravy, zbran, hbit){
this->krasa;
};
void special(){ //speciální schopnost
if (zdravy < 100){ zdravy = 100;};
};
};
Jak vidíte tato třída neobsahuje nic z toho, co má hrdina, ale přesto může se vším pracovat (to nám zajistí public Hrdina), a proto je nutné načíst v konstruktoru všechny parametry a následně je předat dál.
Nezapomeňte, že v konstruktoru Hrdiny, načítáme i chleba a klíče - to klidně zrušte a nastavte hodnoty v konstruktoru batohu ručně třeba na nulu.
Podobně si můžeme vytvořit další a další třídy s různými možnostmi. Ale doporučuji vám do hrdiny přidat jeden atribut a metodu:
protected:
int typ;
public:
int typ(){ return typ;};
int typ;
public:
int typ(){ return typ;};
S tím, že si pro každou rasu načtete v konstruktoru jiné číslo, a předáte ji hrdinovy, který ji uloží do proměnné "int typ".
Vzpomínáte si na Sandokana, kterého jste na začátku hry mohli zranit, a po nějakém čase jste mohli najít jeho tělo? Nebo jste ho nechali na živu a zakopli jste o listí? Ne? Tak to byste si měli přečíst minulý díl, protože zde funkci typ() můžete využít prakticky stejně, např. takto:
cout << "Vešel jsi do hospody " << endl;
switch (hrac->typ())
case 1: … "a v klidu si se usadil u baru."
case 2: … "a posadils ses vedle mladíka, ktery na tebe mrknul."
case 3: … "a vsichni zmlkli, cimz ti dali jasně najevo, že hnusného smradlavého orka tu nikdo nechce."
...
switch (hrac->typ())
case 1: … "a v klidu si se usadil u baru."
case 2: … "a posadils ses vedle mladíka, ktery na tebe mrknul."
case 3: … "a vsichni zmlkli, cimz ti dali jasně najevo, že hnusného smradlavého orka tu nikdo nechce."
...
Tato funkce Vám jednoduše přidává další možnosti jak rozvíjet příběh pro každou rasu jinak.
Představte si situaci, kdy chcete, aby všechny rasy měly nějakou schopnost, která u každé funguje trochu jinak. Např. Kradení. V hrdinovi vytvoříme tuto funkci:
virtual int ukrast(){ return hbitost;};
Elf navíc může využít svůj šarm, takže bude mít:
int ukrast(){ return hbitost+krasa; };
Atd... A proč Virtual? Protože když používáte dědičnost, tak se do potomků kopíruje všechno a vy tudíž nemůžete mít stejně pojmenovanou funkci – tedy můžete, ale nemůžete vědět, která se použije. Takto můžete pro každou rasu nastavit stejnou metodu jinak.
Použít to můžete třebas takto:
if (hrac->ukrast() > 10){“ Podařilo se ti ukrást rohlik”} else {“ Nepodařilo se ti ukrást rohlík”};
Ve výsledný soubor může vypadat například takhle: Download
Ptáte se, na co se podíváme příště? Na asociaci, aneb použití objektu v parametru - příklad: Elfka vyléčí někoho jiného, než sebe. ;)
Komentáře
Přidat nový
Pro přispívání musíte být přihlášen
Zapsal Firejs - 07.11.2010 10:48
No, právě kdyby nechal koment, tak to můžu opravit... takto nevím. Tak už aby byla dvojka ;)
Zapsal Likandro - 07.11.2010 10:44
Klídek, to asi nemá smysl řešit. Až se nahodí Kreveta 2, zůstane jen "Líbí," protože jasně říká "Jo, děláš to dobře, takhle je to fajn", kdežto "Nelíbí," to řekne jen, že to děláš špatně, ale už neříká kde a jak to zlepšit, takže nemá žádnou výpovědní hodnotu... A pokud tedy někdo bude mít problém, napíše ho do komentářů...
Zapsal Firejs - 07.11.2010 09:51
Jů 9 přečtení a už se to někomu nelíbí.. důvod mi neřekne?



