Programování pro hračičky/Andělé/Lekce 3: Porovnání verzí

Z Wikiverzity
Smazaný obsah Přidaný obsah
Řádek 25: Řádek 25:
Klon objektu vyrobíme v rámci programu funkcí <code>clone_object()</code>, ve hře pak andělským příkazem <code>budiž</code>. Jedná se vlastně o paměťovou kopii všech proměnných, v nichž jsou uloženy vlastnosti objektu, zatímco metody objektu jsou zapsány jedinečně v prototypu. Z toho plyne, že vlastnosti jednotlivého naklonovaného objektu můžeme po naklonování nadále měnit, zatímco množina použitelných metod je pevně dána společným prototypem.
Klon objektu vyrobíme v rámci programu funkcí <code>clone_object()</code>, ve hře pak andělským příkazem <code>budiž</code>. Jedná se vlastně o paměťovou kopii všech proměnných, v nichž jsou uloženy vlastnosti objektu, zatímco metody objektu jsou zapsány jedinečně v prototypu. Z toho plyne, že vlastnosti jednotlivého naklonovaného objektu můžeme po naklonování nadále měnit, zatímco množina použitelných metod je pevně dána společným prototypem.


Aby se klonovatelné objekty nepletly s jinými, ukládáme jejich soubory buď do složky <code>/obj</code> a jejích podsložek (jako třeba <code>/obj/nabytek</code> nebo <code>/obj/voda</code>), nebo do podsložek <code>obj</code> v příslušné části hry (například <code>/d/stredozeme/moria/obj</code>) nebo ve vlastním programátorském adresáři (například <code>/w/mojejmeno/obj</code>).
...


===Virtuální objekty===
===Virtuální objekty===

Verze z 30. 10. 2012, 21:59

Tato stránka není ještě hotová.

Opakování a probrání domácího úkolu

Projděme si místnosti, které jsme kdo vytvořili (zejména máme-li něco, co bychom rádi ukázali ostatním).

Podívejme se, jaký herní předmět hodlá kdo vytvořit. (Dnes se do tohoto tvoření dáme.)

Základní programátorské rozlišení objektů

Objekty, s nimiž se setkáváme ve hře, mohou být trojího základního druhu: Mohou to být jednak jedinečné objekty, které se dále neklonují a ve hře proto vystupuje přímo jejich prototyp, jednak klonované objekty, jejichž prototyp zůstává mimo hru, zatímco ve hře se vyskytují jeho klony, jednak virtuální objekty, které se hráčům jako objekty jeví, ale z programátorského hlediska nejsou objekty, nýbrž víceméně jen soubory hlášek, jimiž se má reagovat na určité hráčské příkazy.

Jedinečné objekty

Některé objekty se ve hře z logiky věcí mají vyskytovat jen jednou a jsou natolik složité, že se vyplatí mít jejich program uložen ve zvláštním souboru. Týká se to jednak všech místností, které nejsou generovány automaticky podle map (například celý Dům, a za prvním Prahem téměř všechny místnosti ve městech, mimořádná zákoutí atd.), jednak nehráčských postav majících nějakou osobnost (například Josef nebo Lída, které můžeme potkat hned na začátku hry), jednak předmětů nadaných mimořádnými možnostmi, jejichž častější výskyt ve hře by mohl dost změnit její náladu (například buřič trempů Kundrápa a Žahoura, který může být velmi mocnou zbraní). K těmto objektům vystupujícím přímo ve hře pak můžeme připočítat též objekty, které nějakou část hry spravují nebo koordinují, aniž by byly pro hráče přímo viditelné (tzv. mastery neboli řídicí objekty, například řídicí objekt počasí pro tu či onu doménu, řídicí objekt legionářských hlídek v Oikúmené atd.).

Takovéto objekty jsou pak přímým obrazem svého programového souboru, který se načte do paměti buď v rámci programu funkcí touch(), nebo ve hře andělským příkazem probudiž. Tím vznikne prototyp, ze kterého se ovšem už nevyrábějí žádné další klony, nýbrž který sám účinkuje ve hře.

Aby byly jedinečné objekty odlišeny od klonovatelných, umisťujeme je v mudové knihovně zpravidla do podsložek touch/ (v hráčské oblasti tedy třeba /d/oikumene/jeruzalem/touch, ve vlastní programátorské složce třeba /w/mojejmeno/touch nebo /w/mojejmeno/bludiste/touch).

Klonované objekty

Jiné objekty se ve hře vyskytují opakovaně. Typicky jsou to běžné předměty (batoh, pochodeň, meč), ale také druhové bytosti (vlk, skřet, hlídkující legionář) a mapové místnosti (tedy například jednotlivé vzájemně podobné místnosti v určité krajině). Takovéto objekty pak mají společný programový soubor a z něho vytvořený prototyp, který ovšem sám ve hře nevystupuje, nýbrž se z něho vždy nejprve vyrobí klon, který se pak přemístí jako objekt do hry.

Klon objektu vyrobíme v rámci programu funkcí clone_object(), ve hře pak andělským příkazem budiž. Jedná se vlastně o paměťovou kopii všech proměnných, v nichž jsou uloženy vlastnosti objektu, zatímco metody objektu jsou zapsány jedinečně v prototypu. Z toho plyne, že vlastnosti jednotlivého naklonovaného objektu můžeme po naklonování nadále měnit, zatímco množina použitelných metod je pevně dána společným prototypem.

Aby se klonovatelné objekty nepletly s jinými, ukládáme jejich soubory buď do složky /obj a jejích podsložek (jako třeba /obj/nabytek nebo /obj/voda), nebo do podsložek obj v příslušné části hry (například /d/stredozeme/moria/obj) nebo ve vlastním programátorském adresáři (například /w/mojejmeno/obj).

Virtuální objekty

Některé objekty se vyskytují ve hře jen jako doplňky či detaily jiných objektů a jsou na tyto jiné objekty pevně vázané. Typicky se jedná součásti popisu místností, které je možno si zvlášť prohlédnout (stěny, strop, nebe, tráva), méně často o popisové detaily na předmětech (cenovka na svetru, držadlo u kbelíku) nebo na nehráčských postavách (vlasy, zuby).

...

Používáme virtuální objekty

...

void create()
{
  ...
  add_v_item(([
    "name":"pohár",
    "plural":CISLO_MN,
    "gender":ROD_MI,
    "vzor":VZOR_STAN,
    "id":({"pohár","pohár","číše","číše","sklenice","sklenice"}),
    "vzor_id":({VZOR_STAN,VZOR_STAN,VZOR_NUSE,VZOR_NUSE,
      VZOR_ULICE,VZOR_ULICE}),
    "plural_id":({CISLO_J,CISLO_MN,CISLO_J,CISLO_MN,CISLO_J,CISLO_MN}),
    "long":"Poháry, kterých se v této krčmě užívá, jsou zhotoveny ze skla, "
      "zajímavého materiálu, oblíbeného právě v Egyptě. "
      "Mají jednoduchý válcový tvar a dole zesílenou podstavu.",
    "smell":"Přes všepronikající vůni egyptského dýmu cítíš z použitých "
      "pohárů vůně nápojů, které v nich ještě před chvilkou byly.",
  ]));
  ...
}

...

Klonování objektů v místnostech

...

void reset()
{
  if (!stud)
    {
      stud=clone_object("/obj/voda/studna");
      stud->set_name("kašna");
      stud->set_gender(ROD_F);
      stud->set_vzor(VZOR_PANNA);
      stud->add_id(({"skruž","sloupek","socha","nymfa","víla","džbán",
          "ornament","ornament"}),
        ({VZOR_JABLON,VZOR_STOLEK,VZOR_ZENA,VZOR_ZENA,VZOR_ZENA,VZOR_HRAD,
          VZOR_STAN,VZOR_STAN}),
        ({CISLO_J,CISLO_J,CISLO_J,CISLO_J,CISLO_J,CISLO_J,
          CISLO_J,CISLO_MN}));
      stud->set_adjektiv("kamenný");
      stud->set_long("Kašna, kterou vidíš před sebou, sestává z velké "
        "kamenné skruže, uprostřed níž se tyčí právětak kamenný sloupek, "
        "nesoucí sochu nymfy, tedy vodní víly. Víla drží v rukou veliký "
        "džbán, z něhož vytéká voda a naplňuje kašnu. Sloupek i skruž "
        "jsou zdobeny tesanými ornamenty.");
      stud->move(this_object());
    }
}

Do funkce create() pak přidáme zavolání této funkce reset(), aby se objekt vytvořil hned při vytvoření místnosti:

void create()
{
  ...
  reset();
}

...

Práce na vlastním objektu

...

Pomocné stránky