Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Bludiště za pár minut

Zabýval jsem se myšlenkou, jak v GM vytvořit opravdu velké bludiště, aniž bych musel klikat stovky zdí ručně. Protože výsledek vypadá všeobecně použitelně, tak se s vámi o něj podělím. K pochopení byste měli být schopni psát kód v GML na úrovni přípravy skriptů a bylo by dobré rozumět vykreslování do surface.

Napadlo mě, že nejrychlejší způsob, jak editovat zdi je použít sprite. Je to jednoduché a extrémně účinné. Není totiž třeba psát editor a formát dat je běžný obrázek (např. png ). Stačí namalovat malý obrázek, kde jakýkoli černý pixel bude bod zdi. Obrázek by měl být maličký. Já jsem použil 123x92 a výsledné bludiště má velikost 6396x4784! Pak potřebuji blok zdi. Já jsem si vyrobil sadu obrázků, ale stačí jakákoli výplň.

Postup je celkem jednoduchý. Sprite se namaluje klidně přímo v GM editoru. V objektu bez obrázku se v eventu create nastaví velikosti a spustí se skript. Ten vytvoří surface, do něj vykreslí sprite a bere bod po bodu. Porovná barvu bodu s tabulkou barev podle které pak určí, jestli má v dané pozici vytvořit instanci objektu zdi, případně cokoli jiného.

Není těžké to napsat, nicméně uvádím, jak jsem to splácal já:

Kód skriptu:

// usage: instant_maze(object); // musí mít nadefinovány potřebné hodnoty

with (argument0)
{
//******************************************************
/*                    draw           instance create
 POSTUP:       sprite  ->    surface       ->         room */


/* velikostí sprite ( krát násobitel mřížky ) je dána i velikost plochy v místnosti, kterou placement pokryje */
/* surface i sprite má stejný rozmer jako room dělený násobitelem */
plocha=surface_create(rozmer_mrizky_x,rozmer_mrizky_y);
surface_set_target(plocha);
draw_rectangle_color(0,0,rozmer_mrizky_x-1,rozmer_mrizky_y-1,c_white,c_white,c_white,c_white,0); //vyčištění surface do bílé barvy
draw_sprite(bl_plan,0,0,0); //sprite musí mít vlastní center v 0,0 ( levý horní roh ) jinak vyjde mimo a dojde k ořezu+posunu

for(ix=0;ix<rozmer_mrizky_x;ix+=1)
{
for(iy=0;iy<rozmer_mrizky_y;iy+=1)
{
if is_between(psat_od_x,ix,psat_do_x) & is_between(psat_od_y,iy,psat_do_y)
{
barva=surface_getpixel(plocha,ix,iy); //získat barvu pixelu
for(ic=c_table_min;ic<=c_table_max;ic+=1)
{
if barva==c_table[ic,1] { instance_create(kam_psat_x+(ix*nasobitel_mrizky),kam_psat_y+(iy*nasobitel_mrizky),c_table[ic,2]); }
}
}
}
}
//vrátit kreslení do obrazu a zlikvidovat surface
surface_reset_target();
surface_free(plocha);
//-
}

/*   VZOREK ZADÁNÍ HODNOT
//ruční vstupy
bl_plan=bludiste;  //sprite určující vzhled chodeb ( používat jen malý sprite - 123x92 je pak 52x větší )
rozmer_mrizky_x=sprite_get_width(bl_plan);
rozmer_mrizky_y=sprite_get_height(bl_plan);
nasobitel_mrizky=52;
//---
kam_psat_x=0*nasobitel_mrizky; //posun všech vytvořených instancí o konstantu
kam_psat_y=0*nasobitel_mrizky; //tentokrát už ale jde o velikosti v ploše místnosti, tedy vynásobené násobitelem mřížky
//---
psat_od_x=0; //reagovat jen na daný výřez z plochy
psat_od_y=0;
psat_do_x=rozmer_mrizky_x; //rozmer mrizky je full hodnota
psat_do_y=rozmer_mrizky_y;
//konec: ruční vstupy */
/* ********* OBJECT TABLE of MATCH COLOR ************** */
/*
c_table_min=1; c_table_max=3; //must be consistent in this range

c_table[1,1]=c_black;                        c_table[1,2]=wall;
c_table[2,1]=c_blue;                         c_table[2,2]=leader;
c_table[3,1]=make_color_rgb(0,255,0);        c_table[3,2]=stonoha;
*/

Je tam použit primitivní skript is_between, který vypadá takto:

//arg0<=arg1<=arg2

return ((argument0<=argument1)&&(argument1<=argument2));

V balíčku ke stažení je exe file, kde je vidět bludiště vytvořené tímto způsobem. Všechny prvky bludiště byly nasázeny zmíněným skriptem. V bludišti je figurka čaroděje se kterou jde pohybovat šipkama. Jsou tam taky dvě potvůrky, které ale nic nedělají. Bludiště nemá žádný cíl, je to jen demonstrace, jak to vypadá a jak to běhá. Pro urychlení používám aktivaci a deaktivaci instancí popsanou poměrně obsáhle v helpu Game Makeru. Pokud chcete použít tyto moje skripty, jsou volně k dispozici a jejich kopie se nacházejí v přiloženém raru, takže stačí použít load. Z dolní části skriptu můžete pak použít příklad nastavení parametrů. Parametry musí být nastaveny před spuštěním skriptu. Předává se pak objekt, který dané parametry lokálně obsahuje.

Možná jsem to napsal složitě, ale je to jednoduché. Prostě to udělá bludiště přímo podle bodů ve sprite, aby člověk nemusel klikat zdi ručně.

Silně doporučuji napsat si to po svém a rozhodně nepoužívejte skript, u kterého plně nechápete, co přesně dělá.


 

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 315x (3.71 MB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker

 

Všechny články v sekci
GameMaker - Bludišťovky
Článek pro vás napsal TomBen
Avatar
Uživatelské hodnocení:
3 hlasů
-
Aktivity