Bludiště za pár minut

Ostatní jazyky GameMaker Bludišťovky 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ženo 290x (3.71 MB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker

 

  Aktivity (1)

Článek pro vás napsal TomBen
Avatar
-

Jak se ti líbí článek?
Celkem (3 hlasů) :
3.666673.666673.666673.66667 3.66667


 


Miniatura
Všechny články v sekci
GameMaker - Bludišťovky

 

 

Komentáře

Avatar
filip.studeny:

Já to tam vypíšu a nejde mi to prosím o radu :(

 
Odpovědět 10.11.2012 20:41
Avatar
TomBen
Redaktor
Avatar
Odpovídá na filip.studeny
TomBen:

Když napíšeš, jak přesně jsi postupoval, tak ti najdu, co máš špatně.
Musíš to ale trochu umět použít, jinak to nepůjde nikdy.
Je to návod, není to určeno k opisování.

Odpovědět 11.11.2012 14:15
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
T0xice
Člen
Avatar
T0xice:

Bludiště nejsou moc oblíbené hry :(

 
Odpovědět 26.6.2013 15:50
Avatar
TomBen
Redaktor
Avatar
Odpovídá na T0xice
TomBen:

Každý má rád něco jiného. Výše uvedený princip se dá použít
na jakýkoliv typ hry s pohledem shora a větší mapou.

Odpovědět 26.6.2013 15:57
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
T0xice
Člen
Avatar
T0xice:

Asi tak :D

 
Odpovědět 26.6.2013 16:00
Avatar
polemes
Redaktor
Avatar
polemes:

Dobra hra (docela ;) )

Odpovědět  ±0 23.5.2015 21:20
5 + 5 = 1010
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.