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

Smazaný obsah Přidaný obsah
Utar (diskuse | příspěvky)
→‎Obsah kroku: krátký popis
Řádek 26:
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 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 objektu okna definován — ale pak najednou narazíme na okno, které na všechny zmíněné příkazy reaguje jen obecným <code>Prosím?</code>.
 
Takovéto dvojí chování oken (nebo jiných objektů, třeba dveří, židlí, skříní a pod.) 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'').
 
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>.
 
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>
Protože takovéto virtulní objekty jsou součástí jiného objektu, nemohou se samy jen tak přesouvat. Sice reagují třeba na příkaz <code>vezmi</code> (obvykle ale jen hláškou <code>To bohužel nejde.</code>), to ale jen pro to, že ten je definován přímo v objektu hráče.
 
==Úkoly==