Pravidla Ucet
Nepřihlášen

Článek

Menu

Instance a objekty, co to je?
Napsal: sutr90
Přidáno: 24.07. 2010

Jak jsem si všimnul 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 vydali 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.

sutr90
Ostatní díly seriálu:
Klíčová slova: instance objekt object instance
 

Komentáře:

Přidáno: 30.07. 2010

Chtěl jsem napsat něco podobnýho (článek), ale teď jsem našel tohle. Každopádně bych tam určitě přidal instance_create!!!!

Trvalý odkaz

Napsal: jackm
Přidáno: 25.07. 2010

Pěkný, hodí se . :)

Trvalý odkaz

Napsal: NicharCZ
Přidáno: 24.07. 2010

Zas nějaký užitečný tutoriál, bezvadný... ;)

Trvalý odkaz

Velkej Chytrák
Copyright (c) 2001-2010