Cesty hledání na základě mřížky | hyperPad Documentation

Loading...

Logo

V tomto tutoriálu vytvoříme simulaci hledání cesty založenou na dvourozměrném poli. To nám poskytne základní představu o vytváření aktivit pro hledání cesty ve hrách. Zobrazíme mřížku pomocí prázdných čtvercových objektů jako dlaždic a kulatého objektu jako našeho avatara, který se může pohybovat v této oblasti mřížky podle našeho povelu.

Video_2019-07-30__2_32_01_PM.gif

I. Nastavení objektů

V našem projektu použijeme pouze čtyři objekty. Náš zelený avatar, modrou dlaždici, bílou překážku a označení mřížky pro nastavení a vizualizaci naší mřížky.

Photo_2019-07-29__1_50_10_PM.png

Avatar

Náš avatar je prázdný objekt, který má měřítko x a y 50 %. Nastavte kolizi na kulatý tvar, aby vypadal jako obrázek níže. Tento objekt bude mít tři předdefinované atributy: na dlaždici, předchozí dlaždice a cílová dlaždice. Nastavte výchozí hodnoty těchto atributů na nulu, aby neměly hodnotu null, když se je pokusíme později načíst.

Photo_2019-07-29__1_53_38_PM.png

Objekt dlaždice

Vytvořte další prázdný objekt, který bude použit k vizualizaci dlaždic v naší mřížce. Jeho měřítko je také 50 % a má pouze jeden předdefinovaný atribut: na dlaždici. Nastavte i tuto hodnotu na nulu.

Photo_2019-07-29__1_53_51_PM.png

Objekt překážka

Vytvořte další prázdný objekt, který bude sloužit jako překážky v naší mřížce. Je to bílý prázdný objekt s měřítkem 40 %. Náš avatar nebude moci projít dlaždicí, na kterou je položena překážka.

Označení mřížky

To je jen označení, které bude mít chování, které umožní nastavení a vizualizaci naší mřížky. Má předdefinované atributy: start x s hodnotou 4 a start y s hodnotou 3. Tyto hodnoty jsou offsety, které se použijí jako referenční body při umisťování našich dlaždic tak, aby naše mřížka byla úhledně umístěna na střed.

Photo_2019-07-29__1_56_01_PM.png

Předdefinované atributy Ava/ Tile:

Definujeme dlaždici zde jako dvourozměrné pole, které bude mít x a y hodnotu na základě naší mřížky.

  • na dlaždici - to je hodnota dlaždice, na které se náš objekt aktuálně nachází v naší mřížce
  • předchozí dlaždice - dlaždice, kterou náš avatar dříve prošel
  • cílová dlaždice - dlaždice, na kterou náš avatar zamíří

II. Nastavení mřížky

Uvnitř označení mřížky definujeme naše dvourozměrné pole a generování naší mřížky. V tomto objektu jsou 2 hlavní klíčové body: nastavení pole a vizualizace pole. Nejprve udělejme balíček pro nastavení pole.

Photo_2019-07-29__3_05_10_PM.png

Nastavit pole - balíček

Nejprve je třeba vytvořit prázdné pole s názvem 'Grid'. Toto pole bude obsahovat naše dvourozměrné pole. Budeme mít kontejner s názvem 'x řádkový počet', který má hodnotu 24, a další prázdné pole s názvem 'y řádek', které má 18 prázdných hodnot.

Photo_2019-07-29__1_55_28_PM.png

První chování v našem balíčku je smyčka s počtem opakování 'x řádkový počet'. Na každém kroku této smyčky přidáme prázdný y řádek do 'Grid pole'. Tímto vytvoříme pole uvnitř pole s dimenzí 24x18.

Všimněte si, že jsme na začátek našeho balíčku připojili neaktivní komentář, abychom negovali automatické spuštění tohoto kořenového chování. Kořenové chování je chování, které se nespouští na základě žádné události a je umístěno otevřeně v uživatelském rozhraní.

Vizualizovat mřížku - balíček

Hlavní věc, kterou zde uděláme, je procházet každou hodnotu našeho 'Grid pole' a generovat objekt dlaždice. Také přidáme podmínku do naší smyčky, která povolí vytvoření bílé překážky na vrcholu objektu dlaždice.

Photo_2019-07-29__3_56_37_PM.png

Nejprve získáme počet prvků našeho 'y řádkového pole', hodnotu atributu 'start x' tohoto objektu a 'start y'.

Vytvořte smyčku, která má opakování 'x řádkový počet', a pro každý krok této smyčky přidáme indexovou hodnotu této smyčky a hodnotu atributu 'start x'. To povede k absolutní x pozici, kterou použijeme k pozicování vytvořených dlaždic později. Další je 'y řádková smyčka', která má opakování 'y řádkový počet'. Pro každý krok této smyčky přidáme indexovou hodnotu této smyčky a hodnotu atributu 'start y', což nyní povede k absolutní y pozici.

Photo_2019-07-29__4_03_51_PM.png

Po přidání hodnot pod 'y řádkovou smyčku' je třeba generovat modrý objekt. Nastavte počet živých objektů na 999, protože jich budeme potřebovat hodně pro naši mřížku, a také s trváním 0. Poté přesuněte tento vytvořený objekt na x bod s hodnotou z přidaných hodnot smyčky x a y bod s hodnotou z přidaných hodnot smyčky y.

Dále přidáme pole se 2 prázdnými hodnotami nazvanými 'Na dlaždici', které použijeme pouze jako zástupce pole. Po přesunutí objektu dlaždice upravíme pole 'Na dlaždici' nahrazením jeho hodnoty na indexu 0 hodnotou 'x řádkové smyčky'. Poté přidejte další úpravu pole, která nahradí hodnotu na indexu 1 hodnotou 'y řádkové indexy'. To jsou souřadnice x a y naší mřížky, které bude mít objekt jako atribut 'na dlaždici'.

Nyní nastavte atribut vytvořeného objektu s dynamickým klíčem 'na dlaždici' a hodnotou 'Na dlaždici - pole'.

Photo_2019-07-29__4_41_55_PM.png

Stále pod y řádkovou smyčkou je podmínka pro vytvoření bílé objektové překážky. Budeme mít šanci 2 z 5 na provedení tohoto balíčku, což přidá do randomizace naší mřížky. Poté zaznamenáme hodnotu 1 na souřadnicích x a y v našem 'Grid' poli, která nám říká, že ta souřadnice má vytvořenou překážku.

Nejdříve vygenerujeme náhodné číslo od 1 do 5. Pokud je toto číslo menší nebo rovno 2, vytvoříme překážku. Nastavte její počet živých objektů na 999 a přesuňte ten objekt na stejný bod jako modrou dlaždici, kterou jsme vytvořili dříve, také s trváním 0.

Dále uložte informace o tom, že tato souřadnice byla obsazena překážkou, pokud byla vytvořena. To uděláme zaznamenáním té souřadnice hodnotou 1. Nejdříve zjistíme hodnotu na indexu 'y řádkové smyčky' v poli 'Grid'. Tato hodnota nám dá pole 'y row'. Tuto 'y row' upravíme nahrazením její hodnoty na indexu 'y řádkové smyčky' hodnotou 1, což je vyznačená hodnota. Protože tato úprava hodnoty pouze platí pro tuto hodnotu a ne pro pole 'Grid', musíme také upravit pole 'Grid'. Nahraďte hodnotu na indexu 'x row loop' v poli 'Grid' hodnotou 'modify y row - array'.

Když to zahrajete, mělo by to vypadat takto.

Photo_2019-07-29__4_45_18_PM.png

III. Na stisk dlaždice

Abychom mohli interagovat s mřížkou, budeme potřebovat balíček chování kdykoli stiskneme modrou dlaždici. První stisk způsobí, že se náš avatar objeví v naší mřížce, a každý další stisk po této události spustí jeho hledání cesty.

Uvnitř objektu dlaždice je balíček chování, který má 3 hlavní body: resetovat předchozí dlaždici našeho avatara, nastavit jeho na dlaždici/nastavit jeho cílovou dlaždici, a poté nastavit barevnou animaci pro vizualizaci události dotyku na obrazovce.

Photo_2019-07-29__5_00_44_PM.png

Nejdříve získáme atribut 'na dlaždici' objektu dlaždice. Nastavte atribut 'předchozí dlaždice' našeho avatara na 0. Náš avatar bude nastaven na vyhnutí se vracení na 'předchozí dlaždici', proto na každém stisku dlaždice resetujeme 'předchozí dlaždici'.

Další je získat atribut 'na dlaždici' našeho avatara. První podmínka if je, zda je hodnota 'na dlaždici' rovna nule. To znamená, že pokud se avatar dosud neobjevil, pak to bude pravda. Pokud je to pravda, pak nastavíme jeho atribut 'na dlaždici' na hodnotu atributu dlaždice objektu 'na dlaždici'. Poté přesuneme polohu našeho avatara tím, že získáme polohu objektu dlaždice a nastavíme jeho xy hodnoty na tento bod s trváním 0.

Pokud hodnota 'na dlaždici' není rovna nule, nastavíme atribut 'cílová dlaždice' našeho avatara na hodnotu atributu 'na dlaždici' objektu dlaždice. To znamená, že náš avatar se již nachází v naší mřížce, a pak můžeme provést balíček chování 'find path'. Tento balíček zatím nemáme, ale to vyřešíme po dokončení pozdější části tohoto tutoriálu pro balíček 'find path'.

Teď, když jsme správně nastavili našeho avatara na naši mřížku, musíme pouze vizualizovat tuto událost stisknutí. Nejdříve nechte kořenové chování 'get color', abyste získali jeho původní barvu. Poté, po události stisknutí, nastavíme barvu dlaždice na černou s trváním 0, poté se barva vrátí zpět na svou původní hodnotu s trváním 0,2.

Stisknutí modré dlaždice by mělo mít za následek toto.

Photo_2019-07-30__1_04_42_PM.png

IV. Spustit balíček Hledání cesty

Pro poslední část našeho tutoriálu provedeme algoritmus, který nám umožní najít nejbližší dlaždici, kterou náš avatar může použít k dosažení svého cíle. Tento balíček se bude opakovaně provádět pro každý krok dlaždice, na kterém náš avatar v mřížce pohybuje.

Nastavíme algoritmus uvnitř našeho objektu avatara, který bude mít tři hlavní body: hledání sousedních dlaždic, nalezení nejbližší sousední dlaždice a pohyb k této sousední dlaždici.

Photo_2019-07-29__5_39_25_PM.png

Nalezení sousedních dlaždic

V této části shromáždíme všechny sousední dlaždice, které může náš avatar projet. Zkontrolujeme jeho čtyři sousední dlaždice a zjistíme, zda na těchto dlaždicích není překážka nebo zda na ní byl dříve stoupen.

Photo_2019-07-29__5_40_24_PM.png

Nejdříve přidáme naše pole 'Sousední dlaždice'. Pole 'Směry' s 2 prázdnými hodnotami a čtyři směrová pole, které mají 2 hodnoty pro každé: S (0,1), J (0,-1), V (1,0), Z (-1,0).

První chování v našem balíčku je vymazat naše sousední dlaždice. Protože budeme tento balíček provádět opakovaně, musíme mít naše sesbírané 'sousední dlaždice' na začátku vyresetované. Další čtyři chování jsou úpravy pole 'Směry'. Nastavíme pole v 'Direction' čtyřikrát pomocí čtyř směrových polí, poté provedeme balíček níže. Děláme to, abychom vytvořili smyčku s různými hodnotami pole 'Direction' pokaždé.

Photo_2019-07-29__6_04_42_PM.png

Teď, když máme směr, musíme zkombinovat jejich hodnoty x a y s atributem 'na dlaždici' našeho avatara. Pak budeme schopni získat naši cílovou hodnotu v poli 'Grid', abychom zjistili, zda byla tato dlaždice označena jako překážka.

'Direction x' je hodnota pole 'Direction' na indexu 0, 'get on tile x' je hodnota 'get on tile' na indexu 0. Cílové x je přidaná hodnota 'direction x' a 'get on tile x'. Totéž platí pro y hodnoty, ale s cílovým indexem 1.

'Target y row' je hodnotová hodnota pole 'Grid' na indexu 'Target x'. Další bude 'Cílový index v y řádku' hodnota pole 'Target y row' na indexu 'Target y'. To jsou souřadnice v naší mřížce, které nám budou schopny říct, zda byly označené jako překážka.

Photo_2019-07-29__6_17_41_PM.png

Pokud je hodnota v 'cílovém indexu v y řádku' rovna 1, pak byla cílová dlaždice označena jako zablokovaná. Ale pokud ta hodnota není rovna 1, můžeme pokračovat v našem balíčku.

Protože naše Cílové x a y prošly našimi podmínkami, přidali jsme novou prázdnou dlaždici nazvanou 'Nová sousední dlaždice'. Ta uloží hodnoty Cílové x a y jako dlaždici. Nastavíme hodnotu cílové x na index 0 nového sousedního dlaždice a hodnotu cílové y na jeho index 1.

Nyní zjistěte atribut 'předchozí dlaždici' našeho avatara. Pokud 'předchozí dlaždice' není rovna 'nové sousední dlaždici', znamená to, že nová dlaždice nebyla dříve projetá. Potom můžeme bezpečně přidat 'Novou sousední dlaždici' do pole 'Sousední dlaždice' přidáním.

"Tento balíček můžete rozšířit vytvořením 8 směrových polí, které umožní vašemu avataru pohybovat se diagonálně."

Nalezení nejbližší sousední dlaždice

Teď, když máme sesbírané spolehlivé sousední dlaždice, musíme jen získat sousední dlaždici, která je nejblíže cílové dlaždici našeho avatara. Provádíme výpočet pomocí vzorce vzdálenosti, který spočítá vzdálenost mezi hodnotami x a y naší cílové dlaždice a sousedními dlaždicemi.

Ve tomto balíčku jsou dva hlavní body: inicializace proměnných pro výpočet a výpočet vzdáleností dlaždic uvnitř smyčky.

a. Inicializace proměnných

Nejdříve zjistíme počet prvků v našich sousedních dlaždicích. Poté získáme atribut 'cílové dlaždice' našeho avatara a získáme jeho x a y hodnoty. Přidáme 2 nové boxy: 'Min vzdálenost' a 'Index cílové dlaždice'. Nastavíme počáteční hodnotu 'Min vzdálenost' na 9999 a hodnotu 'Index cílové dlaždice' na 0. Minimální vzdálenost je nastavena na vysoké číslo, protože potřebujeme nejmenší vzdálenost od začátku. Index cílové dlaždice je náš referenční index v poli 'Sousední dlaždice', který má nejmenší vzdálenost k naší 'cílové dlaždici'.

Naším hlavním cílem zde je získat index dlaždice uvnitř našeho 'Sousedního dlaždice', který je nejblíže naší 'cílové dlaždice'.

Photo_2019-07-29__6_47_43_PM.png

b. Výpočet vzdálenosti dlaždic

V tomto balíčku provedeme výpočet uvnitř smyčky, kterou provedeme pro každou sousední dlaždici. Smyčka se opakuje podle 'sousedních dlaždicách' a získáme hodnotu dlaždice z pole 'Sousední dlaždice' pomocí indexu této smyčky.

Získejte x a y hodnoty té sousední dlaždice a poté získáme vzdálenost mezi naší 'cílovou dlaždicí' a 'sousední dlaždicí' pomocí tohoto vzorce:

vzdálenost = sqrt((x2 - x1)^2+(y2 - y1)^2)
x1 = Cílové x
x2 = Sousední x
y1 = Cílové y
y2 = Sousední y

Nejdříve odečteme jejich x a y hodnoty, vynásobíme je samotné pro získání jejich exponenciálních hodnot, přidáme tyto hodnoty a poté provedeme druhou odmocninu z přidaných hodnot, abychom získali hodnotu vzdálenosti.

Photo_2019-07-29__6_46_04_PM.png

Pokud je hodnota 'Vzdálenost' menší než hodnota boxu 'Min vzdálenost', pak nastavíme hodnotu 'cílového indexu dlaždice' na aktuální index smyčky, což je index naší vyhledané dlaždice v poli 'Sousední dlaždice'. Také nastavíme hodnotu boxu 'Min vzdálenost' s hodnotou 'Vzdálenost', abychom ji porovnali s další dlaždicí v naší smyčce.

Po skončení smyčky jsme porovnali každou z našich sousedních dlaždic a získali indexovou hodnotu sousední dlaždice, která je nejbližší k naší 'cílové dlaždice'.

Pohyb k sousední dlaždici

V tomto posledním balíčku našeho tutoriálu přesuneme našeho avatara na nejbližší sousední dlaždici a znovu provedeme celý balíček 'Hledání cesty', pokud jsme se dosud nepřesunuli na naši 'cílovou dlaždici'.

Photo_2019-07-30__1_23_31_PM.png

Nejdříve zkontrolujeme, zda je náš 'Počet sousedních dlaždic' větší než 0. To zajistí, že se přesuneme, pouze pokud jsme získali alespoň důvěryhodnou sousední dlaždici.

Poté 'Získáváme nejbližší dlaždici' pomocí hodnoty našeho 'cílového indexu dlaždice' z předchozího balíčku, abychom získali hodnotu pole 'Sousední dlaždice'.

Abychom získali přesný bod, kam se náš avatar posune, budeme potřebovat x a y hodnoty té dlaždice, a také hodnoty atributů 'start x' a 'start y' označení naší 'Grid'. Nyní přidáme hodnotu x naše nejbližší dlaždice a hodnotu 'start x', a také totéž s hodnotami y. Tyto přidané hodnoty jsou naše cílové x a y body, kam se náš avatar přesune.

Předtím, než se přesuneme na tento bod, nastavíme 'předchozí dlaždici' našeho avatara na jeho aktuální hodnotu atributu 'na dlaždici'. Tuto hodnotu 'na dlaždici' můžeme získat z předchozích balíčků. Poté přesuneme našeho avatara na naše cílové body s trváním 0,2.

Po dokončení chování 'Pohyb na bod' nyní nastavíme hodnotu atributu 'na dlaždici' našeho avatara na hodnotu pole 'Získat nejbližší dlaždici'. Pokud hodnota pole 'Získat nejbližší dlaždici' není rovna našemu 'cílové dlaždici', pak spustíme balíček 'Hledání cesty', čímž znovu provedeme celý balíček. Hodnota atributu 'cílová dlaždice' může být získána z předchozího balíčku.

Stisknutím na jakoukoli modrou dlaždici a po objevení našeho avatara na mřížce bude vykonán balíček 'Hledání cesty'. To spustí pohyb avatara z dlaždice na dlaždici.

Závěr

V tomto tutoriálu jsme se naučili vytvářet aktivitu hledání cesty pomocí pole, které jsme nazvali 'Grid', což se používá k ukládání informací o tom, zda je ta dlaždice obsazena nebo ne. Můžete tuto myšlenku rozšířit tím, že použijete ID objektů jako úložné informace namísto pouhého čísla pro naše pole 'Grid'. Tím získáme spolehlivější informace, které můžeme použít při hledání cesty. Například můžeme získat atributy toho ID objektu, abychom zjistili, zda je aktivní nebo ne, zda nám umožní vstoupit na jeho dlaždici nebo ne.

Tento tutoriál poskytl pouze základní myšlenku za hledáním cesty. Jedinou nevýhodou je, že nevytváří nejkratší možnou cestu k cílové dlaždici a pouze kontroluje její aktuální sousední dlaždice. To může vést k cyklu pohybu, který nikam nevede.

To však může být vyřešeno rozšířením našeho algoritmu pro hledání cesty. Můžeme to udělat tak, že budeme opakovat naše sesbírané sousední dlaždice, abychom získali jejich sousední dlaždice, dokud nenajdeme naši cílovou dlaždici. Každá nalezená nejbližší sousední dlaždice bude přidána do seznamu. Abychom zabránili nekonečnému cyklu, přidejte podmínku, že pokud byla ta sousední dlaždice již zkontrolována, nebude přidána do našeho seznamu. Také přidejte maximální limit na počty iterací, abyste zabránili nekonečné smyčce způsobené cílovou dlaždicí, pokud je příliš daleko nebo není nalezena. Jakmile tato iterace najde cílovou dlaždici, ukončíme tuto iteraci a začneme přesouvat avatara z dlaždice na dlaždici podle seznamu dlaždic.