Programování pro hračičky/Měniči/Lekce 2: Porovnání verzí

Smazaný obsah Přidaný obsah
 
Řádek 33:
== Reálné a virtuální objekty ==
 
Když se pokoušíme zacházet s různými objekty, narazíme na případy, kdy se s nějakým objektem nedá provést něco, co u jiných objektů téhož druhu bylo možné. Například jsme si na pár oknech vyzkoušeli, jak reagují na příkazy <code>otevři</code>, <code>zavři</code> a <code>zaklepej</code> — v &nbsp;jednom případě šlo třeba okno skutečně otevřít, ve druhém případě nám třeba sdělilo, že otevřít nejde, protože je zarezlé, ale bylo každopádně jasné, že příkaz je v objektuotevření okna je definován, a aleve paktřetím najednoupřípadě narazíme na okno, které na všechny zmíněné příkazy reaguje jen obecným <code>Prosím?</code>.
 
Takovéto dvojí či trojí chování oken (nebo jiných objektů, třeba dveří, židlí, skříní apod.) bývá způsobeno tím, že objekt, který nereaguje na očekávané příkazy, není reálný, nýbrž tzv. ''virtuální objekt'' (též ''detail'', nebo z angličtiny ''v-item'' či ''vitem'').<ref>Pohybujeme se ovšem ve virtuálním světě, tedy i „reálné“ objekty jsou vůči našemu reálnému světu virtuální, tedy reálně v něm nejsou. Jsou však reálné v rámci virtuálního světa hry, zatímco virtuální objekty jsou i v něm virtuální, tedy nenacházejí se v něm, ale hra se chová, jako by se nacházely.</ref> nýbrž tzv. ''virtuální objekt'' (též ''detail'', nebo z angličtiny ''v-item'' či ''vitem'').
 
Zatímco objekty, o nichž jsme dosud mluvili, jsou samostatné a ucelené programové entity, virtuální objekty jsou vlastně jen do jiných objektů vložené záznamy o vlastnostech objektů, které ''by mohly'' být, ale nikdo je nevytvořil. V případě našeho nereagujícího okna je tímto „jiným objektem“ místnost, která má mezi svými vlastnostmi uloženo, že je v ní staré okno v bíle natřeném dřevěném rámu, na omak trochu zaprášené. Pokud pak hráč zadá příkaz <code>prohlédni si okno</code>, pak jeho hráčský objekt, v němž je příkaz <code>prohlédni</code> definován, sice nenajde žádný reálný objekt, jehož by se tato věta mohla týkat, ale od místnosti dostane zprávu, že má popis zmíněného okna, a ten zní: <code>Staré okno v bíle natřeném rámu. Léty nepoužívání už zatuhlo ve své zavřené poloze natolik, že ani při nejlepší vůli nejde otevřít.</code> Hráčský objekt pak hráči pošle tento popis úplně stejně, jako by v místnosti byl samostatný objekt okna. Pokud však hráč zadá příkaz <code>zaklepej na okno</code>, pak obdrží jen hlášku <code>Prosím?</code>, protože ani hráčský objekt sám, ani místnost s virtuálním oknem nedefinuje příkaz <code>zaklepej</code>.
 
Zkusíme-li na virtuální objekt použít některý z příkazů, které hráči nabízí okno — jako třeba <code>otevři okno</code> nebo <code>zaklepej na okno</code> — pak se zpravidla dočkáme jen obecné hlášky <code>Prosím?</code>, protože ani hráčský objekt sám, ani místnost s virtuálním oknem nedefinuje příkaz <code>otevři</code> nebo <code>zaklepej</code>. Samozřejmě je možné, že v místnosti se nachází nějaký jiný objekt, který tyto příkazy definuje, pak tento objekt buď vztáhne náš příkaz na sebe (zaklepeme na reálné okno místo na virtuální), anebo nám nějakou hláškou dá najevo, že chceme zacházet s nesprávným objektem (například hláškou <code>Na co že chceš zaklepat?</code>). Rovněž místnost sama může definovat tyto příkazy a odpovídat za virtuální objekt (pak můžeme např. klepat na virtuální okno nebo se dívat do místnosti za oknem), takže můžeme mít docela dlouho dojem, že zacházíme s objektem reálným — než konečně narazíme na nějakou akci, která by měla jít s reálným objektem vykonat, ale s tímto objektem vykonat nelze, protože to není skutečný objekt.
Protože takovéto virtuální objekty jsou jen vlastností nějakého reálného objektu, nemohou se samy přesouvat (nanejvýš spolu s objektem, jehož jsou součástí). Můžeme na ně sice zkoušet aplikovat základní příkazy pro přesun objektů, jako třeba <code>vezmi</code>, a protože tyto příkazy jsou definovány přímo v objektu hráče, dočkáme se specifické reakce, většinou však tato reakce sestává jen z hlášky <code>To bohužel nejde.</code> Jen v ojedinělých případech můžeme pokusem o vzetí virtuálního objektu skutečně dostat nějaký objekt do inventáře — pak jsme ovšem nevzali virtuální objekt (ten zůstane na svém místě), nýbrž nový reálný objekt, který byl vygenerován reálným objektem, jehož součástí virtuální objekt je.<ref>Příkladem takové akce je trhání plodů z ovocných stromů a keřů, s nímž se můžeme setkat v dalších oblastech hry.</ref>
 
Šikovný programátor nějaké místnosti může virtuální objekty vybavit takovým množstvím příkazů, že se rozdíl vůči reálným objektům při běžném hraní víceméně neprojeví. Protože však všechny takovéto virtuální objekty jsou jen vlastností nějakého reálného objektu, nemohou se nikdy samy přesouvat (nanejvýš spolu s objektem, jehož jsou součástí), ani samy nemohou obsahovat žádné objekty. MůžemeI na virtuální objekty sice můžeme zkoušet aplikovat základní příkazy pro přesun objektů, jako třeba <code>vezmi</code>, a protožedočkat tytose příkazynějaké jsouspecifické definoványreakce, přímoavšak vvirtuální objektuobjekt hráče,při dočkámetom senezmění specifickésvůj reakcestav, většinoutedy všakjenom tatose reakcedozvíme, sestáváže jenho znemůžeme hlášky <code>To bohužel nejdevzít.</code> Jen v ojedinělých případech můžeme pokusem o vzetí virtuálního objektu skutečně dostat nějaký objekt do inventáře — pak jsme ovšem nevzali virtuální objekt (ten zůstane na svém místě), nýbrž nový reálný objekt, který byl vygenerován reálným objektem, jehož součástí virtuální objekt je.<ref>Příkladem takové akce je trhání plodů z ovocných stromů a keřů, s nímž se můžeme setkat v dalších oblastech hry.</ref>
 
==Hlášení chyb==