8. června 2016

Instance nearest list ( rozšíření funkcí GML - script )

Instance nearest list

V principu poměrně jednoduchý skript přidá do GML užitečnou funkci. Vytváří seznam instancí daného typu seřazený podle vzdálenosti od instance, ve které je spuštěn. Možná to zní složitě, ale není.

Příklad:
Mějme jednu instanci ( výskyt ) objektu Hráč a několik instancí objektu Nepřítel. Hráč má víceranný bombomet a umí střílet na několik nepřátel najednou. Když použiji standardní funkci GML instance_nearest, vrátí se mi id nejbližšího nepřítele. Ale já jich potřebuji víc. Takže právě skript instance_nearest_list mi je najde a seřadí. Vrací seznam jejich id jako datovou strukturu ds_list. Prvek 0 je nejbližší, prvek 1 druhý nejbližší a tak dále.

Výpis skriptu:
///instance_nearest_list(x,y,obj,[limit]);

var _DLS=ds_list_create();
var _ids;


while(instance_exists(argument2))
{

 _ids=instance_nearest(argument0,argument1,argument2);
 ds_list_add(_DLS,_ids);
 instance_deactivate_object(_ids);
 if argument_count>3 { if ds_list_size(_DLS)>(argument3-1) break; }
}

for(i=0;i<ds_list_size(_DLS);i++)
 {  instance_activate_object(ds_list_find_value(_DLS,i));  }
return(_DLS);


! Pozor, je ds_list je nutné po použití odstranit z paměti pomocí ds_list_destroy. Datové struktury nezanikají při zániku instance, která je stvořila a tak by bez mazání brzy došla paměť, nezávisle na tom, kolik jí počítač má.

Jak se skript používá je vidět v ukázce, která je spolu se skriptem ke stažení > ZDE < včetně zdrojového kódu.

V ukázce lze "kreslit" myší instance, které natahují paprsky ( pomocí trianglefan ) k okolním instancím.
Podle různého nastavení ( klávesa TAB ) jde dosáhnout tekutý štětec nebo kreslit něčím, co vypadá jako kousky tangramu. Při větším počtu aktivních instancí ( okolo 1000 a víc ) to začíná být pomalé, ale kdyby se tím chtěl někdo zabývat, tak není problém přidat zapečení instancí do pozadí a také ukládání do png. Vzhledem k tomu, že instance se procházejí navzájem, je vidět, že je skript použitelně rychlý, pokud se použije rozumný limit procházení. Pokud potřebujeme pouze tři nejbližší instance, není potřeba hledat všechny. K tomu právě slouží volitený argument limit, který běžná funkce instance_nearest nemá.

Screenshoty z ukázky:


  

Žádné komentáře:

Okomentovat

Komentář vypovídá většinou o autorovi víc, než by byl jinak ochoten sdělit.