Instance a objekty, co to je? - GameMaker
Jak jsem si všimnl, tak spousta i pokročilejších vývojářů, pohybujících se ve sféře GM, stále nezná rozdíl mezi instancí a objektem. Jelikož se jedná o velice zásadní znalost, rozhodl jsem se sepsat tento návod. Předem bych chtěl podotknout, že ačkoliv se jedná o základy, je nutná znalost programátorského minima tj. práce s GML a hlavně proměnné, ty jsou pro následující lekci stěžejní.
Již dříve se mi při vysvětlování abstraktních problémů z oblasti programování osvědčilo využívat reálné příklady, chcete-li připodobnění. Tohoto postupu se budu držet i nyní. Ze všeho nejdřív si ujasníme názvosloví. Termíny, o kterých bude řeč: objekt, instance, sprite, funkce, proměnná. Pokud si nejste jisti něčím z předchozího výčtu, tak uvedu stručný popis.
Objekt je to co upravujete v hlavním okně programu GM. Objekty se vytváří pomocí tlačítka s modrou koulí případně příslušnou kláv. zkratkou. Ve výsledku jsou veškeré objekty zobrazeny v levém panelu ve složce Objects.
Instance je to, co umisťujete v Room Editoru a také to co je, někdy není, vidět při spuštění hry. Instance se nikde v žádném seznamu v editoru nezobrazí. To jak bude instance vypadat, určuje její sprite. Sprite je tedy obrázek, zde myslím není co vysvětlovat.
Pomocí funkcí určujete, jak bude hra fungovat. Vždycky jejich jméno končí kulatými závorkami. Funkce mohou a nemusí mít argumenty a mohou a nemusí vracet hodnotu.
A nakonec proměnné. Jedná se o speciální „slova“, která zatupují určenou hodnotu. Omlouvám se za toto zkrácení, ale proměnné by vydaly na samostatný článek. Kdo neumí pracovat s proměnnými, tomu tento článek stejně mnoho nedá.
Seznam všech instancí je možno získat v menu Tools, položka Show Instances, při spuštění v debug módu. To je ta červená šipka v toolbaru.
Po delším přemýšlení jsem došel k závěru, že nejlepším přirovnáním bude balicí linka. Představte si velkou budovu vybavenou skladištěm, pásovým dopravníkem a robotem s ovládacím pultem. Tato budova je v našem případě hlavní editační prostředí GM. Balicí robot zatím neví, co má dělat a od toho tu je operátor (programátor, tedy vy), který přijde k ovládacímu pultu a vytvoří robotovi seznam věcí, které má zabalit. To odpovídá vlastní tvorbě programu v editoru. Poté, když je operátor spokojen přikáže robotu, kolik má zabalit krabic. Načež robot vyrazí do skladiště (rozuměj seznam veškerých funkcí, které GM zná + proměnné) a všechno zabalí do krabice, kterou umístí na správnou pozici v regálu náklaďáku. To je stejné jako umísťování v Room Editoru. Když robot umístí krabici do regálu, tak na každou z nich napíše pořadové identifikační číslo.
Tak teď v tom uděláme jasno. Zmiňovaný seznam věcí k zabalení je
vidět v editoru je OBJEKT. Jednotlivé krabice, které
obsahují věci zabalené podle seznamu, jsou INSTANCE.
Instancí jednoho objektu může být libovolné množství. A každá instance
je nezávislá na ostatních. Alespoň co se proměnných týče. Proměnné si
můžete představit jako malé skleničky s nálepkou se jménem. Protože je
každá v jiné krabici, nemohou se navzájem ovlivnit. To že se jedná o jinou
krabici, zajistí pořadové číslo. V GM se jedná o ID
instance. Je to jedinečné a jednoznačné číselné označení každé
instance ve hře.
Ti z vás, kteří již máte zkušenosti s vyššími objektově
orientovanými jazyky, například C#, Java… Mohou najít podobnost v systému
tvorby objektů. Třídy v OO jazycích jsou v GM označovány jako objekty a
objekty z OO jsou v GM instance.
Někdo by si řekl, že tím zábava končí. Omyl! Opak je pravdou. Právě teď teprve začíná ta pravá zábava. S jednotlivými instancemi je totiž možno pracovat. Je jediný způsob jak s instancemi pracovat a to měnit hodnoty jejich proměnných. Než budeme pokračovat, je nutné si uvědomit, že existují dva „druhy“ proměnných – uživatelské a defaultní. Termín uživatelské proměnné mluví sám za sebe, to jsou ty, které si nastaví sám programátor pro své potřeby. Pak tu jsou ale ještě defaultní proměnné. Ty obsahuje úplně každá instance. Jejich kompletní seznam najdete v menu Scripts, položka show Built-in variables. Já zmíním jenom ty nejdůležitější: id, x, y, speed, direction, sprite_index. Způsobů jak ovlivnit proměnné jiné instance je několik. V principu se však jedná o to samé, adresování. To znamená, že programu řekneme, do které krabice má sáhnout. Adresování se provádí pomocí operátoru tečka ".". Nejjednodušší způsob je:
obj_lampa.sviti = 1;
Tento kód nastaví všem instancím objektu obj_lampa proměnnou sviti na 1. To je sice hezké, ale co když chceme rozsvítit pouze jednu lampu? To není problém, akorát musíme znát její id. To je možné zjistit pomocí velkého množství funkcí nebo v Room Editoru po najetí myší, případně v Debug modu. Každopádně jakmile známe id instance, máme stále několik možností:
(102022).sviti = 1; //pokud známe přesně id instance i = 102022; i.sviti = 1; inst = instance_nearest(x,y,obj_hrac); inst.sviti = 1; //rozsvítí se lampa nejblíže hráči
Poslední možností je použití operátoru with, to je však jako jít na komára s kanónem.
with(100212){ sviti = 1;//nyní už se nepoužívá adresování tečkou }
Operátor with najde své využití, pokud chceme přikázat jiné instanci, aby vykonala funkci. Báječným příkladem je funkce instance_destroy(), která zničí volající instanci. Jak to ovšem udělat, když chceme zničit jinou instanci? Použijeme operátor with.
with(102010){
instance_destroy();
}
Tímto zničíme instanci s id 102010. Samozřejmě, že můžeme použít funkci pro zjištění požadovaného id. Tímto pro dnešek skončíme. Příště se podíváme na jednotlivé funkce, které nám umožní zjistit id přímo ve hře.